diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-12-06 16:04:30 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-12-06 16:04:30 +0000 |
commit | 945f15b740a09477f93511a21790863efd24abd6 (patch) | |
tree | 12a3930f87511bcb49aa5e82a06c0d92fd2c2f74 /libavcodec/mpeg12.c | |
parent | 706fc4dea67a0d54eb26ce5024b603cf9bf5afa1 (diff) | |
download | ffmpeg-945f15b740a09477f93511a21790863efd24abd6.tar.gz |
mpeg1&2 aspect decoding
Originally committed as revision 1318 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpeg12.c')
-rw-r--r-- | libavcodec/mpeg12.c | 32 |
1 files changed, 22 insertions, 10 deletions
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) { |