mlt_repository.c
[melted] / src / framework / mlt_service.c
index d8173d6..4619780 100644 (file)
@@ -160,6 +160,11 @@ int mlt_service_connect_producer( mlt_service this, mlt_service producer, int in
        // Get the service base
        mlt_service_base *base = this->local;
 
+       // Special case 'track' index - only works for last filter(s) in a particular chain
+       // but allows a filter to apply to the output frame regardless of which track it comes from
+       if ( index == -1 )
+               index = 0;
+
        // Check if the producer is already registered with this service
        for ( i = 0; i < base->count; i ++ )
                if ( base->in[ i ] == producer )
@@ -358,7 +363,6 @@ int mlt_service_get_frame( mlt_service this, mlt_frame_ptr frame, int index )
                mlt_position in = mlt_properties_get_position( properties, "in" );
                mlt_position out = mlt_properties_get_position( properties, "out" );
                mlt_properties_inc_ref( properties );
-               mlt_service_unlock( this );
                result = this->get_frame( this, frame, index );
                if ( result == 0 )
                {
@@ -370,9 +374,11 @@ int mlt_service_get_frame( mlt_service this, mlt_frame_ptr frame, int index )
                        }
                        mlt_service_apply_filters( this, *frame, 1 );
                        mlt_deque_push_back( MLT_FRAME_SERVICE_STACK( *frame ), this );
+                       mlt_service_unlock( this );
                }
                else
                {
+                       mlt_service_unlock( this );
                        mlt_service_close( this );
                }
                return result;