field order normalisation fix, add .vob to fezzik, field order detection for avformat
[melted] / src / modules / core / filter_resize.c
index 4122d8f..1d551c2 100644 (file)
@@ -53,18 +53,24 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
                // Normalise the input and out display aspect
                int normalised_width = mlt_properties_get_int( properties, "normalised_width" );
                int normalised_height = mlt_properties_get_int( properties, "normalised_height" );
-               double input_ar = mlt_frame_get_aspect_ratio( this );
-               double output_ar = mlt_properties_get_double( properties, "consumer_aspect_ratio" );
+               int real_width = mlt_properties_get_int( properties, "real_width" );
+               int real_height = mlt_properties_get_int( properties, "real_height" );
+               if ( real_width == 0 )
+                       real_width = mlt_properties_get_int( properties, "width" );
+               if ( real_height == 0 )
+                       real_height = mlt_properties_get_int( properties, "height" );
+               double input_ar = mlt_frame_get_aspect_ratio( this ) * real_width / real_height;
+               double output_ar = mlt_properties_get_double( properties, "consumer_aspect_ratio" ) * owidth / oheight;
                
                // Optimised for the input_ar > output_ar case (e.g. widescreen on standard)
-               int scaled_width = normalised_width;
-               int scaled_height = output_ar / input_ar * normalised_height;
+               int scaled_width = input_ar / output_ar * normalised_width + 0.5;
+               int scaled_height = normalised_height;
 
-               // Now ensure that our images fit in the normalised frame
-               if ( scaled_height > normalised_height )
+               // Now ensure that our images fit in the output frame
+               if ( scaled_width > normalised_width )
                {
-                       scaled_width = input_ar / output_ar * normalised_width;
-                       scaled_height = normalised_height;
+                       scaled_width = normalised_width;
+                       scaled_height = output_ar / input_ar * normalised_height + 0.5;
                }
        
                // Now calculate the actual image size that we want
@@ -98,10 +104,13 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
                        // Keep the original image around to be destroyed on frame close
                        mlt_properties_rename( properties, "image", "original_image" );
 
+                       // Duplicate the last line in the field to avoid artifact
+                       memcpy( image + oheight * owidth * 2, image + oheight * owidth * 2 - owidth * 4, owidth * 2 );
+
                        // Offset the image pointer by one line
                        image += owidth * 2;
                        size -= owidth * 2;
-
+                       
                        // Set the new image pointer with no destructor
                        mlt_properties_set_data( properties, "image", image, size, NULL, NULL );
 
@@ -124,7 +133,7 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
                }
        }
 
-       return 0;
+       return error;
 }
 
 /** Filter processing.
@@ -154,4 +163,3 @@ mlt_filter filter_resize_init( char *arg )
        }
        return this;
 }
-