[FFmpeg-devel] [PATCH 21/21] avcodec/mpegvideo: Move frame_rate_index to (Mpeg1|MPEG12Enc)Context

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Tue Jan 25 19:41:48 EET 2022


Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
 libavcodec/mpeg12dec.c | 15 ++++++++-------
 libavcodec/mpeg12enc.c | 11 ++++++-----
 libavcodec/mpegvideo.h |  1 -
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c
index 0c5eddb7f1..4a7bd6d466 100644
--- a/libavcodec/mpeg12dec.c
+++ b/libavcodec/mpeg12dec.c
@@ -70,6 +70,7 @@ typedef struct Mpeg1Context {
     int save_width, save_height, save_progressive_seq;
     int rc_buffer_size;
     AVRational frame_rate_ext;  /* MPEG-2 specific framerate modificator */
+    unsigned frame_rate_index;
     int sync;                   /* Did we reach a sync point like a GOP/SEQ/KEYFrame? */
     int closed_gop;
     int tmpgexs;
@@ -1297,7 +1298,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
 
         if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
             // MPEG-1 fps
-            avctx->framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
+            avctx->framerate = ff_mpeg12_frame_rate_tab[s1->frame_rate_index];
             avctx->ticks_per_frame     = 1;
 
             avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
@@ -1305,8 +1306,8 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
             // MPEG-2 fps
             av_reduce(&s->avctx->framerate.num,
                       &s->avctx->framerate.den,
-                      ff_mpeg12_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num,
-                      ff_mpeg12_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
+                      ff_mpeg12_frame_rate_tab[s1->frame_rate_index].num * s1->frame_rate_ext.num,
+                      ff_mpeg12_frame_rate_tab[s1->frame_rate_index].den * s1->frame_rate_ext.den,
                       1 << 30);
             avctx->ticks_per_frame = 2;
 
@@ -2110,11 +2111,11 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx,
         if (avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_COMPLIANT))
             return AVERROR_INVALIDDATA;
     }
-    s->frame_rate_index = get_bits(&s->gb, 4);
-    if (s->frame_rate_index == 0 || s->frame_rate_index > 13) {
+    s1->frame_rate_index = get_bits(&s->gb, 4);
+    if (s1->frame_rate_index == 0 || s1->frame_rate_index > 13) {
         av_log(avctx, AV_LOG_WARNING,
-               "frame_rate_index %d is invalid\n", s->frame_rate_index);
-        s->frame_rate_index = 1;
+               "frame_rate_index %d is invalid\n", s1->frame_rate_index);
+        s1->frame_rate_index = 1;
     }
     s->bit_rate = get_bits(&s->gb, 18) * 400LL;
     if (check_marker(s->avctx, &s->gb, "in sequence header") == 0) {
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index eaab968425..ecb90d1a41 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -65,6 +65,7 @@ static uint32_t mpeg1_chr_dc_uni[512];
 typedef struct MPEG12EncContext {
     MpegEncContext mpeg;
     AVRational frame_rate_ext;
+    unsigned frame_rate_index;
 
     int gop_picture_number;  ///< index of the first picture of a GOP based on fake_pic_num
 
@@ -144,7 +145,7 @@ static int find_frame_rate_index(MPEG12EncContext *mpeg12)
                     || av_nearer_q(target, bestq, q) < 0
                     || ext.num==1 && ext.den==1 && av_nearer_q(target, bestq, q) == 0) {
                     bestq               = q;
-                    s->frame_rate_index = i;
+                    mpeg12->frame_rate_index   = i;
                     mpeg12->frame_rate_ext.num = ext.num;
                     mpeg12->frame_rate_ext.den = ext.den;
                 }
@@ -233,14 +234,14 @@ static av_cold int encode_init(AVCodecContext *avctx)
     mpeg12->drop_frame_timecode = mpeg12->drop_frame_timecode || !!(avctx->flags2 & AV_CODEC_FLAG2_DROP_FRAME_TIMECODE);
     if (mpeg12->drop_frame_timecode)
         mpeg12->tc.flags |= AV_TIMECODE_FLAG_DROPFRAME;
-    if (mpeg12->drop_frame_timecode && s->frame_rate_index != 4) {
+    if (mpeg12->drop_frame_timecode && mpeg12->frame_rate_index != 4) {
         av_log(avctx, AV_LOG_ERROR,
                "Drop frame time code only allowed with 1001/30000 fps\n");
         return AVERROR(EINVAL);
     }
 
     if (mpeg12->tc_opt_str) {
-        AVRational rate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
+        AVRational rate = ff_mpeg12_frame_rate_tab[mpeg12->frame_rate_index];
         int ret = av_timecode_init_from_string(&mpeg12->tc, rate, mpeg12->tc_opt_str, s);
         if (ret < 0)
             return ret;
@@ -266,7 +267,7 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s)
     MPEG12EncContext *const mpeg12 = (MPEG12EncContext*)s;
     unsigned int vbv_buffer_size, fps, v;
     int constraint_parameter_flag;
-    AVRational framerate = ff_mpeg12_frame_rate_tab[s->frame_rate_index];
+    AVRational framerate = ff_mpeg12_frame_rate_tab[mpeg12->frame_rate_index];
     uint64_t time_code;
     int64_t best_aspect_error = INT64_MAX;
     AVRational aspect_ratio = s->avctx->sample_aspect_ratio;
@@ -300,7 +301,7 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s)
     }
 
     put_bits(&s->pb, 4, aspect_ratio_info);
-    put_bits(&s->pb, 4, s->frame_rate_index);
+    put_bits(&s->pb, 4, mpeg12->frame_rate_index);
 
     if (s->avctx->rc_max_rate) {
         v = (s->avctx->rc_max_rate + 399) / 400;
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 9243edefce..0b76a460c9 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -201,7 +201,6 @@ typedef struct MpegEncContext {
     int last_pict_type; //FIXME removes
     int last_non_b_pict_type;   ///< used for MPEG-4 gmc B-frames & ratecontrol
     int droppable;
-    int frame_rate_index;
     int last_lambda_for[5];     ///< last lambda for a specific pict type
     int skipdct;                ///< skip dct and code zero residual
 
-- 
2.32.0



More information about the ffmpeg-devel mailing list