Commit edbd72ac authored by Ivan Schreter's avatar Ivan Schreter Committed by Carl Eugen Hoyos

Correct time_base and repeat_pict for MPEG2 video.

Patch by Ivan Schreter, schreter gmx net

Originally committed as revision 17572 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent fc9fe428
...@@ -1275,7 +1275,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx){ ...@@ -1275,7 +1275,7 @@ static int mpeg_decode_postinit(AVCodecContext *avctx){
av_reduce( av_reduce(
&s->avctx->time_base.den, &s->avctx->time_base.den,
&s->avctx->time_base.num, &s->avctx->time_base.num,
ff_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num, ff_frame_rate_tab[s->frame_rate_index].num * s1->frame_rate_ext.num*2,
ff_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den, ff_frame_rate_tab[s->frame_rate_index].den * s1->frame_rate_ext.den,
1<<30); 1<<30);
//MPEG-2 aspect //MPEG-2 aspect
......
...@@ -81,7 +81,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, ...@@ -81,7 +81,7 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s,
pc->height |=( vert_size_ext << 12); pc->height |=( vert_size_ext << 12);
avctx->bit_rate += (bit_rate_ext << 18) * 400; avctx->bit_rate += (bit_rate_ext << 18) * 400;
avcodec_set_dimensions(avctx, pc->width, pc->height); avcodec_set_dimensions(avctx, pc->width, pc->height);
avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1); avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1) * 2;
avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1); avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1);
avctx->codec_id = CODEC_ID_MPEG2VIDEO; avctx->codec_id = CODEC_ID_MPEG2VIDEO;
avctx->sub_id = 2; /* forces MPEG2 */ avctx->sub_id = 2; /* forces MPEG2 */
...@@ -95,14 +95,15 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s, ...@@ -95,14 +95,15 @@ static void mpegvideo_extract_headers(AVCodecParserContext *s,
progressive_frame = buf[4] & (1 << 7); progressive_frame = buf[4] & (1 << 7);
/* check if we must repeat the frame */ /* check if we must repeat the frame */
s->repeat_pict = 1;
if (repeat_first_field) { if (repeat_first_field) {
if (pc->progressive_sequence) { if (pc->progressive_sequence) {
if (top_field_first) if (top_field_first)
s->repeat_pict = 4; s->repeat_pict = 5;
else else
s->repeat_pict = 2; s->repeat_pict = 3;
} else if (progressive_frame) { } else if (progressive_frame) {
s->repeat_pict = 1; s->repeat_pict = 2;
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment