]> git.sesse.net Git - mlt/blobdiff - src/modules/gtk2/producer_pixbuf.c
src/framework/mlt_frame.c
[mlt] / src / modules / gtk2 / producer_pixbuf.c
index 7f8b46c9c6c1ba1d4feb9cdb7b5a1dbaed3edd53..e2f4d252bf5b23c3cab864a137e8c6b8378b4dd0 100644 (file)
@@ -79,6 +79,8 @@ mlt_producer producer_pixbuf_init( char *filename )
                // Set the default properties
                mlt_properties_set( properties, "resource", filename );
                mlt_properties_set_int( properties, "ttl", 25 );
+               mlt_properties_set_int( properties, "aspect_ratio", 1 );
+               mlt_properties_set_int( properties, "progressive", 1 );
                
                return producer;
        }
@@ -242,8 +244,8 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
 
        // Clone if necessary
        // NB: Cloning is necessary with this producer (due to processing of images ahead of use)
-       // The fault is not in the design of mlt, but in the implementation of pixbuf...
-       //if ( writable )
+       // The fault is not in the design of mlt, but in the implementation of the pixbuf producer...
+       if ( image != NULL )
        {
                // Clone our image
                uint8_t *copy = mlt_pool_alloc( size );
@@ -256,6 +258,11 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
                // Now update properties so we free the copy after
                mlt_properties_set_data( properties, "image", copy, size, mlt_pool_release, NULL );
        }
+       else
+       {
+               // Fall back to the test card...
+               mlt_frame_get_image( frame, buffer, format, width, height, writable );
+       }
 
        // Pass on the image
        *buffer = image;
@@ -277,10 +284,12 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
        // Get the real structure for this producer
        producer_pixbuf this = producer->child;
 
-       if ( this->count == 0 && mlt_properties_get( MLT_PRODUCER_PROPERTIES( producer ), "resource" ) != NULL )
+       // Fetch the producers properties
+       mlt_properties producer_properties = MLT_PRODUCER_PROPERTIES( producer );
+
+       if ( this->count == 0 && mlt_properties_get( producer_properties, "resource" ) != NULL )
        {
-               mlt_properties properties = MLT_PRODUCER_PROPERTIES( producer );
-               char *filename = mlt_properties_get( properties, "resource" );
+               char *filename = mlt_properties_get( producer_properties, "resource" );
                
                // Read xml string
                if ( strstr( filename, "<svg" ) )
@@ -308,14 +317,14 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
                                this->filenames[ this->count ++ ] = strdup( fullname );
 
                                // Teehe - when the producer closes, delete the temp file and the space allo
-                               mlt_properties_set_data( properties, "__temporary_file__", this->filenames[ this->count - 1 ], 0, ( mlt_destructor )unlink, NULL );
+                               mlt_properties_set_data( producer_properties, "__temporary_file__", this->filenames[ this->count - 1 ], 0, ( mlt_destructor )unlink, NULL );
                        }
                }
                // Obtain filenames
                else if ( strchr( filename, '%' ) != NULL )
                {
                        // handle picture sequences
-                       int i = mlt_properties_get_int( properties, "begin" );
+                       int i = mlt_properties_get_int( producer_properties, "begin" );
                        int gap = 0;
                        char full[1024];
 
@@ -378,9 +387,6 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
                // Obtain properties of frame and producer
                mlt_properties properties = MLT_FRAME_PROPERTIES( *frame );
 
-               // Determine if we're rendering for PAL or NTSC
-               int is_pal = mlt_properties_get_int( properties, "normalised_height" ) == 576;
-
                // Set the producer on the frame properties
                mlt_properties_set_data( properties, "producer_pixbuf", this, 0, NULL, NULL );
 
@@ -394,8 +400,8 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
                refresh_image( *frame, 0, 0 );
 
                // Set producer-specific frame properties
-               mlt_properties_set_int( properties, "progressive", 1 );
-               mlt_properties_set_double( properties, "aspect_ratio", is_pal ? 59.0/54.0 : 10.0/11.0 );
+               mlt_properties_set_int( properties, "progressive", mlt_properties_get_int( producer_properties, "progressive" ) );
+               mlt_properties_set_double( properties, "aspect_ratio", mlt_properties_get_double( producer_properties, "aspect_ratio" ) );
 
                // Set alpha call back
                ( *frame )->get_alpha_mask = producer_get_alpha_mask;