# HG changeset patch # User michaelni # Date 1039190670 0 # Node ID d3aa313dc3731174f791da8dfa00c6c4feb6e297 # Parent 259f3efebef5e6a0ef5892b14fba45a00d724775 mpeg1&2 aspect decoding diff -r 259f3efebef5 -r d3aa313dc373 mpeg12.c --- a/mpeg12.c Fri Dec 06 15:01:48 2002 +0000 +++ b/mpeg12.c Fri Dec 06 16:04:30 2002 +0000 @@ -1431,8 +1431,9 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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) { diff -r 259f3efebef5 -r d3aa313dc373 mpeg12data.h --- a/mpeg12data.h Fri Dec 06 15:01:48 2002 +0000 +++ b/mpeg12data.h Fri Dec 06 16:04:30 2002 +0000 @@ -411,4 +411,32 @@ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, }; +static const float mpeg1_aspect[16]={ + 0.0000, + 1.0000, + 0.6735, + 0.7031, + + 0.7615, + 0.8055, + 0.8437, + 0.8935, + 0.9157, + 0.9815, + 1.0255, + 1.0695, + + 1.0950, + 1.1575, + 1.2015, +}; + +static const float mpeg2_aspect[16]={ + 0, + 1.0, + -3.0/4.0, + -9.0/16.0, + -1.0/2.21, +}; +