Sanity checks for normalising filters
[melted] / src / modules / core / filter_resize.c
index 435cf12..d245ed0 100644 (file)
@@ -34,7 +34,7 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
        int error = 0;
 
        // Get the properties from the frame
-       mlt_properties properties = mlt_frame_properties( this );
+       mlt_properties properties = MLT_FRAME_PROPERTIES( this );
 
        // Pop the top of stack now
        mlt_filter filter = mlt_frame_pop_service( this );
@@ -48,7 +48,7 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
        if ( rescale != NULL && !strcmp( rescale, "none" ) )
                return mlt_frame_get_image( this, image, format, width, height, writable );
 
-       if ( mlt_properties_get( properties, "distort" ) == NULL )
+       if ( mlt_properties_get_int( properties, "distort" ) == 0 )
        {
                // Normalise the input and out display aspect
                int normalised_width = mlt_properties_get_int( properties, "normalised_width" );
@@ -62,6 +62,8 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
                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;
                
+               //fprintf( stderr, "normalised %dx%d output %dx%d %f %f\n", normalised_width, normalised_height, owidth, oheight, ( float )output_ar, ( float )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 = input_ar / output_ar * normalised_width + 0.5;
                int scaled_height = normalised_height;
@@ -78,7 +80,7 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
                oheight = scaled_height * oheight / normalised_height;
 
                // Tell frame we have conformed the aspect to the consumer
-               mlt_frame_set_aspect_ratio( this, output_ar );
+               mlt_frame_set_aspect_ratio( this, mlt_properties_get_double( properties, "consumer_aspect_ratio" ) );
        }
 
        // Now pass on the calculations down the line
@@ -89,10 +91,10 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
        error = mlt_frame_get_image( this, image, format, &owidth, &oheight, writable );
 
        // We only know how to process yuv422 at the moment
-       if ( error == 0 && *format == mlt_image_yuv422 )
+       if ( error == 0 && *format == mlt_image_yuv422 && *image != NULL )
        {
                // Get the requested scale operation
-               char *op = mlt_properties_get( mlt_filter_properties( filter ), "scale" );
+               char *op = mlt_properties_get( MLT_FILTER_PROPERTIES( filter ), "scale" );
 
                // Correct field order if needed
                if ( mlt_properties_get_int( properties, "top_field_first" ) == 1 )
@@ -104,10 +106,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 );
 
@@ -156,7 +161,7 @@ mlt_filter filter_resize_init( char *arg )
        if ( mlt_filter_init( this, this ) == 0 )
        {
                this->process = filter_process;
-               mlt_properties_set( mlt_filter_properties( this ), "scale", arg == NULL ? "off" : arg );
+               mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "scale", arg == NULL ? "off" : arg );
        }
        return this;
 }