[1/3] idct: remove call to ff_idctdsp_init from ff_MPV_common_init

Message ID 1407767808-4290-1-git-send-email-stebbins@jetheaddev.com
State New
Headers show

Commit Message

John Stebbins Aug. 11, 2014, 2:36 p.m.
One step in untangling the mpegvideo code and fixing some problems in
the order that initialization is being done in h263dec and h261dec.
---
call ff_mpv_idct_init from ff_mpeg_update_thread_context

 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(-)

Comments

Diego Biurrun Aug. 11, 2014, 5:35 p.m. | #1
On Mon, Aug 11, 2014 at 07:36:48AM -0700, John Stebbins wrote:
> --- 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 ff_mpv_idct_init() sets the real permutation. */
> +    ff_mpv_idct_init(s2);
>      ff_mpeg12_common_init(&s->mpeg_enc_ctx);
>      ff_mpeg12_init_vlcs();

This bit looks suspicious; at least the comment does no longer match
the code.

> --- 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;

Does this file really need the IDCT init?

Diego
John Stebbins Aug. 11, 2014, 5:56 p.m. | #2
On 08/11/2014 10:35 AM, Diego Biurrun wrote:
> On Mon, Aug 11, 2014 at 07:36:48AM -0700, John Stebbins wrote:
>> --- 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 ff_mpv_idct_init() sets the real permutation. */
>> +    ff_mpv_idct_init(s2);
>>      ff_mpeg12_common_init(&s->mpeg_enc_ctx);
>>      ff_mpeg12_init_vlcs();
> This bit looks suspicious; at least the comment does no longer match
> the code.

The code is correct.  I moved it down a few lines because ff_mpv_idct_init references s2->avctx.  But if you don't like
useing ff_mpv_idct_init for dummy initialization, I can certainly revert this and just update the comment.

I guess the comment is a bit misleading now.  It means the *next* call to ff_mpv_idct_init that will happen in
mpeg_decode_postinit.  How about simplifying to:
/* we need some permutation to store matrices until the decoder sets the real permutation */
Luca Barbato Aug. 11, 2014, 5:59 p.m. | #3
On 11/08/14 19:56, John Stebbins wrote:
> /* we need some permutation to store matrices until the decoder sets the real permutation */

I like it a lot.

Patch

diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c
index e656b6e..4294510 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 d83fb31..88ca63d 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 cdd5544..a6d16b7 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 a181fcc..2253dbb 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 ff_mpv_idct_init() 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 da42541..540c959 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 1333d44..e8c3581 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 2d0cd83..7355ebf 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 835a1aa..e3e5720 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 0c36348..7411f6f 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) {