summaryrefslogtreecommitdiff
path: root/libavcodec/mpeg12.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-12-06 16:04:30 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-12-06 16:04:30 +0000
commit945f15b740a09477f93511a21790863efd24abd6 (patch)
tree12a3930f87511bcb49aa5e82a06c0d92fd2c2f74 /libavcodec/mpeg12.c
parent706fc4dea67a0d54eb26ce5024b603cf9bf5afa1 (diff)
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.c32
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) {