]> git.sesse.net Git - mlt/blobdiff - src/modules/core/filter_watermark.c
Mutable watermark producer and small optimisation
[mlt] / src / modules / core / filter_watermark.c
index fec4d53739888b133e6b3e61dbab0c87cc89b21f..f23ac60bebddc46867cc97e09096d6746e0c4aef 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 
 /** Do it :-).
 */
@@ -48,32 +49,36 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format
        // Get the composite from the filter
        mlt_transition composite = mlt_properties_get_data( properties, "composite", NULL );
 
+       // Get the resource to use
+       char *resource = mlt_properties_get( properties, "resource" );
+
+       // Get the old resource
+       char *old_resource = mlt_properties_get( properties, "old_resource" );
+
        // Create a composite if we don't have one
        if ( composite == NULL )
        {
                // Create composite via the factory
                composite = mlt_factory_transition( "composite", NULL );
 
-               // If we have one
+               // Register the composite for reuse/destruction
                if ( composite != NULL )
-               {
-                       // Get the properties
-                       mlt_properties composite_properties = mlt_transition_properties( composite );
+                       mlt_properties_set_data( properties, "composite", composite, 0, ( mlt_destructor )mlt_transition_close, NULL );
+       }
 
-                       // Pass all the composite. properties on the filter down
-                       mlt_properties_pass( composite_properties, properties, "composite." );
+       // If we have one
+       if ( composite != NULL )
+       {
+               // Get the properties
+               mlt_properties composite_properties = mlt_transition_properties( composite );
 
-                       // Register the composite for reuse/destruction
-                       mlt_properties_set_data( properties, "composite", composite, 0, ( mlt_destructor )mlt_transition_close, NULL );
-               }
+               // Pass all the composite. properties on the filter down
+               mlt_properties_pass( composite_properties, properties, "composite." );
        }
 
        // Create a producer if don't have one
-       if ( producer == NULL )
+       if ( producer == NULL || ( old_resource != NULL && strcmp( resource, old_resource ) ) )
        {
-               // Get the resource to use
-               char *resource = mlt_properties_get( properties, "resource" );
-
                // Get the factory producer service
                char *factory = mlt_properties_get( properties, "factory" );
 
@@ -83,20 +88,26 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format
                // If we have one
                if ( producer != NULL )
                {
-                       // Get the producer properties
-                       mlt_properties producer_properties = mlt_producer_properties( producer );
+                       // Register the producer for reuse/destruction
+                       mlt_properties_set_data( properties, "producer", producer, 0, ( mlt_destructor )mlt_producer_close, NULL );
 
                        // Ensure that we loop
-                       mlt_properties_set( producer_properties, "eof", "loop" );
-
-                       // Now pass all producer. properties on the filter down
-                       mlt_properties_pass( producer_properties, properties, "producer." );
+                       mlt_properties_set( mlt_producer_properties( producer ), "eof", "loop" );
 
-                       // Register the producer for reuse/destruction
-                       mlt_properties_set_data( properties, "producer", producer, 0, ( mlt_destructor )mlt_producer_close, NULL );
+                       // Set the old resource
+                       mlt_properties_set( properties, "old_resource", resource );
                }
        }
 
+       if ( producer != NULL )
+       {
+               // Get the producer properties
+               mlt_properties producer_properties = mlt_producer_properties( producer );
+
+               // Now pass all producer. properties on the filter down
+               mlt_properties_pass( producer_properties, properties, "producer." );
+       }
+
        // Only continue if we have both producer and composite
        if ( composite != NULL && producer != NULL )
        {