// Aspect ratio and other jiggery pokery
mlt_properties_set_double( frame_properties, "consumer_aspect_ratio", mlt_properties_get_double( properties, "aspect_ratio" ) );
mlt_properties_set_int( frame_properties, "consumer_deinterlace", mlt_properties_get_int( properties, "progressive" ) | mlt_properties_get_int( properties, "deinterlace" ) );
+ mlt_properties_set( frame_properties, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) );
}
// Return the frame
mlt_properties_set_int( frame_properties, "distort", mlt_properties_get_int( properties, "distort" ) );
mlt_properties_set_double( frame_properties, "consumer_aspect_ratio", mlt_properties_get_double( properties, "consumer_aspect_ratio" ) );
mlt_properties_set_int( frame_properties, "consumer_deinterlace", mlt_properties_get_double( properties, "consumer_deinterlace" ) );
+ mlt_properties_set( frame_properties, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) );
mlt_properties_set_int( frame_properties, "normalised_width", mlt_properties_get_double( properties, "normalised_width" ) );
mlt_properties_set_int( frame_properties, "normalised_height", mlt_properties_get_double( properties, "normalised_height" ) );
mlt_frame_get_image( frame, buffer, format, width, height, writable );
static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable )
{
int error = 0;
-
+ int deinterlace = mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "consumer_deinterlace" );
+
+ // Determine if we need a writable version or not
+ if ( deinterlace && !writable )
+ writable = !mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "progressive" );
+
// Get the input image
- error = mlt_frame_get_image( this, image, format, width, height, 1 );
+ error = mlt_frame_get_image( this, image, format, width, height, writable );
// Check that we want progressive and we aren't already progressive
- if ( *format == mlt_image_yuv422 && *image != NULL &&
- !mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "progressive" ) &&
- mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "consumer_deinterlace" ) )
+ if ( deinterlace && *format == mlt_image_yuv422 && *image != NULL )
{
// Create a picture
AVPicture *output = mlt_pool_alloc( sizeof( AVPicture ) );
mlt_properties play = MLT_CONSUMER_PROPERTIES( this->play );
mlt_properties still = MLT_CONSUMER_PROPERTIES( this->still );
+ int progressive = mlt_properties_get_int( properties, "progressive" ) | mlt_properties_get_int( properties, "deinterlace" );
+
if ( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE ) < 0 )
{
fprintf( stderr, "Failed to initialize SDL: %s\n", SDL_GetError() );
mlt_properties_set_int( play, "height", mlt_properties_get_int( properties, "height" ) );
mlt_properties_set_int( still, "height", mlt_properties_get_int( properties, "height" ) );
- mlt_properties_set_int( play, "progressive", 1 );
- mlt_properties_set_int( still, "progressive", 1 );
+ mlt_properties_set_int( play, "progressive", progressive );
+ mlt_properties_set_int( still, "progressive", progressive );
+ mlt_properties_set( play, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) );
+ mlt_properties_set( still, "deinterlace_method", mlt_properties_get( properties, "deinterlace_method" ) );
mlt_properties_pass( play, MLT_CONSUMER_PROPERTIES( consumer ), "play." );
mlt_properties_pass( still, MLT_CONSUMER_PROPERTIES( consumer ), "still." );
static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable )
{
int error = 0;
+ int deinterlace = mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "consumer_deinterlace" );
// Pop the service off the stack
mlt_filter filter = mlt_frame_pop_service( this );
+ // Determine if we need a writable version or not
+ if ( deinterlace && !writable )
+ writable = !mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "progressive" );
+
+ // Get the input image
+ error = mlt_frame_get_image( this, image, format, width, height, writable );
+
// Check that we want progressive and we aren't already progressive
- if ( *format == mlt_image_yuv422 && *image != NULL &&
- !mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "progressive" ) &&
- mlt_properties_get_int( MLT_FRAME_PROPERTIES( this ), "consumer_deinterlace" ) )
+ if ( deinterlace && *format == mlt_image_yuv422 && *image != NULL )
{
- // Get the input image
- error = mlt_frame_get_image( this, image, format, width, height, 1 );
-
// Determine deinterlace method
char *method_str = mlt_properties_get( MLT_FILTER_PROPERTIES( filter ), "method" );
int method = DEINTERLACE_LINEARBLEND;
+ char *frame_method_str = mlt_properties_get( MLT_FRAME_PROPERTIES( this ), "deinterlace_method" );
- if ( method_str == NULL )
- method_str = mlt_properties_get( MLT_FRAME_PROPERTIES( this ), "deinterlace_method" );
+ if ( frame_method_str != NULL )
+ method_str = frame_method_str;
if ( method_str == NULL )
- mlt_properties_set( MLT_FILTER_PROPERTIES( filter ), "method", "linearblend" );
+ method = DEINTERLACE_LINEARBLEND;
else if ( strcmp( method_str, "bob" ) == 0 )
method = DEINTERLACE_BOB;
else if ( strcmp( method_str, "weave" ) == 0 )
// Make sure that others know the frame is deinterlaced
mlt_properties_set_int( MLT_FRAME_PROPERTIES( this ), "progressive", 1 );
}
- else
- {
- // Get the input image
- error = mlt_frame_get_image( this, image, format, width, height, writable );
- }
return error;
}