void mlt_frame_close( mlt_frame self ) { if ( self != NULL && mlt_properties_dec_ref( MLT_FRAME_PROPERTIES( self ) ) <= 0 ) { mlt_deque_close( self->stack_image ); mlt_deque_close( self->stack_audio ); while( mlt_deque_peek_back( self->stack_service ) ) mlt_service_close( mlt_deque_pop_back( self->stack_service ) ); mlt_deque_close( self->stack_service ); mlt_properties_close( &self->parent ); free( self ); } }
void consumer_purge( mlt_consumer parent ) { consumer_sdl self = parent->child; if ( self->running ) { pthread_mutex_lock( &self->video_mutex ); mlt_frame frame = MLT_FRAME( mlt_deque_peek_back( self->queue ) ); // When playing rewind or fast forward then we need to keep one // frame in the queue to prevent playback stalling. double speed = frame? mlt_properties_get_double( MLT_FRAME_PROPERTIES(frame), "_speed" ) : 0; int n = ( speed == 0.0 || speed == 1.0 ) ? 0 : 1; while ( mlt_deque_count( self->queue ) > n ) mlt_frame_close( mlt_deque_pop_back( self->queue ) ); self->is_purge = 1; pthread_cond_broadcast( &self->video_cond ); pthread_mutex_unlock( &self->video_mutex ); } }
static track_info *peek( mlt_parser self ) { mlt_properties properties = mlt_parser_properties( self ); mlt_deque stack = mlt_properties_get_data( properties, "stack", NULL ); return mlt_deque_peek_back( stack ); }