changeset 887:19f5b8b7c6d5 libavcodec

fixing aspect
author michaelni
date Mon, 25 Nov 2002 09:23:19 +0000
parents 3abff5a87548
children 4513713d664a
files h263.c h263dec.c
diffstat 2 files changed, 26 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/h263.c	Sat Nov 23 10:58:05 2002 +0000
+++ b/h263.c	Mon Nov 25 09:23:19 2002 +0000
@@ -120,24 +120,25 @@
     return format;
 }
 
-static void init_aspect_info(MpegEncContext * s){
-    double aspect;
+static void float_aspect_to_info(MpegEncContext * s, float aspect){
+    int i;
+
+    aspect*= s->height/(double)s->width;
+//printf("%f\n", aspect);
     
-    emms_c(); //paranoia ;)
-    
-    if(s->avctx->aspect_ratio==0) aspect= 1.0;
-    aspect= s->avctx->aspect_ratio;
-    
+    if(aspect==0) aspect= 1.0;
+
     ff_float2fraction(&s->aspected_width, &s->aspected_height, aspect, 255);
+
+//printf("%d %d\n", s->aspected_width, s->aspected_height);
+    for(i=1; i<6; i++){
+        if(s->aspected_width == pixel_aspect[i][0] && s->aspected_height== pixel_aspect[i][1]){
+            s->aspect_ratio_info=i;
+            return;
+        }
+    }
     
-    if(s->aspected_width == 4 && s->aspected_height == 3)
-        s->aspect_ratio_info= FF_ASPECT_4_3_625;
-    else if(s->aspected_width == 16 && s->aspected_height == 9)
-        s->aspect_ratio_info= FF_ASPECT_16_9_625;
-    else if(s->aspected_width == 1 && s->aspected_height == 1)
-        s->aspect_ratio_info= FF_ASPECT_SQUARE;
-    else
-        s->aspect_ratio_info= FF_ASPECT_EXTENDED;
+    s->aspect_ratio_info= FF_ASPECT_EXTENDED;
 }
 
 void h263_encode_picture_header(MpegEncContext * s, int picture_number)
@@ -216,7 +217,7 @@
 		
 		if (format == 7) {
             /* Custom Picture Format (CPFMT) */
-            init_aspect_info(s);
+            float_aspect_to_info(s, s->avctx->aspect_ratio);
 
             put_bits(&s->pb,4,s->aspect_ratio_info);
             put_bits(&s->pb,9,(s->width >> 2) - 1);
@@ -1527,7 +1528,7 @@
       put_bits(&s->pb, 4, vo_ver_id);	/* is obj layer ver id */
       put_bits(&s->pb, 3, 1);		/* is obj layer priority */
     
-    init_aspect_info(s);
+    float_aspect_to_info(s, s->avctx->aspect_ratio);
 
     put_bits(&s->pb, 4, s->aspect_ratio_info);/* aspect ratio info */
     if (s->aspect_ratio_info == FF_ASPECT_EXTENDED)
@@ -3833,6 +3834,9 @@
                     /* aspected dimensions */
 		    s->aspected_width = get_bits(&s->gb, 8);
 		    s->aspected_height = get_bits(&s->gb, 8);
+                }else{
+                    s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
+                    s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
                 }
             } else {
                 width = h263_format[format][0];
@@ -4098,6 +4102,9 @@
     if(s->aspect_ratio_info == FF_ASPECT_EXTENDED){	    
         s->aspected_width = get_bits(gb, 8); // par_width
         s->aspected_height = get_bits(gb, 8); // par_height
+    }else{
+        s->aspected_width = pixel_aspect[s->aspect_ratio_info][0];
+        s->aspected_height= pixel_aspect[s->aspect_ratio_info][1];
     }
 
     if ((s->vol_control_parameters=get_bits1(gb))) { /* vol control parameter */
--- a/h263dec.c	Sat Nov 23 10:58:05 2002 +0000
+++ b/h263dec.c	Mon Nov 25 09:23:19 2002 +0000
@@ -495,10 +495,10 @@
         /* FIXME: By the way H263 decoder is evolving it should have */
         /* an H263EncContext                                         */
     if(s->aspected_height)
-        new_aspect= (float)s->aspected_width / (float)s->aspected_height;
+        new_aspect= s->aspected_width*s->width / (float)(s->height*s->aspected_height);
     else
         new_aspect=0;
-
+    
     if (   s->width != avctx->width || s->height != avctx->height 
         || ABS(new_aspect - avctx->aspect_ratio) > 0.001) {
         /* H.263 could change picture size any time */