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;
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
// 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 );
}
}
- return 0;
+ return error;
}
/** Filter processing.