For all encoders and all decoders except MPEG-4 the unquantize functions to use don't change at all and therefore needn't be kept in the context. So discard them after setting them; for MPEG-4, the functions get assigned on a per-frame basis. Decoders not using any unquantize functions (H.261, MPEG-1/2) as well as decoders that only call ff_mpv_reconstruct_mb() through error resilience (RV30/40, the VC-1 family) don't have the remaining pointers set at all.
Showing the changes to libavcodec (15 of 15 files). Show all
Unified · Split
| @@ -46,12 +46,12 @@ void ff_dct_unquantize_h263_inter_neon(MpegEncContext *s, int16_t *block, · 45 unmodified lines | |||
| 46 | void ff_dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block, | 46 | void ff_dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block, |
| 47 | int n, int qscale); | 47 | int n, int qscale); |
| 48 | 48 | ||
| 49 | av_cold void ff_mpv_common_init_arm(MpegEncContext *s) | 49 | av_cold void ff_mpv_unquantize_init_arm(MPVUnquantDSPContext *s, int bitexact) |
| 50 | { | 50 | { |
| 51 | int cpu_flags = av_get_cpu_flags(); | 51 | int cpu_flags = av_get_cpu_flags(); |
| 52 | 52 | ||
| 53 | if (have_armv5te(cpu_flags)) | 53 | if (have_armv5te(cpu_flags)) |
| 54 | ff_mpv_common_init_armv5te(s); | 54 | ff_mpv_unquantize_init_armv5te(s); |
| 55 | 55 | ||
| 56 | if (have_neon(cpu_flags)) { | 56 | if (have_neon(cpu_flags)) { |
| 57 | s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_neon; | 57 | s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_neon; |
| @@ -19,8 +19,8 @@ · 18 unmodified lines | |||
| 19 | #ifndef AVCODEC_ARM_MPEGVIDEO_ARM_H | 19 | #ifndef AVCODEC_ARM_MPEGVIDEO_ARM_H |
| 20 | #define AVCODEC_ARM_MPEGVIDEO_ARM_H | 20 | #define AVCODEC_ARM_MPEGVIDEO_ARM_H |
| 21 | 21 | ||
| 22 | #include "libavcodec/mpegvideo.h" | 22 | #include "libavcodec/mpegvideo_unquantize.h" |
| 23 | 23 | ||
| 24 | void ff_mpv_common_init_armv5te(MpegEncContext *s); | 24 | void ff_mpv_unquantize_init_armv5te(MPVUnquantDSPContext *s); |
| 25 | 25 | ||
| 26 | #endif /* AVCODEC_ARM_MPEGVIDEO_ARM_H */ | 26 | #endif /* AVCODEC_ARM_MPEGVIDEO_ARM_H */ |
| @@ -95,7 +95,7 @@ static void dct_unquantize_h263_inter_armv5te(MpegEncContext *s, · 94 unmodified lines | |||
| 95 | ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1); | 95 | ff_dct_unquantize_h263_armv5te(block, qmul, qadd, nCoeffs + 1); |
| 96 | } | 96 | } |
| 97 | 97 | ||
| 98 | av_cold void ff_mpv_common_init_armv5te(MpegEncContext *s) | 98 | av_cold void ff_mpv_unquantize_init_armv5te(MPVUnquantDSPContext *s) |
| 99 | { | 99 | { |
| 100 | s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_armv5te; | 100 | s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_armv5te; |
| 101 | s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_armv5te; | 101 | s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_armv5te; |
| @@ -44,6 +44,7 @@ · 43 unmodified lines | |||
| 44 | #include "mpegvideo.h" | 44 | #include "mpegvideo.h" |
| 45 | #include "mpegvideodata.h" | 45 | #include "mpegvideodata.h" |
| 46 | #include "mpegvideodec.h" | 46 | #include "mpegvideodec.h" |
| 47 | #include "mpegvideo_unquantize.h" | ||
| 47 | #include "msmpeg4dec.h" | 48 | #include "msmpeg4dec.h" |
| 48 | #include "thread.h" | 49 | #include "thread.h" |
| 49 | #include "wmv2dec.h" | 50 | #include "wmv2dec.h" |
| @@ -90,6 +91,7 @@ static enum AVPixelFormat h263_get_format(AVCodecContext *avctx) · 40 unmodified lines | |||
| 90 | av_cold int ff_h263_decode_init(AVCodecContext *avctx) | 91 | av_cold int ff_h263_decode_init(AVCodecContext *avctx) |
| 91 | { | 92 | { |
| 92 | MpegEncContext *s = avctx->priv_data; | 93 | MpegEncContext *s = avctx->priv_data; |
| 94 | MPVUnquantDSPContext unquant_dsp_ctx; | ||
| 93 | int ret; | 95 | int ret; |
| 94 | 96 | ||
| 95 | s->out_format = FMT_H263; | 97 | s->out_format = FMT_H263; |
| @@ -105,10 +107,12 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) · 9 unmodified lines | |||
| 105 | s->y_dc_scale_table = | 107 | s->y_dc_scale_table = |
| 106 | s->c_dc_scale_table = ff_mpeg1_dc_scale_table; | 108 | s->c_dc_scale_table = ff_mpeg1_dc_scale_table; |
| 107 | 109 | ||
| 110 | ff_mpv_unquantize_init(&unquant_dsp_ctx, | ||
| 111 | avctx->flags & AV_CODEC_FLAG_BITEXACT, 0); | ||
| 108 | // dct_unquantize defaults for H.263; | 112 | // dct_unquantize defaults for H.263; |
| 109 | // they might change on a per-frame basis for MPEG-4. | 113 | // they might change on a per-frame basis for MPEG-4. |
| 110 | s->dct_unquantize_intra = s->dct_unquantize_h263_intra; | 114 | s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_h263_intra; |
| 111 | s->dct_unquantize_inter = s->dct_unquantize_h263_inter; | 115 | s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_h263_inter; |
| 112 | 116 | ||
| 113 | /* select sub codec */ | 117 | /* select sub codec */ |
| 114 | switch (avctx->codec->id) { | 118 | switch (avctx->codec->id) { |
| @@ -117,9 +121,6 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) · 2 unmodified lines | |||
| 117 | avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; | 121 | avctx->chroma_sample_location = AVCHROMA_LOC_CENTER; |
| 118 | break; | 122 | break; |
| 119 | case AV_CODEC_ID_MPEG4: | 123 | case AV_CODEC_ID_MPEG4: |
| 120 | // dct_unquantize_inter is only used with MPEG-2 quantizers, | ||
| 121 | // so we can already set dct_unquantize_inter here once and for all. | ||
| 122 | s->dct_unquantize_inter = s->dct_unquantize_mpeg2_inter; | ||
| 123 | break; | 124 | break; |
| 124 | case AV_CODEC_ID_MSMPEG4V1: | 125 | case AV_CODEC_ID_MSMPEG4V1: |
| 125 | s->h263_pred = 1; | 126 | s->h263_pred = 1; |
| @@ -508,11 +509,6 @@ retry: · 382 unmodified lines | |||
| 508 | goto retry; | 509 | goto retry; |
| 509 | if (s->studio_profile != (s->idsp.idct == NULL)) | 510 | if (s->studio_profile != (s->idsp.idct == NULL)) |
| 510 | ff_mpv_idct_init(s); | 511 | ff_mpv_idct_init(s); |
| 511 | if (s->mpeg_quant) { | ||
| 512 | s->dct_unquantize_intra = s->dct_unquantize_mpeg2_intra; | ||
| 513 | } else { | ||
| 514 | s->dct_unquantize_intra = s->dct_unquantize_h263_intra; | ||
| 515 | } | ||
| 516 | } | 512 | } |
| 517 | 513 | ||
| 518 | /* After H.263 & MPEG-4 header decode we have the height, width, | 514 | /* After H.263 & MPEG-4 header decode we have the height, width, |
| @@ -24,7 +24,8 @@ · 23 unmodified lines | |||
| 24 | #include "h263dsp_mips.h" | 24 | #include "h263dsp_mips.h" |
| 25 | #include "mpegvideo_mips.h" | 25 | #include "mpegvideo_mips.h" |
| 26 | 26 | ||
| 27 | av_cold void ff_mpv_common_init_mips(MpegEncContext *s) | 27 | av_cold void ff_mpv_unquantize_init_mips(MPVUnquantDSPContext *s, |
| 28 | int bitexact, int q_scale_type) | ||
| 28 | { | 29 | { |
| 29 | int cpu_flags = av_get_cpu_flags(); | 30 | int cpu_flags = av_get_cpu_flags(); |
| 30 | 31 | ||
| @@ -34,15 +35,15 @@ av_cold void ff_mpv_common_init_mips(MpegEncContext *s) · 3 unmodified lines | |||
| 34 | s->dct_unquantize_mpeg1_intra = ff_dct_unquantize_mpeg1_intra_mmi; | 35 | s->dct_unquantize_mpeg1_intra = ff_dct_unquantize_mpeg1_intra_mmi; |
| 35 | s->dct_unquantize_mpeg1_inter = ff_dct_unquantize_mpeg1_inter_mmi; | 36 | s->dct_unquantize_mpeg1_inter = ff_dct_unquantize_mpeg1_inter_mmi; |
| 36 | 37 | ||
| 37 | if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT)) | 38 | if (!bitexact) |
| 38 | if (!s->q_scale_type) | 39 | if (!q_scale_type) |
| 39 | s->dct_unquantize_mpeg2_intra = ff_dct_unquantize_mpeg2_intra_mmi; | 40 | s->dct_unquantize_mpeg2_intra = ff_dct_unquantize_mpeg2_intra_mmi; |
| 40 | } | 41 | } |
| 41 | 42 | ||
| 42 | if (have_msa(cpu_flags)) { | 43 | if (have_msa(cpu_flags)) { |
| 43 | s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_msa; | 44 | s->dct_unquantize_h263_intra = ff_dct_unquantize_h263_intra_msa; |
| 44 | s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_msa; | 45 | s->dct_unquantize_h263_inter = ff_dct_unquantize_h263_inter_msa; |
| 45 | if (!s->q_scale_type) | 46 | if (!q_scale_type) |
| 46 | s->dct_unquantize_mpeg2_inter = ff_dct_unquantize_mpeg2_inter_msa; | 47 | s->dct_unquantize_mpeg2_inter = ff_dct_unquantize_mpeg2_inter_msa; |
| 47 | } | 48 | } |
| 48 | } | 49 | } |
| @@ -35,6 +35,7 @@ · 34 unmodified lines | |||
| 35 | #include "mpegvideo.h" | 35 | #include "mpegvideo.h" |
| 36 | #include "mpegvideodata.h" | 36 | #include "mpegvideodata.h" |
| 37 | #include "mpegvideodec.h" | 37 | #include "mpegvideodec.h" |
| 38 | #include "mpegvideo_unquantize.h" | ||
| 38 | #include "mpeg4video.h" | 39 | #include "mpeg4video.h" |
| 39 | #include "mpeg4videodata.h" | 40 | #include "mpeg4videodata.h" |
| 40 | #include "mpeg4videodec.h" | 41 | #include "mpeg4videodec.h" |
| @@ -3390,6 +3391,9 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb, · 3349 unmodified lines | |||
| 3390 | } | 3391 | } |
| 3391 | } | 3392 | } |
| 3392 | 3393 | ||
| 3394 | s->dct_unquantize_intra = s->mpeg_quant ? ctx->dct_unquantize_mpeg2_intra | ||
| 3395 | : ctx->dct_unquantize_h263_intra; | ||
| 3396 | |||
| 3393 | end: | 3397 | end: |
| 3394 | /* detect buggy encoders which don't set the low_delay flag | 3398 | /* detect buggy encoders which don't set the low_delay flag |
| 3395 | * (divx4/xvid/opendivx). Note we cannot detect divx5 without B-frames | 3399 | * (divx4/xvid/opendivx). Note we cannot detect divx5 without B-frames |
| @@ -3862,6 +3866,7 @@ static av_cold int decode_init(AVCodecContext *avctx) · 466 unmodified lines | |||
| 3862 | static AVOnce init_static_once = AV_ONCE_INIT; | 3866 | static AVOnce init_static_once = AV_ONCE_INIT; |
| 3863 | Mpeg4DecContext *ctx = avctx->priv_data; | 3867 | Mpeg4DecContext *ctx = avctx->priv_data; |
| 3864 | MpegEncContext *s = &ctx->m; | 3868 | MpegEncContext *s = &ctx->m; |
| 3869 | MPVUnquantDSPContext unquant_dsp_ctx; | ||
| 3865 | int ret; | 3870 | int ret; |
| 3866 | 3871 | ||
| 3867 | ctx->divx_version = | 3872 | ctx->divx_version = |
| @@ -3872,6 +3877,15 @@ static av_cold int decode_init(AVCodecContext *avctx) · 4 unmodified lines | |||
| 3872 | if ((ret = ff_h263_decode_init(avctx)) < 0) | 3877 | if ((ret = ff_h263_decode_init(avctx)) < 0) |
| 3873 | return ret; | 3878 | return ret; |
| 3874 | 3879 | ||
| 3880 | ff_mpv_unquantize_init(&unquant_dsp_ctx, | ||
| 3881 | avctx->flags & AV_CODEC_FLAG_BITEXACT, 0); | ||
| 3882 | |||
| 3883 | ctx->dct_unquantize_h263_intra = unquant_dsp_ctx.dct_unquantize_h263_intra; | ||
| 3884 | ctx->dct_unquantize_mpeg2_intra = unquant_dsp_ctx.dct_unquantize_mpeg2_intra; | ||
| 3885 | // dct_unquantize_inter is only used with MPEG-2 quantizers, | ||
| 3886 | // so we can already set dct_unquantize_inter here once and for all. | ||
| 3887 | s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg2_inter; | ||
| 3888 | |||
| 3875 | s->h263_pred = 1; | 3889 | s->h263_pred = 1; |
| 3876 | s->low_delay = 0; /* default, might be overridden in the vol header during header parsing */ | 3890 | s->low_delay = 0; /* default, might be overridden in the vol header during header parsing */ |
| 3877 | s->decode_mb = mpeg4_decode_mb; | 3891 | s->decode_mb = mpeg4_decode_mb; |
| @@ -88,6 +88,11 @@ typedef struct Mpeg4DecContext { · 87 unmodified lines | |||
| 88 | 88 | ||
| 89 | Mpeg4VideoDSPContext mdsp; | 89 | Mpeg4VideoDSPContext mdsp; |
| 90 | 90 | ||
| 91 | void (*dct_unquantize_mpeg2_intra)(MpegEncContext *s, | ||
| 92 | int16_t *block, int n, int qscale); | ||
| 93 | void (*dct_unquantize_h263_intra)(MpegEncContext *s, | ||
| 94 | int16_t *block, int n, int qscale); | ||
| 95 | |||
| 91 | DECLARE_ALIGNED(8, int32_t, block32)[12][64]; | 96 | DECLARE_ALIGNED(8, int32_t, block32)[12][64]; |
| 92 | // 0 = DCT, 1 = DPCM top to bottom scan, -1 = DPCM bottom to top scan | 97 | // 0 = DCT, 1 = DPCM top to bottom scan, -1 = DPCM bottom to top scan |
| 93 | int dpcm_direction; | 98 | int dpcm_direction; |
| @@ -112,8 +112,6 @@ av_cold void ff_mpv_idct_init(MpegEncContext *s) · 111 unmodified lines | |||
| 112 | s->idsp.idct_permutation); | 112 | s->idsp.idct_permutation); |
| 113 | ff_permute_scantable(s->permutated_intra_v_scantable, ff_alternate_vertical_scan, | 113 | ff_permute_scantable(s->permutated_intra_v_scantable, ff_alternate_vertical_scan, |
| 114 | s->idsp.idct_permutation); | 114 | s->idsp.idct_permutation); |
| 115 | |||
| 116 | ff_mpv_unquantize_init(s); | ||
| 117 | } | 115 | } |
| 118 | 116 | ||
| 119 | static av_cold int init_duplicate_context(MpegEncContext *s) | 117 | static av_cold int init_duplicate_context(MpegEncContext *s) |
| @@ -326,18 +326,6 @@ typedef struct MpegEncContext { · 325 unmodified lines | |||
| 326 | #define SLICE_END -2 ///<end marker found | 326 | #define SLICE_END -2 ///<end marker found |
| 327 | #define SLICE_NOEND -3 ///<no end marker or error found but mb count exceeded | 327 | #define SLICE_NOEND -3 ///<no end marker or error found but mb count exceeded |
| 328 | 328 | ||
| 329 | void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s, | ||
| 330 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 331 | void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s, | ||
| 332 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 333 | void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s, | ||
| 334 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 335 | void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s, | ||
| 336 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 337 | void (*dct_unquantize_h263_intra)(struct MpegEncContext *s, | ||
| 338 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 339 | void (*dct_unquantize_h263_inter)(struct MpegEncContext *s, | ||
| 340 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 341 | void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both) | 329 | void (*dct_unquantize_intra)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both) |
| 342 | int16_t *block/*align 16*/, int n, int qscale); | 330 | int16_t *block/*align 16*/, int n, int qscale); |
| 343 | void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both) | 331 | void (*dct_unquantize_inter)(struct MpegEncContext *s, // unquantizer to use (MPEG-4 can use both) |
| @@ -60,6 +60,7 @@ · 59 unmodified lines | |||
| 60 | #include "mjpegenc_common.h" | 60 | #include "mjpegenc_common.h" |
| 61 | #include "mathops.h" | 61 | #include "mathops.h" |
| 62 | #include "mpegutils.h" | 62 | #include "mpegutils.h" |
| 63 | #include "mpegvideo_unquantize.h" | ||
| 63 | #include "mjpegenc.h" | 64 | #include "mjpegenc.h" |
| 64 | #include "speedhqenc.h" | 65 | #include "speedhqenc.h" |
| 65 | #include "msmpeg4enc.h" | 66 | #include "msmpeg4enc.h" |
| @@ -309,6 +310,25 @@ av_cold void ff_dct_encode_init(MPVEncContext *const s) · 243 unmodified lines | |||
| 309 | s->dct_quantize = dct_quantize_trellis_c; | 310 | s->dct_quantize = dct_quantize_trellis_c; |
| 310 | } | 311 | } |
| 311 | 312 | ||
| 313 | static av_cold void init_unquantize(MpegEncContext *const s, AVCodecContext *avctx) | ||
| 314 | { | ||
| 315 | MPVUnquantDSPContext unquant_dsp_ctx; | ||
| 316 | |||
| 317 | ff_mpv_unquantize_init(&unquant_dsp_ctx, | ||
| 318 | avctx->flags & AV_CODEC_FLAG_BITEXACT, s->q_scale_type); | ||
| 319 | |||
| 320 | if (s->mpeg_quant || s->codec_id == AV_CODEC_ID_MPEG2VIDEO) { | ||
| 321 | s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg2_intra; | ||
| 322 | s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg2_inter; | ||
| 323 | } else if (s->out_format == FMT_H263 || s->out_format == FMT_H261) { | ||
| 324 | s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_h263_intra; | ||
| 325 | s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_h263_inter; | ||
| 326 | } else { | ||
| 327 | s->dct_unquantize_intra = unquant_dsp_ctx.dct_unquantize_mpeg1_intra; | ||
| 328 | s->dct_unquantize_inter = unquant_dsp_ctx.dct_unquantize_mpeg1_inter; | ||
| 329 | } | ||
| 330 | } | ||
| 331 | |||
| 312 | static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx) | 332 | static av_cold int me_cmp_init(MPVMainEncContext *const m, AVCodecContext *avctx) |
| 313 | { | 333 | { |
| 314 | MPVEncContext *const s = &m->s; | 334 | MPVEncContext *const s = &m->s; |
| @@ -1012,6 +1032,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 697 unmodified lines | |||
| 1012 | * to the slice contexts, so we initialize various fields of it | 1032 | * to the slice contexts, so we initialize various fields of it |
| 1013 | * before calling ff_mpv_common_init(). */ | 1033 | * before calling ff_mpv_common_init(). */ |
| 1014 | ff_mpv_idct_init(&s->c); | 1034 | ff_mpv_idct_init(&s->c); |
| 1035 | init_unquantize(&s->c, avctx); | ||
| 1015 | ff_fdctdsp_init(&s->fdsp, avctx); | 1036 | ff_fdctdsp_init(&s->fdsp, avctx); |
| 1016 | ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx); | 1037 | ff_mpegvideoencdsp_init(&s->mpvencdsp, avctx); |
| 1017 | ff_pixblockdsp_init(&s->pdsp, avctx); | 1038 | ff_pixblockdsp_init(&s->pdsp, avctx); |
| @@ -1030,17 +1051,6 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx) · 12 unmodified lines | |||
| 1030 | 1051 | ||
| 1031 | ff_dct_encode_init(s); | 1052 | ff_dct_encode_init(s); |
| 1032 | 1053 | ||
| 1033 | if (s->c.mpeg_quant || s->c.codec_id == AV_CODEC_ID_MPEG2VIDEO) { | ||
| 1034 | s->c.dct_unquantize_intra = s->c.dct_unquantize_mpeg2_intra; | ||
| 1035 | s->c.dct_unquantize_inter = s->c.dct_unquantize_mpeg2_inter; | ||
| 1036 | } else if (s->c.out_format == FMT_H263 || s->c.out_format == FMT_H261) { | ||
| 1037 | s->c.dct_unquantize_intra = s->c.dct_unquantize_h263_intra; | ||
| 1038 | s->c.dct_unquantize_inter = s->c.dct_unquantize_h263_inter; | ||
| 1039 | } else { | ||
| 1040 | s->c.dct_unquantize_intra = s->c.dct_unquantize_mpeg1_intra; | ||
| 1041 | s->c.dct_unquantize_inter = s->c.dct_unquantize_mpeg1_inter; | ||
| 1042 | } | ||
| 1043 | |||
| 1044 | if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263) { | 1054 | if (CONFIG_H263_ENCODER && s->c.out_format == FMT_H263) { |
| 1045 | ff_h263_encode_init(m); | 1055 | ff_h263_encode_init(m); |
| 1046 | #if CONFIG_MSMPEG4ENC | 1056 | #if CONFIG_MSMPEG4ENC |
| @@ -246,28 +246,29 @@ static void dct_unquantize_h263_inter_c(MpegEncContext *s, · 245 unmodified lines | |||
| 246 | } | 246 | } |
| 247 | } | 247 | } |
| 248 | 248 | ||
| 249 | av_cold void ff_mpv_unquantize_init(MpegEncContext *s) | 249 | av_cold void ff_mpv_unquantize_init(MPVUnquantDSPContext *s, |
| 250 | int bitexact, int q_scale_type) | ||
| 250 | { | 251 | { |
| 251 | s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c; | 252 | s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_c; |
| 252 | s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c; | 253 | s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_c; |
| 253 | s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c; | 254 | s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_c; |
| 254 | s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c; | 255 | s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_c; |
| 255 | s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c; | 256 | s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_c; |
| 256 | if (s->avctx->flags & AV_CODEC_FLAG_BITEXACT) | 257 | if (bitexact) |
| 257 | s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact; | 258 | s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_bitexact; |
| 258 | s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c; | 259 | s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_c; |
| 259 | 260 | ||
| 260 | #if HAVE_INTRINSICS_NEON | 261 | #if HAVE_INTRINSICS_NEON |
| 261 | ff_mpv_common_init_neon(s); | 262 | ff_mpv_unquantize_init_neon(s, bitexact); |
| 262 | #endif | 263 | #endif |
| 263 | 264 | ||
| 264 | #if ARCH_ARM | 265 | #if ARCH_ARM |
| 265 | ff_mpv_common_init_arm(s); | 266 | ff_mpv_unquantize_init_arm(s, bitexact); |
| 266 | #elif ARCH_PPC | 267 | #elif ARCH_PPC |
| 267 | ff_mpv_common_init_ppc(s); | 268 | ff_mpv_unquantize_init_ppc(s, bitexact); |
| 268 | #elif ARCH_X86 | 269 | #elif ARCH_X86 |
| 269 | ff_mpv_common_init_x86(s); | 270 | ff_mpv_unquantize_init_x86(s, bitexact); |
| 270 | #elif ARCH_MIPS | 271 | #elif ARCH_MIPS |
| 271 | ff_mpv_common_init_mips(s); | 272 | ff_mpv_unquantize_init_mips(s, bitexact, q_scale_type); |
| 272 | #endif | 273 | #endif |
| 273 | } | 274 | } |
| @@ -25,13 +25,38 @@ · 24 unmodified lines | |||
| 25 | #ifndef AVCODEC_MPEGVIDEO_UNQUANTIZE_H | 25 | #ifndef AVCODEC_MPEGVIDEO_UNQUANTIZE_H |
| 26 | #define AVCODEC_MPEGVIDEO_UNQUANTIZE_H | 26 | #define AVCODEC_MPEGVIDEO_UNQUANTIZE_H |
| 27 | 27 | ||
| 28 | #include <stdint.h> | ||
| 29 | |||
| 30 | #include "config.h" | ||
| 31 | |||
| 28 | typedef struct MpegEncContext MpegEncContext; | 32 | typedef struct MpegEncContext MpegEncContext; |
| 29 | 33 | ||
| 30 | void ff_mpv_unquantize_init(MpegEncContext *s); | 34 | typedef struct MPVUnquantDSPContext { |
| 31 | void ff_mpv_common_init_arm(MpegEncContext *s); | 35 | void (*dct_unquantize_mpeg1_intra)(struct MpegEncContext *s, |
| 32 | void ff_mpv_common_init_neon(MpegEncContext *s); | 36 | int16_t *block/*align 16*/, int n, int qscale); |
| 33 | void ff_mpv_common_init_ppc(MpegEncContext *s); | 37 | void (*dct_unquantize_mpeg1_inter)(struct MpegEncContext *s, |
| 34 | void ff_mpv_common_init_x86(MpegEncContext *s); | 38 | int16_t *block/*align 16*/, int n, int qscale); |
| 35 | void ff_mpv_common_init_mips(MpegEncContext *s); | 39 | void (*dct_unquantize_mpeg2_intra)(struct MpegEncContext *s, |
| 40 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 41 | void (*dct_unquantize_mpeg2_inter)(struct MpegEncContext *s, | ||
| 42 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 43 | void (*dct_unquantize_h263_intra)(struct MpegEncContext *s, | ||
| 44 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 45 | void (*dct_unquantize_h263_inter)(struct MpegEncContext *s, | ||
| 46 | int16_t *block/*align 16*/, int n, int qscale); | ||
| 47 | } MPVUnquantDSPContext; | ||
| 48 | |||
| 49 | #if !ARCH_MIPS | ||
| 50 | #define ff_mpv_unquantize_init(s, bitexact, q_scale_type) ff_mpv_unquantize_init(s, bitexact) | ||
| 51 | #endif | ||
| 52 | |||
| 53 | void ff_mpv_unquantize_init(MPVUnquantDSPContext *s, | ||
| 54 | int bitexact, int q_scale_type); | ||
| 55 | void ff_mpv_unquantize_init_arm (MPVUnquantDSPContext *s, int bitexact); | ||
| 56 | void ff_mpv_unquantize_init_neon(MPVUnquantDSPContext *s, int bitexact); | ||
| 57 | void ff_mpv_unquantize_init_ppc (MPVUnquantDSPContext *s, int bitexact); | ||
| 58 | void ff_mpv_unquantize_init_x86 (MPVUnquantDSPContext *s, int bitexact); | ||
| 59 | void ff_mpv_unquantize_init_mips(MPVUnquantDSPContext *s, int bitexact, | ||
| 60 | int q_scale_type); | ||
| 36 | 61 | ||
| 37 | #endif /* AVCODEC_MPEGVIDEO_UNQUANTIZE_H */ | 62 | #endif /* AVCODEC_MPEGVIDEO_UNQUANTIZE_H */ |
| @@ -125,7 +125,7 @@ static void dct_unquantize_h263_intra_neon(MpegEncContext *s, int16_t *block, · 124 unmodified lines | |||
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | 127 | ||
| 128 | av_cold void ff_mpv_common_init_neon(MpegEncContext *s) | 128 | av_cold void ff_mpv_unquantize_init_neon(MPVUnquantDSPContext *s, int bitexact) |
| 129 | { | 129 | { |
| 130 | int cpu_flags = av_get_cpu_flags(); | 130 | int cpu_flags = av_get_cpu_flags(); |
| 131 | 131 | ||
| @@ -103,7 +103,7 @@ static void dct_unquantize_h263_altivec(MpegEncContext *s, · 102 unmodified lines | |||
| 103 | 103 | ||
| 104 | #endif /* HAVE_ALTIVEC */ | 104 | #endif /* HAVE_ALTIVEC */ |
| 105 | 105 | ||
| 106 | av_cold void ff_mpv_common_init_ppc(MpegEncContext *s) | 106 | av_cold void ff_mpv_unquantize_init_ppc(MPVUnquantDSPContext *s, int bitexact) |
| 107 | { | 107 | { |
| 108 | #if HAVE_ALTIVEC | 108 | #if HAVE_ALTIVEC |
| 109 | if (!PPC_ALTIVEC(av_get_cpu_flags())) | 109 | if (!PPC_ALTIVEC(av_get_cpu_flags())) |
| @@ -450,7 +450,7 @@ __asm__ volatile( · 449 unmodified lines | |||
| 450 | 450 | ||
| 451 | #endif /* HAVE_MMX_INLINE */ | 451 | #endif /* HAVE_MMX_INLINE */ |
| 452 | 452 | ||
| 453 | av_cold void ff_mpv_common_init_x86(MpegEncContext *s) | 453 | av_cold void ff_mpv_unquantize_init_x86(MPVUnquantDSPContext *s, int bitexact) |
| 454 | { | 454 | { |
| 455 | #if HAVE_MMX_INLINE | 455 | #if HAVE_MMX_INLINE |
| 456 | int cpu_flags = av_get_cpu_flags(); | 456 | int cpu_flags = av_get_cpu_flags(); |
| @@ -460,7 +460,7 @@ av_cold void ff_mpv_common_init_x86(MpegEncContext *s) · 3 unmodified lines | |||
| 460 | s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx; | 460 | s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_mmx; |
| 461 | s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx; | 461 | s->dct_unquantize_mpeg1_intra = dct_unquantize_mpeg1_intra_mmx; |
| 462 | s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_mmx; | 462 | s->dct_unquantize_mpeg1_inter = dct_unquantize_mpeg1_inter_mmx; |
| 463 | if (!(s->avctx->flags & AV_CODEC_FLAG_BITEXACT)) | 463 | if (!bitexact) |
| 464 | s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx; | 464 | s->dct_unquantize_mpeg2_intra = dct_unquantize_mpeg2_intra_mmx; |
| 465 | s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_mmx; | 465 | s->dct_unquantize_mpeg2_inter = dct_unquantize_mpeg2_inter_mmx; |
| 466 | } | 466 | } |