audio mix and repeated frames
[melted] / src / modules / gtk2 / producer_pixbuf.c
index 5007ad7..10b5b8b 100644 (file)
@@ -71,7 +71,7 @@ mlt_producer producer_pixbuf_init( char *filename )
        
                // Callback registration
                producer->get_frame = producer_get_frame;
-               producer->close = producer_close;
+               producer->close = ( mlt_destructor )producer_close;
 
                // Set the default properties
                mlt_properties_set( properties, "resource", filename );
@@ -164,7 +164,7 @@ static void refresh_image( mlt_frame frame, int width, int height )
 
                // Note - the original pixbuf is already safe and ready for destruction
                pixbuf = gdk_pixbuf_scale_simple( pixbuf, width, height, interp );
-               
+
                // Store width and height
                this->width = width;
                this->height = height;
@@ -229,6 +229,13 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
        *width = mlt_properties_get_int( properties, "width" );
        *height = mlt_properties_get_int( properties, "height" );
 
+       if ( size == 0 )
+       {
+               *width = mlt_properties_get_int( properties, "normalised_width" );
+               *height = mlt_properties_get_int( properties, "normalised_height" );
+               size = *width * ( *height + 1 );
+       }
+
        // 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...
@@ -236,7 +243,8 @@ static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_form
        {
                // Clone our image
                uint8_t *copy = mlt_pool_alloc( size );
-               memcpy( copy, image, size );
+               if ( image != NULL )
+                       memcpy( copy, image, size );
 
                // We're going to pass the copy on
                image = copy;
@@ -295,8 +303,6 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
                                this->filenames = realloc( this->filenames, sizeof( char * ) * ( this->count + 1 ) );
                                this->filenames[ this->count ++ ] = strdup( fullname );
 
-                               mlt_properties_set_position( properties, "out", 250 );
-
                                // 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 );
                        }
@@ -324,7 +330,6 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
                                        gap ++;
                                }
                        }
-                       mlt_properties_set_position( properties, "out", this->count * 250 );
                }
                else if ( strstr( filename, "/.all." ) != NULL )
                {
@@ -342,8 +347,8 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
                        {
                                snprintf( fullname, 1023, "%s%s", dir_name, de[i]->d_name );
 
-                               if ( lstat( fullname, &info ) == 0 &&
-                                       ( S_ISREG( info.st_mode ) || ( strstr( fullname, extension ) && info.st_mode | S_IXUSR ) ) )
+                               if ( strstr( fullname, extension ) && lstat( fullname, &info ) == 0 &&
+                                       ( S_ISREG( info.st_mode ) || info.st_mode | S_IXUSR ) )
                                {
                                        this->filenames = realloc( this->filenames, sizeof( char * ) * ( this->count + 1 ) );
                                        this->filenames[ this->count ++ ] = strdup( fullname );
@@ -358,7 +363,6 @@ static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int i
                {
                        this->filenames = realloc( this->filenames, sizeof( char * ) * ( this->count + 1 ) );
                        this->filenames[ this->count ++ ] = strdup( filename );
-                       mlt_properties_set_position( properties, "out", 250 );
                }
        }