Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Andreas Rheinhardt <ffmpegagent-at-gmail.com@ffmpeg.org>
To: ffmpeg-devel@ffmpeg.org
Cc: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
Subject: [FFmpeg-devel] [PATCH 34/48] avcodec/mpegvideo: Move fields only used by H.263 decoders to H263DecCtx
Date: Mon, 23 Jun 2025 13:36:34 +0000
Message-ID: <7d08e91b380bafd1ca7da4f98386e77cbb6d5187.1750685809.git.ffmpegagent@gmail.com> (raw)
In-Reply-To: <pull.102.ffstaging.FFmpeg.1750685808.ffmpegagent@gmail.com>

From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/flvdec.c        |  4 ++--
 libavcodec/h263dec.c       | 28 +++++++++++++-------------
 libavcodec/h263dec.h       | 20 +++++++++++++++++++
 libavcodec/intelh263dec.c  |  8 ++++----
 libavcodec/ituh263dec.c    | 40 +++++++++++++++++++-------------------
 libavcodec/mpeg4videodec.c | 36 ++++++++++++++++++----------------
 libavcodec/mpegvideo.h     | 15 --------------
 libavcodec/mpegvideo_dec.c |  1 -
 libavcodec/nvdec_mpeg4.c   |  2 +-
 libavcodec/rv10.c          | 12 ++++++------
 10 files changed, 86 insertions(+), 80 deletions(-)

diff --git a/libavcodec/flvdec.c b/libavcodec/flvdec.c
index f2d0b642b7..c70d79f483 100644
--- a/libavcodec/flvdec.c
+++ b/libavcodec/flvdec.c
@@ -89,13 +89,13 @@ int ff_flv_decode_picture_header(H263DecContext *const h)
     skip_bits1(&h->gb); /* deblocking flag */
     h->c.chroma_qscale = h->c.qscale = get_bits(&h->gb, 5);
 
-    h->c.h263_long_vectors = 0;
+    h->h263_long_vectors = 0;
 
     /* PEI */
     if (skip_1stop_8data_bits(&h->gb) < 0)
         return AVERROR_INVALIDDATA;
 
-    if (h->c.ehc_mode)
+    if (h->ehc_mode)
         h->c.avctx->sample_aspect_ratio= (AVRational){1,2};
 
     if (h->c.avctx->debug & FF_DEBUG_PICT_INFO) {
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index fc63e8a5d8..541eb34789 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -157,7 +157,7 @@ av_cold int ff_h263_decode_init(AVCodecContext *avctx)
 
     if (avctx->codec_tag == AV_RL32("L263") || avctx->codec_tag == AV_RL32("S263"))
         if (avctx->extradata_size == 56 && avctx->extradata[0] == 1)
-            s->ehc_mode = 1;
+            h->ehc_mode = 1;
 
     /* for H.263, we allocate the images after having read the header */
     if (avctx->codec->id != AV_CODEC_ID_H263 &&
@@ -279,7 +279,7 @@ static int decode_slice(H263DecContext *const h)
                     ff_er_add_slice(&h->c.er, h->c.resync_mb_x, h->c.resync_mb_y,
                                     h->c.mb_x, h->c.mb_y, ER_MB_END & part_mask);
 
-                    h->c.padding_bug_score--;
+                    h->padding_bug_score--;
 
                     if (++h->c.mb_x >= h->c.mb_width) {
                         h->c.mb_x = 0;
@@ -324,7 +324,7 @@ static int decode_slice(H263DecContext *const h)
         get_bits_left(&h->gb) >= 48                &&
         show_bits(&h->gb, 24) == 0x4010            &&
         !h->c.data_partitioning)
-        h->c.padding_bug_score += 32;
+        h->padding_bug_score += 32;
 
     /* try to detect the padding bug */
     if (h->c.codec_id == AV_CODEC_ID_MPEG4         &&
@@ -336,18 +336,18 @@ static int decode_slice(H263DecContext *const h)
         const int bits_left  = h->gb.size_in_bits - bits_count;
 
         if (bits_left == 0) {
-            h->c.padding_bug_score += 16;
+            h->padding_bug_score += 16;
         } else if (bits_left != 1) {
             int v = show_bits(&h->gb, 8);
             v |= 0x7F >> (7 - (bits_count & 7));
 
             if (v == 0x7F && bits_left <= 8)
-                h->c.padding_bug_score--;
+                h->padding_bug_score--;
             else if (v == 0x7F && ((get_bits_count(&h->gb) + 8) & 8) &&
                      bits_left <= 16)
-                h->c.padding_bug_score += 4;
+                h->padding_bug_score += 4;
             else
-                h->c.padding_bug_score++;
+                h->padding_bug_score++;
         }
     }
 
@@ -359,7 +359,7 @@ static int decode_slice(H263DecContext *const h)
         show_bits(&h->gb, 8) == 0                  &&
         !h->c.data_partitioning) {
 
-        h->c.padding_bug_score += 32;
+        h->padding_bug_score += 32;
     }
 
     if (h->c.codec_id == AV_CODEC_ID_H263          &&
@@ -367,12 +367,12 @@ static int decode_slice(H263DecContext *const h)
         get_bits_left(&h->gb) >= 64                &&
         AV_RB64(h->gb.buffer_end - 8) == 0xCDCDCDCDFC7F0000) {
 
-        h->c.padding_bug_score += 32;
+        h->padding_bug_score += 32;
     }
 
     if (h->c.workaround_bugs & FF_BUG_AUTODETECT) {
         if (
-            (h->c.padding_bug_score > -2 && !h->c.data_partitioning))
+            (h->padding_bug_score > -2 && !h->c.data_partitioning))
             h->c.workaround_bugs |= FF_BUG_NO_PADDING;
         else
             h->c.workaround_bugs &= ~FF_BUG_NO_PADDING;
@@ -410,7 +410,7 @@ static int decode_slice(H263DecContext *const h)
 
     av_log(h->c.avctx, AV_LOG_ERROR,
            "slice end not reached but screenspace end (%d left %06X, score= %d)\n",
-           get_bits_left(&h->gb), show_bits(&h->gb, 24), h->c.padding_bug_score);
+           get_bits_left(&h->gb), show_bits(&h->gb, 24), h->padding_bug_score);
 
     ff_er_add_slice(&h->c.er, h->c.resync_mb_x, h->c.resync_mb_y, h->c.mb_x, h->c.mb_y,
                     ER_MB_END & part_mask);
@@ -432,10 +432,10 @@ int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict,
     /* no supplementary picture */
     if (buf_size == 0) {
         /* special case for last picture */
-        if ((!h->c.low_delay || h->c.skipped_last_frame) && h->c.next_pic.ptr) {
+        if ((!h->c.low_delay || h->skipped_last_frame) && h->c.next_pic.ptr) {
             if ((ret = av_frame_ref(pict, h->c.next_pic.ptr->f)) < 0)
                 return ret;
-            if (h->c.skipped_last_frame) {
+            if (h->skipped_last_frame) {
                 /* If the stream ended with an NVOP, we output the last frame
                  * in display order, but with the props from the last input
                  * packet so that the stream's end time is correct. */
@@ -551,7 +551,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict,
     if ((ret = ff_mpv_frame_start(s, avctx)) < 0)
         return ret;
 
-    if (!h->c.divx_packed)
+    if (!h->divx_packed)
         ff_thread_finish_setup(avctx);
 
     if (avctx->hwaccel) {
diff --git a/libavcodec/h263dec.h b/libavcodec/h263dec.h
index dfa056f08e..dd63eca5be 100644
--- a/libavcodec/h263dec.h
+++ b/libavcodec/h263dec.h
@@ -50,6 +50,26 @@ typedef struct H263DecContext {
 
     GetBitContext gb;
 
+    int pb_frame;     ///< PB-frame mode (0 = none, 1 = base, 2 = improved)
+
+    /* motion compensation */
+    int h263_long_vectors;      ///< use horrible H.263v1 long vector mode
+
+    /* H.263 specific */
+    int ehc_mode;
+
+    /* H.263+ specific */
+    int custom_pcf;
+
+    /* MPEG-4 specific */
+    int padding_bug_score;      ///< used to detect the VERY common padding bug in MPEG-4
+    int skipped_last_frame;
+    int divx_packed;            ///< divx specific, used to workaround (many) bugs in divx5
+
+    /* RV10 specific */
+    int rv10_version; ///< RV10 version: 0 or 3
+    int rv10_first_dc_coded[3];
+
     int (*decode_mb)(struct H263DecContext *h);
 
     GetBitContext last_resync_gb;    ///< used to search for the next resync marker
diff --git a/libavcodec/intelh263dec.c b/libavcodec/intelh263dec.c
index 3800e6f1cc..1640defaab 100644
--- a/libavcodec/intelh263dec.c
+++ b/libavcodec/intelh263dec.c
@@ -60,14 +60,14 @@ int ff_intel_h263_decode_picture_header(H263DecContext *const h)
 
     h->c.pict_type = AV_PICTURE_TYPE_I + get_bits1(&h->gb);
 
-    h->c.h263_long_vectors = get_bits1(&h->gb);
+    h->h263_long_vectors = get_bits1(&h->gb);
 
     if (get_bits1(&h->gb) != 0) {
         av_log(h->c.avctx, AV_LOG_ERROR, "SAC not supported\n");
         return -1;      /* SAC: off */
     }
     h->c.obmc     = get_bits1(&h->gb);
-    h->c.pb_frame = get_bits1(&h->gb);
+    h->pb_frame = get_bits1(&h->gb);
 
     if (format < 6) {
         h->c.width  = ff_h263_format[format][0];
@@ -86,7 +86,7 @@ int ff_intel_h263_decode_picture_header(H263DecContext *const h)
         if (get_bits1(&h->gb))
             av_log(h->c.avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
         if (get_bits1(&h->gb))
-            h->c.pb_frame = 2;
+            h->pb_frame = 2;
         if (get_bits(&h->gb, 5))
             av_log(h->c.avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
         if (get_bits(&h->gb, 5) != 1)
@@ -110,7 +110,7 @@ int ff_intel_h263_decode_picture_header(H263DecContext *const h)
     h->c.chroma_qscale = h->c.qscale = get_bits(&h->gb, 5);
     skip_bits1(&h->gb); /* Continuous Presence Multipoint mode: off */
 
-    if (h->c.pb_frame) {
+    if (h->pb_frame) {
         skip_bits(&h->gb, 3); //temporal reference for B-frame
         skip_bits(&h->gb, 2); //dbquant
     }
diff --git a/libavcodec/ituh263dec.c b/libavcodec/ituh263dec.c
index c19134b0d4..11be8189a6 100644
--- a/libavcodec/ituh263dec.c
+++ b/libavcodec/ituh263dec.c
@@ -85,7 +85,7 @@ void ff_h263_show_pict_info(H263DecContext *const h, int h263_plus)
                h->gb.size_in_bits, 1-h->c.no_rounding,
                h->c.obmc ? " AP" : "",
                h->c.umvplus ? " UMV" : "",
-               h->c.h263_long_vectors ? " LONG" : "",
+               h->h263_long_vectors ? " LONG" : "",
                h263_plus ? " +" : "",
                h->c.h263_aic ? " AIC" : "",
                h->c.alt_inter_vlc ? " AIV" : "",
@@ -295,7 +295,7 @@ int ff_h263_decode_motion(H263DecContext *const h, int pred, int f_code)
     val += pred;
 
     /* modulo decoding */
-    if (!h->c.h263_long_vectors) {
+    if (!h->h263_long_vectors) {
         val = sign_extend(val, 5 + f_code);
     } else {
         /* horrible H.263 long vector mode */
@@ -545,10 +545,10 @@ static int h263_decode_block(H263DecContext *const h, int16_t block[64],
     } else if (h->c.mb_intra) {
         /* DC coef */
         if (CONFIG_RV10_DECODER && h->c.codec_id == AV_CODEC_ID_RV10) {
-            if (h->c.rv10_version == 3 && h->c.pict_type == AV_PICTURE_TYPE_I) {
+            if (h->rv10_version == 3 && h->c.pict_type == AV_PICTURE_TYPE_I) {
                 int component = (n <= 3 ? 0 : n - 4 + 1);
                 level = h->c.last_dc[component];
-                if (h->c.rv10_first_dc_coded[component]) {
+                if (h->rv10_first_dc_coded[component]) {
                     int diff = ff_rv_decode_dc(h, n);
                     if (diff < 0)
                         return -1;
@@ -556,7 +556,7 @@ static int h263_decode_block(H263DecContext *const h, int16_t block[64],
                     level = level & 0xff; /* handle wrap round */
                     h->c.last_dc[component] = level;
                 } else {
-                    h->c.rv10_first_dc_coded[component] = 1;
+                    h->rv10_first_dc_coded[component] = 1;
                 }
             } else {
                 level = get_bits(&h->gb, 8);
@@ -816,8 +816,8 @@ int ff_h263_decode_mb(H263DecContext *const h)
         if (h->c.mb_intra)
             goto intra;
 
-        if (h->c.pb_frame && get_bits1(&h->gb))
-            pb_mv_count = h263_get_modb(&h->gb, h->c.pb_frame, &cbpb);
+        if (h->pb_frame && get_bits1(&h->gb))
+            pb_mv_count = h263_get_modb(&h->gb, h->pb_frame, &cbpb);
         cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1);
 
         if (cbpy < 0) {
@@ -1029,8 +1029,8 @@ intra:
         }else
             h->c.ac_pred = 0;
 
-        if (h->c.pb_frame && get_bits1(&h->gb))
-            pb_mv_count = h263_get_modb(&h->gb, h->c.pb_frame, &cbpb);
+        if (h->pb_frame && get_bits1(&h->gb))
+            pb_mv_count = h263_get_modb(&h->gb, h->pb_frame, &cbpb);
         cbpy = get_vlc2(&h->gb, ff_h263_cbpy_vlc, CBPY_VLC_BITS, 1);
         if(cbpy<0){
             av_log(h->c.avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n",
@@ -1042,7 +1042,7 @@ intra:
             h263_decode_dquant(h);
         }
 
-        pb_mv_count += !!h->c.pb_frame;
+        pb_mv_count += !!h->pb_frame;
     }
 
     while(pb_mv_count--){
@@ -1057,7 +1057,7 @@ intra:
         cbp+=cbp;
     }
 
-    if (h->c.pb_frame && h263_skip_b_part(h, cbpb) < 0)
+    if (h->pb_frame && h263_skip_b_part(h, cbpb) < 0)
         return -1;
     if (h->c.obmc && !h->c.mb_intra) {
         if (h->c.pict_type == AV_PICTURE_TYPE_P &&
@@ -1146,7 +1146,7 @@ int ff_h263_decode_picture_header(H263DecContext *const h)
 
         h->c.pict_type = AV_PICTURE_TYPE_I + get_bits1(&h->gb);
 
-        h->c.h263_long_vectors = get_bits1(&h->gb);
+        h->h263_long_vectors = get_bits1(&h->gb);
 
         if (get_bits1(&h->gb) != 0) {
             av_log(h->c.avctx, AV_LOG_ERROR, "H.263 SAC not supported\n");
@@ -1154,7 +1154,7 @@ int ff_h263_decode_picture_header(H263DecContext *const h)
         }
         h->c.obmc = get_bits1(&h->gb); /* Advanced prediction mode */
 
-        h->c.pb_frame = get_bits1(&h->gb);
+        h->pb_frame = get_bits1(&h->gb);
         h->c.chroma_qscale = h->c.qscale = get_bits(&h->gb, 5);
         skip_bits1(&h->gb); /* Continuous Presence Multipoint mode: off */
 
@@ -1174,7 +1174,7 @@ int ff_h263_decode_picture_header(H263DecContext *const h)
             /* OPPTYPE */
             format = get_bits(&h->gb, 3);
             ff_dlog(h->c.avctx, "ufep=1, format: %d\n", format);
-            h->c.custom_pcf = get_bits1(&h->gb);
+            h->custom_pcf = get_bits1(&h->gb);
             h->c.umvplus    = get_bits1(&h->gb); /* Unrestricted Motion Vector */
             if (get_bits1(&h->gb) != 0) {
                 av_log(h->c.avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
@@ -1210,7 +1210,7 @@ int ff_h263_decode_picture_header(H263DecContext *const h)
         switch (h->c.pict_type) {
         case 0: h->c.pict_type = AV_PICTURE_TYPE_I; break;
         case 1: h->c.pict_type = AV_PICTURE_TYPE_P; break;
-        case 2: h->c.pict_type = AV_PICTURE_TYPE_P; h->c.pb_frame = 3; break;
+        case 2: h->c.pict_type = AV_PICTURE_TYPE_P; h->pb_frame = 3; break;
         case 3: h->c.pict_type = AV_PICTURE_TYPE_B; break;
         case 7: h->c.pict_type = AV_PICTURE_TYPE_I; break; //ZYGO
         default:
@@ -1251,13 +1251,13 @@ int ff_h263_decode_picture_header(H263DecContext *const h)
                 height = ff_h263_format[format][1];
                 h->c.avctx->sample_aspect_ratio = (AVRational){12,11};
             }
-            h->c.avctx->sample_aspect_ratio.den <<= h->c.ehc_mode;
+            h->c.avctx->sample_aspect_ratio.den <<= h->ehc_mode;
             if ((width == 0) || (height == 0))
                 return -1;
             h->c.width  = width;
             h->c.height = height;
 
-            if (h->c.custom_pcf) {
+            if (h->custom_pcf) {
                 h->c.avctx->framerate.num  = 1800000;
                 h->c.avctx->framerate.den  = 1000 + get_bits1(&h->gb);
                 h->c.avctx->framerate.den *= get_bits(&h->gb, 7);
@@ -1273,7 +1273,7 @@ int ff_h263_decode_picture_header(H263DecContext *const h)
             }
         }
 
-        if (h->c.custom_pcf)
+        if (h->custom_pcf)
             skip_bits(&h->gb, 2); //extended Temporal reference
 
         if (ufep) {
@@ -1315,9 +1315,9 @@ int ff_h263_decode_picture_header(H263DecContext *const h)
 
     h->c.gob_index = H263_GOB_HEIGHT(h->c.height);
 
-    if (h->c.pb_frame) {
+    if (h->pb_frame) {
         skip_bits(&h->gb, 3); /* Temporal reference for B-pictures */
-        if (h->c.custom_pcf)
+        if (h->custom_pcf)
             skip_bits(&h->gb, 2); //extended Temporal reference
         skip_bits(&h->gb, 2); /* Quantization information for B-pictures */
     }
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
index ee78e7119f..f3af523b7c 100644
--- a/libavcodec/mpeg4videodec.c
+++ b/libavcodec/mpeg4videodec.c
@@ -3031,7 +3031,7 @@ static int decode_user_data(Mpeg4DecContext *ctx, GetBitContext *gb)
     if (e >= 2) {
         ctx->divx_version = ver;
         ctx->divx_build   = build;
-        h->c.divx_packed  = e == 3 && last == 'p';
+        h->divx_packed  = e == 3 && last == 'p';
     }
 
     /* libavcodec detection */
@@ -3132,7 +3132,7 @@ void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
             h->c.workaround_bugs |= FF_BUG_QPEL_CHROMA2;
 
         if (ctx->xvid_build <= 3U)
-            h->c.padding_bug_score = 256 * 256 * 256 * 64;
+            h->padding_bug_score = 256 * 256 * 256 * 64;
 
         if (ctx->xvid_build <= 1U)
             h->c.workaround_bugs |= FF_BUG_QPEL_CHROMA;
@@ -3170,7 +3170,7 @@ void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
         if (ctx->divx_version >= 0)
             h->c.workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE;
         if (ctx->divx_version == 501 && ctx->divx_build == 20020416)
-            h->c.padding_bug_score = 256 * 256 * 256 * 64;
+            h->padding_bug_score = 256 * 256 * 256 * 64;
 
         if (ctx->divx_version < 500U)
             h->c.workaround_bugs |= FF_BUG_EDGE;
@@ -3199,7 +3199,7 @@ void ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
         av_log(h->c.avctx, AV_LOG_DEBUG,
                "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n",
                h->c.workaround_bugs, ctx->lavc_build, ctx->xvid_build,
-               ctx->divx_version, ctx->divx_build, h->c.divx_packed ? "p" : "");
+               ctx->divx_version, ctx->divx_build, h->divx_packed ? "p" : "");
 
     if (CONFIG_MPEG4_DECODER && ctx->xvid_build >= 0 &&
         avctx->idct_algo == FF_IDCT_AUTO && !h->c.studio_profile) {
@@ -3313,7 +3313,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb,
     if (get_bits1(gb) != 1) {
         if (h->c.avctx->debug & FF_DEBUG_PICT_INFO)
             av_log(h->c.avctx, AV_LOG_ERROR, "vop not coded\n");
-        h->c.skipped_last_frame = 1;
+        h->skipped_last_frame = 1;
         return FRAME_SKIPPED;
     }
     if (ctx->new_pred)
@@ -3740,14 +3740,14 @@ int ff_mpeg4_decode_picture_header(H263DecContext *const h)
 {
     Mpeg4DecContext *const ctx = h263_to_mpeg4(h);
 
-    h->c.skipped_last_frame = 0;
+    h->skipped_last_frame = 0;
 
     if (ctx->bitstream_buffer) {
         int buf_size = get_bits_left(&h->gb) / 8U;
         int bitstream_buffer_size = ctx->bitstream_buffer->size;
         const uint8_t *buf = h->gb.buffer;
 
-        if (h->c.divx_packed) {
+        if (h->divx_packed) {
             for (int i = 0; i < buf_size - 3; i++) {
                 if (buf[i] == 0 && buf[i+1] == 0 && buf[i+2] == 1) {
                     if (buf[i+3] == 0xB0) {
@@ -3759,7 +3759,7 @@ int ff_mpeg4_decode_picture_header(H263DecContext *const h)
             }
         }
         ctx->bitstream_buffer->size = 0;
-        if (bitstream_buffer_size && (h->c.divx_packed || buf_size <= MAX_NVOP_SIZE)) {// divx 5.01+/xvid frame reorder
+        if (bitstream_buffer_size && (h->divx_packed || buf_size <= MAX_NVOP_SIZE)) {// divx 5.01+/xvid frame reorder
             int ret = init_get_bits8(&h->gb, ctx->bitstream_buffer->data,
                                      bitstream_buffer_size);
             if (ret < 0)
@@ -3780,7 +3780,7 @@ int ff_mpeg4_frame_end(AVCodecContext *avctx, const AVPacket *pkt)
     av_assert1(!ctx->bitstream_buffer || !ctx->bitstream_buffer->size);
 
     /* divx 5.01+ bitstream reorder stuff */
-    if (h->c.divx_packed) {
+    if (h->divx_packed) {
         int current_pos     = ctx->bitstream_buffer && h->gb.buffer == ctx->bitstream_buffer->data ? 0 : (get_bits_count(&h->gb) >> 3);
         int startcode_found = 0;
         uint8_t *buf = pkt->data;
@@ -3907,7 +3907,7 @@ static int mpeg4_update_thread_context(AVCodecContext *dst,
     s->enhancement_type          = s1->enhancement_type;
     s->scalability               = s1->scalability;
     s->intra_dc_threshold        = s1->intra_dc_threshold;
-    s->h.c.divx_packed           = s1->h.c.divx_packed;
+    s->h.divx_packed             = s1->h.divx_packed;
     s->divx_version              = s1->divx_version;
     s->divx_build                = s1->divx_build;
     s->xvid_build                = s1->xvid_build;
@@ -3919,7 +3919,9 @@ static int mpeg4_update_thread_context(AVCodecContext *dst,
     s->cplx_estimation_trash_p   = s1->cplx_estimation_trash_p;
     s->cplx_estimation_trash_b   = s1->cplx_estimation_trash_b;
     s->rgb                       = s1->rgb;
-    s->h.c.skipped_last_frame    = s1->h.c.skipped_last_frame;
+
+    s->h.skipped_last_frame      = s1->h.skipped_last_frame;
+    s->h.padding_bug_score       = s1->h.padding_bug_score; // FIXME: racy
 
     memcpy(s->sprite_shift, s1->sprite_shift, sizeof(s1->sprite_shift));
     memcpy(s->sprite_traj,  s1->sprite_traj,  sizeof(s1->sprite_traj));
@@ -3930,11 +3932,11 @@ static int mpeg4_update_thread_context(AVCodecContext *dst,
 static int mpeg4_update_thread_context_for_user(AVCodecContext *dst,
                                                 const AVCodecContext *src)
 {
-    MpegEncContext *m = dst->priv_data;
-    const MpegEncContext *m1 = src->priv_data;
+    H263DecContext *const h = dst->priv_data;
+    const H263DecContext *const h1 = src->priv_data;
 
-    m->quarter_sample = m1->quarter_sample;
-    m->divx_packed    = m1->divx_packed;
+    h->c.quarter_sample = h1->c.quarter_sample;
+    h->divx_packed      = h1->divx_packed;
 
     return 0;
 }
@@ -4054,10 +4056,10 @@ static av_cold int mpeg4_close(AVCodecContext *avctx)
     return ff_mpv_decode_close(avctx);
 }
 
-#define OFFSET(x) offsetof(MpegEncContext, x)
+#define OFFSET(x) offsetof(H263DecContext, x)
 #define FLAGS AV_OPT_FLAG_EXPORT | AV_OPT_FLAG_READONLY
 static const AVOption mpeg4_options[] = {
-    {"quarter_sample", "1/4 subpel MC", OFFSET(quarter_sample), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS},
+    {"quarter_sample", "1/4 subpel MC", OFFSET(c.quarter_sample), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS},
     {"divx_packed", "divx style packed b frames", OFFSET(divx_packed), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS},
     {NULL}
 };
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 4b215bf65f..ff3a249512 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -86,7 +86,6 @@ typedef struct MpegEncContext {
     int width, height;///< picture size. must be a multiple of 16
     enum OutputFormat out_format; ///< output format
     int h263_pred;    ///< use MPEG-4/H.263 ac/dc predictions
-    int pb_frame;     ///< PB-frame mode (0 = none, 1 = base, 2 = improved)
 
 /* the following codec id fields are deprecated in favor of codec_id */
     int h263_flv;     ///< use flv H.263 header
@@ -138,7 +137,6 @@ typedef struct MpegEncContext {
      */
     MPVWorkPicture cur_pic;
 
-    int skipped_last_frame;
     int last_dc[3];                ///< last DC values for MPEG-1
     int16_t *dc_val_base;
     const uint8_t *y_dc_scale_table;     ///< qscale -> y_dc_scale table
@@ -163,9 +161,6 @@ typedef struct MpegEncContext {
     int pict_type;              ///< AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
     int droppable;
 
-    /* motion compensation */
-    int h263_long_vectors;      ///< use horrible H.263v1 long vector mode
-
     BlockDSPContext bdsp;
     H264ChromaContext h264chroma;
     HpelDSPContext hdsp;
@@ -224,7 +219,6 @@ typedef struct MpegEncContext {
     /* H.263 specific */
     int gob_index;
     int obmc;                       ///< overlapped block motion compensation
-    int ehc_mode;
 
     /* H.263+ specific */
     int umvplus;                    ///< == H.263+ && unrestricted_mv
@@ -233,7 +227,6 @@ typedef struct MpegEncContext {
     int alt_inter_vlc;              ///< alternative inter vlc
     int modified_quant;
     int loop_filter;
-    int custom_pcf;
 
     /* MPEG-4 specific */
     int studio_profile;
@@ -250,14 +243,6 @@ typedef struct MpegEncContext {
     int data_partitioning;           ///< data partitioning flag from header
     int partitioned_frame;           ///< is current frame partitioned
     int low_delay;                   ///< no reordering needed / has no B-frames
-    int padding_bug_score;             ///< used to detect the VERY common padding bug in MPEG-4
-
-    /* divx specific, used to workaround (many) bugs in divx5 */
-    int divx_packed;
-
-    /* RV10 specific */
-    int rv10_version; ///< RV10 version: 0 or 3
-    int rv10_first_dc_coded[3];
 
     /* MSMPEG4 specific */
     int slice_height;      ///< in macroblocks
diff --git a/libavcodec/mpegvideo_dec.c b/libavcodec/mpegvideo_dec.c
index c4831bf85b..1ae36dc751 100644
--- a/libavcodec/mpegvideo_dec.c
+++ b/libavcodec/mpegvideo_dec.c
@@ -108,7 +108,6 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst,
 
     // Error/bug resilience
     s->workaround_bugs      = s1->workaround_bugs;
-    s->padding_bug_score    = s1->padding_bug_score;
 
     // MPEG-4 timing info
     memcpy(&s->last_time_base, &s1->last_time_base,
diff --git a/libavcodec/nvdec_mpeg4.c b/libavcodec/nvdec_mpeg4.c
index 0351ee169e..369bd5b997 100644
--- a/libavcodec/nvdec_mpeg4.c
+++ b/libavcodec/nvdec_mpeg4.c
@@ -73,7 +73,7 @@ static int nvdec_mpeg4_start_frame(AVCodecContext *avctx,
             .quant_type                   = m->mpeg_quant,
             .quarter_sample               = s->quarter_sample,
             .short_video_header           = avctx->codec->id == AV_CODEC_ID_H263,
-            .divx_flags                   = s->divx_packed ? 5 : 0,
+            .divx_flags                   = m->h.divx_packed ? 5 : 0,
 
             .vop_coding_type              = s->pict_type - AV_PICTURE_TYPE_I,
             .vop_coded                    = 1,
diff --git a/libavcodec/rv10.c b/libavcodec/rv10.c
index 01cdd1a9dc..bbd0482d59 100644
--- a/libavcodec/rv10.c
+++ b/libavcodec/rv10.c
@@ -127,7 +127,7 @@ static int rv10_decode_picture_header(H263DecContext *const h)
     }
 
     if (h->c.pict_type == AV_PICTURE_TYPE_I) {
-        if (h->c.rv10_version == 3) {
+        if (h->rv10_version == 3) {
             /* specific MPEG like DC coding not used */
             h->c.last_dc[0] = get_bits(&h->gb, 8);
             h->c.last_dc[1] = get_bits(&h->gb, 8);
@@ -369,7 +369,7 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx)
     rv->orig_width  = avctx->coded_width;
     rv->orig_height = avctx->coded_height;
 
-    h->c.h263_long_vectors = avctx->extradata[3] & 1;
+    h->h263_long_vectors = avctx->extradata[3] & 1;
     rv->sub_id           = AV_RB32A(avctx->extradata + 4);
     if (avctx->codec_id == AV_CODEC_ID_RV20) {
         h->c.modified_quant      = 1;
@@ -382,7 +382,7 @@ static av_cold int rv10_decode_init(AVCodecContext *avctx)
 
     switch (major_ver) {
     case 1:
-        h->c.rv10_version = micro_ver ? 3 : 1;
+        h->rv10_version = micro_ver ? 3 : 1;
         h->c.obmc         = micro_ver == 2;
         break;
     case 2:
@@ -475,9 +475,9 @@ static int rv10_decode_packet(AVCodecContext *avctx, const uint8_t *buf,
 
     ff_set_qscale(&h->c, h->c.qscale);
 
-    h->c.rv10_first_dc_coded[0] = 0;
-    h->c.rv10_first_dc_coded[1] = 0;
-    h->c.rv10_first_dc_coded[2] = 0;
+    h->rv10_first_dc_coded[0] = 0;
+    h->rv10_first_dc_coded[1] = 0;
+    h->rv10_first_dc_coded[2] = 0;
     ff_init_block_index(&h->c);
 
     /* decode each macroblock */
-- 
ffmpeg-codebot

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2025-06-23 13:44 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-06-23 13:36 [FFmpeg-devel] [PATCH 00/48] H263DecContext ffmpegagent
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 01/48] avcodec/ituh263dec: Use correct logcontext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 02/48] avcodec/rl: Avoid branch in index lookup Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 03/48] avcodec/ituh263enc: Simplify creating LUT Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 04/48] avcodec/ituh263dec: Only initialize ff_h263_rl_inter when needed Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 05/48] avcodec/mpegvideoenc: Allocate blocks as part of MPVEncContext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 06/48] avcodec/mpegvideo: Add MPVContext typedef Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 07/48] avcodec/mpegvideo_dec: Factor debugging dct coefficients out Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 08/48] avcodec/mpegvideo_dec: Reindent after the previous commit Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 09/48] avcodec/mpeg_er: Don't use MpegEncContext.block Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 10/48] avcodec/mpegvideodec: Remove size expectation from ff_mpv_reconstruct_mb Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 11/48] avcodec/h261dec: Stop using MpegEncContext.gb Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 12/48] avcodec/h261dec: Don't use MpegEncContext.block Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 13/48] avcodec/mpeg12dec: Put GetBitContext on the stack where advantageous Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 14/48] avcodec/mpeg12dec: Remove unused function parameter Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 15/48] avcodec/rv34: Don't use MpegEncContext.gb Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 16/48] avcodec/rv34: Don't use MpegEncContext.block Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 17/48] avcodec/intrax8: Don't pretend to need more than one int16_t[64] Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 18/48] avcodec/vc1: Stop using MpegEncContext.gb Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 19/48] avcodec/vc1: Don't use MpegEncContext.block Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 20/48] avcodec/mpeg12dec: Deduplicate variables Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 21/48] avcodec/mpegvideo: Move flipflop_rounding to {MSMPEG4Dec, MPVEnc}Context Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 22/48] avcodec/mpegvideo: Move unrestricted_mv to MotionEstContext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 23/48] avcodec/mpeg4videodec: Avoid unnecessary indirections Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 24/48] avcodec/{h263, mpeg4video}dec: Pass MPVContext*, not Mpeg4DecContext* Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 25/48] avcodec/mpegvideo: Move dct_precision to Mpeg4DecContext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 26/48] avcodec/h263dec: Add H263DecContext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 27/48] avcodec/h263dec: Remove redundant block parameter from decode_mb Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 28/48] avcodec/h263dec: Don't use MpegEncContext.block Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 29/48] avcodec/h263dec: Stop using MpegEncContext.gb Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 30/48] avcodec/mpeg12dec: Add Mpeg12SliceContext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 31/48] avcodec/mpegvideo: Add missing headers Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 32/48] avcodec/mpeg12dec: Move MpegEncContext.gb to Mpeg12SliceContext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 33/48] avcodec/mpeg12dec: Don't use MPVContext.block Andreas Rheinhardt
2025-06-23 13:36 ` Andreas Rheinhardt [this message]
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 35/48] avcodec/mpegvideo: Move mb_num_left to {H263, RV34}DecContext Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 36/48] avcodec/mpeg12dec: Put mb_skip_run on the stack Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 37/48] avcodec/mpegvideo: Move mb_skip_run to {RV34Dec, MPVEnc}Context Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 38/48] avcodec/mpegvideo: Move SLICE_* defs to h263dec.h, h261dec.c Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 39/48] avcodec/msmpeg4dec: Move ff_msmpeg4_decode_init() down Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 40/48] avcodec/h263dec: Use function ptr for decode_picture_header Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 41/48] avcodec/ituh263enc: Inline value of h263_flv Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 42/48] avcodec/flvdec: Binarize h263_flv Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 43/48] avcodec/mpegvideo: Move fields to {H263Dec, MPVEnc}Context when possible Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 44/48] avcodec/mpeg_er: Allow to skip setting partitioned_frame, p[pb]_time Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 45/48] avcodec/mpegvideo: Move partitioned_frame to {H263Dec, MPVEnc}Context Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 46/48] avcodec/mpegvideo: Move loop_filter to {H263Dec, MPVEnc, VC1}Context Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 47/48] avcodec/rv34: Don't report progress unnecessarily Andreas Rheinhardt
2025-06-23 13:36 ` [FFmpeg-devel] [PATCH 48/48] avcodec/rv34: Fix spelling mistake Andreas Rheinhardt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7d08e91b380bafd1ca7da4f98386e77cbb6d5187.1750685809.git.ffmpegagent@gmail.com \
    --to=ffmpegagent-at-gmail.com@ffmpeg.org \
    --cc=andreas.rheinhardt@outlook.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git