You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
avcodec/mpegvideo: Move frame_rate_index to (Mpeg1|MPEG12Enc)Context
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@@ -70,6 +70,7 @@ typedef struct Mpeg1Context {
|
|||||||
int save_width, save_height, save_progressive_seq;
|
int save_width, save_height, save_progressive_seq;
|
||||||
int rc_buffer_size;
|
int rc_buffer_size;
|
||||||
AVRational frame_rate_ext; /* MPEG-2 specific framerate modificator */
|
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 sync; /* Did we reach a sync point like a GOP/SEQ/KEYFrame? */
|
||||||
int closed_gop;
|
int closed_gop;
|
||||||
int tmpgexs;
|
int tmpgexs;
|
||||||
@@ -1297,7 +1298,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
|
|||||||
|
|
||||||
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
|
||||||
// MPEG-1 fps
|
// 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->ticks_per_frame = 1;
|
||||||
|
|
||||||
avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
|
avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
|
||||||
@@ -1305,8 +1306,8 @@ static int mpeg_decode_postinit(AVCodecContext *avctx)
|
|||||||
// MPEG-2 fps
|
// MPEG-2 fps
|
||||||
av_reduce(&s->avctx->framerate.num,
|
av_reduce(&s->avctx->framerate.num,
|
||||||
&s->avctx->framerate.den,
|
&s->avctx->framerate.den,
|
||||||
ff_mpeg12_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num,
|
ff_mpeg12_frame_rate_tab[s1->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].den * s1->frame_rate_ext.den,
|
||||||
1 << 30);
|
1 << 30);
|
||||||
avctx->ticks_per_frame = 2;
|
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))
|
if (avctx->err_recognition & (AV_EF_BITSTREAM | AV_EF_COMPLIANT))
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
s->frame_rate_index = get_bits(&s->gb, 4);
|
s1->frame_rate_index = get_bits(&s->gb, 4);
|
||||||
if (s->frame_rate_index == 0 || s->frame_rate_index > 13) {
|
if (s1->frame_rate_index == 0 || s1->frame_rate_index > 13) {
|
||||||
av_log(avctx, AV_LOG_WARNING,
|
av_log(avctx, AV_LOG_WARNING,
|
||||||
"frame_rate_index %d is invalid\n", s->frame_rate_index);
|
"frame_rate_index %d is invalid\n", s1->frame_rate_index);
|
||||||
s->frame_rate_index = 1;
|
s1->frame_rate_index = 1;
|
||||||
}
|
}
|
||||||
s->bit_rate = get_bits(&s->gb, 18) * 400LL;
|
s->bit_rate = get_bits(&s->gb, 18) * 400LL;
|
||||||
if (check_marker(s->avctx, &s->gb, "in sequence header") == 0) {
|
if (check_marker(s->avctx, &s->gb, "in sequence header") == 0) {
|
||||||
|
@@ -65,6 +65,7 @@ static uint32_t mpeg1_chr_dc_uni[512];
|
|||||||
typedef struct MPEG12EncContext {
|
typedef struct MPEG12EncContext {
|
||||||
MpegEncContext mpeg;
|
MpegEncContext mpeg;
|
||||||
AVRational frame_rate_ext;
|
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
|
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
|
|| av_nearer_q(target, bestq, q) < 0
|
||||||
|| ext.num==1 && ext.den==1 && av_nearer_q(target, bestq, q) == 0) {
|
|| ext.num==1 && ext.den==1 && av_nearer_q(target, bestq, q) == 0) {
|
||||||
bestq = q;
|
bestq = q;
|
||||||
s->frame_rate_index = i;
|
mpeg12->frame_rate_index = i;
|
||||||
mpeg12->frame_rate_ext.num = ext.num;
|
mpeg12->frame_rate_ext.num = ext.num;
|
||||||
mpeg12->frame_rate_ext.den = ext.den;
|
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);
|
mpeg12->drop_frame_timecode = mpeg12->drop_frame_timecode || !!(avctx->flags2 & AV_CODEC_FLAG2_DROP_FRAME_TIMECODE);
|
||||||
if (mpeg12->drop_frame_timecode)
|
if (mpeg12->drop_frame_timecode)
|
||||||
mpeg12->tc.flags |= AV_TIMECODE_FLAG_DROPFRAME;
|
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,
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
"Drop frame time code only allowed with 1001/30000 fps\n");
|
"Drop frame time code only allowed with 1001/30000 fps\n");
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mpeg12->tc_opt_str) {
|
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);
|
int ret = av_timecode_init_from_string(&mpeg12->tc, rate, mpeg12->tc_opt_str, s);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -266,7 +267,7 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s)
|
|||||||
MPEG12EncContext *const mpeg12 = (MPEG12EncContext*)s;
|
MPEG12EncContext *const mpeg12 = (MPEG12EncContext*)s;
|
||||||
unsigned int vbv_buffer_size, fps, v;
|
unsigned int vbv_buffer_size, fps, v;
|
||||||
int constraint_parameter_flag;
|
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;
|
uint64_t time_code;
|
||||||
int64_t best_aspect_error = INT64_MAX;
|
int64_t best_aspect_error = INT64_MAX;
|
||||||
AVRational aspect_ratio = s->avctx->sample_aspect_ratio;
|
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, 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) {
|
if (s->avctx->rc_max_rate) {
|
||||||
v = (s->avctx->rc_max_rate + 399) / 400;
|
v = (s->avctx->rc_max_rate + 399) / 400;
|
||||||
|
@@ -201,7 +201,6 @@ typedef struct MpegEncContext {
|
|||||||
int last_pict_type; //FIXME removes
|
int last_pict_type; //FIXME removes
|
||||||
int last_non_b_pict_type; ///< used for MPEG-4 gmc B-frames & ratecontrol
|
int last_non_b_pict_type; ///< used for MPEG-4 gmc B-frames & ratecontrol
|
||||||
int droppable;
|
int droppable;
|
||||||
int frame_rate_index;
|
|
||||||
int last_lambda_for[5]; ///< last lambda for a specific pict type
|
int last_lambda_for[5]; ///< last lambda for a specific pict type
|
||||||
int skipdct; ///< skip dct and code zero residual
|
int skipdct; ///< skip dct and code zero residual
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user