Cut management part 1
[melted] / src / framework / mlt_consumer.c
index a07f72d..0f2a97f 100644 (file)
@@ -28,6 +28,8 @@
 #include <stdlib.h>
 #include <sys/time.h>
 
+static void mlt_consumer_frame_show( mlt_listener listener, mlt_properties owner, mlt_service this, void **args );
+
 /** Public final methods
 */
 
@@ -83,10 +85,19 @@ int mlt_consumer_init( mlt_consumer this, void *child )
 
                // Hmm - default all consumers to yuv422 :-/
                this->format = mlt_image_yuv422;
+
+               mlt_events_register( properties, "consumer-frame-show", ( mlt_transmitter )mlt_consumer_frame_show );
+               mlt_events_register( properties, "consumer-stopped", NULL );
        }
        return error;
 }
 
+static void mlt_consumer_frame_show( mlt_listener listener, mlt_properties owner, mlt_service this, void **args )
+{
+       if ( listener != NULL )
+               listener( owner, this, ( mlt_frame )args[ 0 ] );
+}
+
 /** Create a new consumer.
 */
 
@@ -477,6 +488,15 @@ mlt_frame mlt_consumer_rt_frame( mlt_consumer this )
        return frame;
 }
 
+/** Callback for the implementation to indicate a stopped condition.
+*/
+
+void mlt_consumer_stopped( mlt_consumer this )
+{
+       mlt_properties_set_int( mlt_consumer_properties( this ), "running", 0 );
+       mlt_events_fire( mlt_consumer_properties( this ), "consumer-stopped", NULL );
+}
+
 /** Stop the consumer.
 */
 
@@ -520,15 +540,19 @@ int mlt_consumer_is_stopped( mlt_consumer this )
 
 void mlt_consumer_close( mlt_consumer this )
 {
-       // Get the childs close function
-       void ( *consumer_close )( ) = this->close;
+       if ( this != NULL && mlt_properties_dec_ref( mlt_consumer_properties( this ) ) <= 0 )
+       {
+               // Get the childs close function
+               void ( *consumer_close )( ) = this->close;
 
-       // Make sure it only gets called once
-       this->close = NULL;
+               // Make sure it only gets called once
+               this->close = NULL;
+               this->parent.close = NULL;
 
-       // Call the childs close if available
-       if ( consumer_close != NULL )
-               consumer_close( this );
-       else
-               mlt_service_close( &this->parent );
+               // Call the childs close if available
+               if ( consumer_close != NULL )
+                       consumer_close( this );
+               else
+                       mlt_service_close( &this->parent );
+       }
 }