From 945f15b740a09477f93511a21790863efd24abd6 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 6 Dec 2002 16:04:30 +0000 Subject: mpeg1&2 aspect decoding Originally committed as revision 1318 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpeg12.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) (limited to 'libavcodec/mpeg12.c') diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index e625a72624..51ebc950dc 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -1431,8 +1431,9 @@ static int mpeg1_decode_picture(AVCodecContext *avctx, static void mpeg_decode_sequence_extension(MpegEncContext *s) { int horiz_size_ext, vert_size_ext; - int bit_rate_ext, vbv_buf_ext, low_delay; + int bit_rate_ext, vbv_buf_ext; int frame_rate_ext_n, frame_rate_ext_d; + float aspect; skip_bits(&s->gb, 8); /* profil and level */ s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */ @@ -1445,7 +1446,7 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s) s->bit_rate = ((s->bit_rate / 400) | (bit_rate_ext << 12)) * 400; skip_bits1(&s->gb); /* marker */ vbv_buf_ext = get_bits(&s->gb, 8); - low_delay = get_bits1(&s->gb); + s->low_delay = get_bits1(&s->gb); frame_rate_ext_n = get_bits(&s->gb, 2); frame_rate_ext_d = get_bits(&s->gb, 5); if (frame_rate_ext_d >= 1) @@ -1453,6 +1454,10 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s) dprintf("sequence extension\n"); s->mpeg2 = 1; s->avctx->sub_id = 2; /* indicates mpeg2 found */ + + aspect= mpeg2_aspect[s->aspect_ratio_info]; + if(aspect>0.0) s->avctx->aspect_ratio= s->width/(aspect*s->height); + else if(aspect<0.0) s->avctx->aspect_ratio= -1.0/aspect; } static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) @@ -1706,12 +1711,18 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, Mpeg1Context *s1 = avctx->priv_data; MpegEncContext *s = &s1->mpeg_enc_ctx; int width, height, i, v, j; + float aspect; init_get_bits(&s->gb, buf, buf_size); width = get_bits(&s->gb, 12); height = get_bits(&s->gb, 12); - skip_bits(&s->gb, 4); + s->aspect_ratio_info= get_bits(&s->gb, 4); + if(!s->mpeg2){ + aspect= mpeg1_aspect[s->aspect_ratio_info]; + if(aspect!=0.0) avctx->aspect_ratio= width/(aspect*height); + } + s->frame_rate_index = get_bits(&s->gb, 4); if (s->frame_rate_index == 0) return -1; @@ -1896,15 +1907,16 @@ static int mpeg_decode_frame(AVCodecContext *avctx, s->buffer, input_size); break; default: - /* skip b frames if we dont have reference frames */ - if(s2->last_picture.data[0]==NULL && s2->pict_type==B_TYPE) break; - /* skip b frames if we are in a hurry */ - if(avctx->hurry_up && s2->pict_type==B_TYPE) break; - /* skip everything if we are in a hurry>=5 */ - if(avctx->hurry_up>=5) break; - if (start_code >= SLICE_MIN_START_CODE && start_code <= SLICE_MAX_START_CODE) { + + /* skip b frames if we dont have reference frames */ + if(s2->last_picture.data[0]==NULL && s2->pict_type==B_TYPE) break; + /* skip b frames if we are in a hurry */ + if(avctx->hurry_up && s2->pict_type==B_TYPE) break; + /* skip everything if we are in a hurry>=5 */ + if(avctx->hurry_up>=5) break; + ret = mpeg_decode_slice(avctx, picture, start_code, s->buffer, input_size); if (ret == DECODE_SLICE_EOP) { -- cgit v1.2.3