changeset 917:d3aa313dc373 libavcodec

mpeg1&2 aspect decoding
author michaelni
date Fri, 06 Dec 2002 16:04:30 +0000
parents 259f3efebef5
children f9e54ade14a1
files mpeg12.c mpeg12data.h
diffstat 2 files changed, 50 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- 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) {
--- 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,
+};
+