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 );
int owidth = *width;
int oheight = *height;
+ // Check for the special case - no aspect ratio means no problem :-)
+ if ( mlt_frame_get_aspect_ratio( this ) == 0 )
+ mlt_properties_set_double( properties, "aspect_ratio", mlt_properties_get_double( properties, "consumer_aspect_ratio" ) );
+
// Hmmm...
char *rescale = mlt_properties_get( properties, "rescale.interp" );
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" );
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;
+
+ //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;
scaled_width = normalised_width;
scaled_height = output_ar / input_ar * normalised_height + 0.5;
}
-
+
// Now calculate the actual image size that we want
owidth = scaled_width * owidth / normalised_width;
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
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 )
// 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 );
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;
}