From 998c9f15d1ca8c7489775ebcca51623b915988f1 Mon Sep 17 00:00:00 2001 From: John Stebbins Date: Fri, 8 Aug 2014 08:11:20 -0700 Subject: [PATCH] idct: remove call to ff_idctdsp_init from ff_MPV_common_init One step in untangling the mpegvideo code and fixing some problems in the order that initialization is being done in h263dec and h261dec. --- libavcodec/dnxhdenc.c | 3 +-- libavcodec/h261dec.c | 4 +++- libavcodec/h263dec.c | 8 ++++++-- libavcodec/mpeg12dec.c | 12 ++++++------ libavcodec/mpegvideo.c | 15 ++++++++++----- libavcodec/mpegvideo.h | 2 +- libavcodec/mpegvideo_enc.c | 1 + libavcodec/rv10.c | 1 + libavcodec/rv34.c | 2 ++ 9 files changed, 31 insertions(+), 17 deletions(-) diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c index e656b6edba..42945107dd 100644 --- a/libavcodec/dnxhdenc.c +++ b/libavcodec/dnxhdenc.c @@ -309,10 +309,9 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx) ff_blockdsp_init(&ctx->bdsp, avctx); ff_fdctdsp_init(&ctx->m.fdsp, avctx); - ff_idctdsp_init(&ctx->m.idsp, avctx); + ff_mpv_idct_init(&ctx->m); ff_mpegvideoencdsp_init(&ctx->m.mpvencdsp, avctx); ff_pixblockdsp_init(&ctx->m.pdsp, avctx); - ff_dct_common_init(&ctx->m); if (!ctx->m.dct_quantize) ctx->m.dct_quantize = ff_dct_quantize_c; diff --git a/libavcodec/h261dec.c b/libavcodec/h261dec.c index d83fb3114c..88ca63ddc6 100644 --- a/libavcodec/h261dec.c +++ b/libavcodec/h261dec.c @@ -581,10 +581,12 @@ static int h261_decode_frame(AVCodecContext *avctx, void *data, retry: init_get_bits(&s->gb, buf, buf_size * 8); - if (!s->context_initialized) + if (!s->context_initialized) { // we need the IDCT permutaton for reading a custom matrix + ff_mpv_idct_init(s); if (ff_MPV_common_init(s) < 0) return -1; + } ret = h261_decode_picture_header(h); diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index cdd55446c7..a6d16b7258 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -113,9 +113,11 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx) /* for h263, we allocate the images after having read the header */ if (avctx->codec->id != AV_CODEC_ID_H263 && - avctx->codec->id != AV_CODEC_ID_MPEG4) + avctx->codec->id != AV_CODEC_ID_MPEG4) { + ff_mpv_idct_init(s); if ((ret = ff_MPV_common_init(s)) < 0) return ret; + } ff_h263dsp_init(&s->h263dsp); ff_qpeldsp_init(&s->qdsp); @@ -414,10 +416,12 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, if (ret < 0) return ret; - if (!s->context_initialized) + if (!s->context_initialized) { // we need the idct permutaton for reading a custom matrix + ff_mpv_idct_init(s); if ((ret = ff_MPV_common_init(s)) < 0) return ret; + } /* We need to set current_picture_ptr before reading the header, * otherwise we cannot store anyting in there */ diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index a181fcccb9..29f8980913 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -1097,18 +1097,16 @@ static av_cold int mpeg_decode_init(AVCodecContext *avctx) { Mpeg1Context *s = avctx->priv_data; MpegEncContext *s2 = &s->mpeg_enc_ctx; - int i; - - /* we need some permutation to store matrices, - * until MPV_common_init() sets the real permutation. */ - for (i = 0; i < 64; i++) - s2->idsp.idct_permutation[i] = i; ff_MPV_decode_defaults(s2); s->mpeg_enc_ctx.avctx = avctx; s->mpeg_enc_ctx.flags = avctx->flags; s->mpeg_enc_ctx.flags2 = avctx->flags2; + + /* we need some permutation to store matrices, + * until the decoder sets the real permutation. */ + ff_mpv_idct_init(s2); ff_mpeg12_common_init(&s->mpeg_enc_ctx); ff_mpeg12_init_vlcs(); @@ -1313,6 +1311,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx) * if DCT permutation is changed. */ memcpy(old_permutation, s->idsp.idct_permutation, 64 * sizeof(uint8_t)); + ff_mpv_idct_init(s); if (ff_MPV_common_init(s) < 0) return -2; @@ -2151,6 +2150,7 @@ static int vcr2_init_sequence(AVCodecContext *avctx) #endif /* FF_API_XVMC */ avctx->idct_algo = FF_IDCT_SIMPLE; + ff_mpv_idct_init(s); if (ff_MPV_common_init(s) < 0) return -1; s1->mpeg_enc_ctx_allocated = 1; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index da425414b6..540c959ddb 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -375,11 +375,10 @@ static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type, } /* init common dct for both encoder and decoder */ -av_cold int ff_dct_common_init(MpegEncContext *s) +static av_cold int dct_init(MpegEncContext *s) { ff_blockdsp_init(&s->bdsp, s->avctx); ff_hpeldsp_init(&s->hdsp, s->avctx->flags); - ff_idctdsp_init(&s->idsp, s->avctx); ff_me_cmp_init(&s->mecc, s->avctx); ff_mpegvideodsp_init(&s->mdsp); ff_videodsp_init(&s->vdsp, s->avctx->bits_per_raw_sample); @@ -403,6 +402,13 @@ av_cold int ff_dct_common_init(MpegEncContext *s) if (ARCH_X86) ff_MPV_common_init_x86(s); + return 0; +} + +av_cold void ff_mpv_idct_init(MpegEncContext *s) +{ + ff_idctdsp_init(&s->idsp, s->avctx); + /* load & permutate scantables * note: only wmv uses different ones */ @@ -415,8 +421,6 @@ av_cold int ff_dct_common_init(MpegEncContext *s) } ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); - - return 0; } static int frame_size_alloc(MpegEncContext *s, int linesize) @@ -910,6 +914,7 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, s->bitstream_buffer = NULL; s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0; + ff_mpv_idct_init(s); ff_MPV_common_init(s); } @@ -1263,7 +1268,7 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) av_image_check_size(s->width, s->height, 0, s->avctx)) return -1; - ff_dct_common_init(s); + dct_init(s); s->flags = s->avctx->flags; s->flags2 = s->avctx->flags2; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 1333d44414..e8c3581274 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -720,7 +720,7 @@ void ff_MPV_report_decode_progress(MpegEncContext *s); int ff_mpeg_update_thread_context(AVCodecContext *dst, const AVCodecContext *src); void ff_set_qscale(MpegEncContext * s, int qscale); -int ff_dct_common_init(MpegEncContext *s); +void ff_mpv_idct_init(MpegEncContext *s); void ff_convert_matrix(MpegEncContext *s, int (*qmat)[64], uint16_t (*qmat16)[2][64], const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra); int ff_dct_quantize_c(MpegEncContext *s, int16_t *block, int n, int qscale, int *overflow); diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 2d0cd83a6d..7355ebf355 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -700,6 +700,7 @@ av_cold int ff_MPV_encode_init(AVCodecContext *avctx) s->alternate_scan); /* init */ + ff_mpv_idct_init(s); if (ff_MPV_common_init(s) < 0) return -1; diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c index 835a1aa332..e3e572099c 100644 --- a/libavcodec/rv10.c +++ b/libavcodec/rv10.c @@ -498,6 +498,7 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx) avctx->pix_fmt = AV_PIX_FMT_YUV420P; + ff_mpv_idct_init(s); if ((ret = ff_MPV_common_init(s)) < 0) return ret; diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index 0c3634801c..7411f6fa4b 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -1488,6 +1488,7 @@ av_cold int ff_rv34_decode_init(AVCodecContext *avctx) avctx->has_b_frames = 1; s->low_delay = 0; + ff_mpv_idct_init(s); if ((ret = ff_MPV_common_init(s)) < 0) return ret; @@ -1524,6 +1525,7 @@ int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx) if (avctx->internal->is_copy) { r->tmp_b_block_base = NULL; + ff_mpv_idct_init(&r->s); if ((err = ff_MPV_common_init(&r->s)) < 0) return err; if ((err = rv34_decoder_alloc(r)) < 0) {