mlt_service mlt_consumer_service( mlt_consumer this )
{
- return &this->parent;
+ return this != NULL ? &this->parent : NULL;
}
/** Get the consumer properties.
mlt_properties mlt_consumer_properties( mlt_consumer this )
{
- return mlt_service_properties( &this->parent );
+ return this != NULL ? mlt_service_properties( &this->parent ) : NULL;
}
/** Connect the consumer to the producer.
}
}
+void mlt_consumer_purge( mlt_consumer this )
+{
+ if ( this->ahead )
+ {
+ pthread_mutex_lock( &this->mutex );
+ while ( mlt_deque_count( this->queue ) )
+ mlt_frame_close( mlt_deque_pop_back( this->queue ) );
+ pthread_cond_broadcast( &this->cond );
+ pthread_mutex_unlock( &this->mutex );
+ }
+}
+
mlt_frame mlt_consumer_rt_frame( mlt_consumer this )
{
// Frame to return
if ( this->ahead == 0 )
{
int buffer = mlt_properties_get_int( properties, "buffer" );
+ int prefill = mlt_properties_get_int( properties, "prefill" );
consumer_read_ahead_start( this );
if ( buffer > 1 )
- size = buffer;
+ size = prefill > 0 && prefill < buffer ? prefill : buffer;
}
// Get frame from queue
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 );
+ }
}