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 e5a4cc9b81..cc1766a1c4 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