void mlt_cache_purge( mlt_cache cache, void *object ) { pthread_mutex_lock( &cache->mutex ); if ( cache && object ) { int i, j; void **alt = cache->current == cache->A ? cache->B : cache->A; for ( i = 0, j = 0; i < cache->count; i++ ) { void *o = cache->current[ i ]; if ( o == object ) { pthread_mutex_unlock( &cache->mutex ); cache_object_close( cache, o, NULL ); pthread_mutex_lock( &cache->mutex ); } else { alt[ j++ ] = o; } } cache->count = j; cache->current = alt; // Remove the object's data from the active list regardless of refcount char key[19]; sprintf( key, "%p", object ); mlt_cache_item item = mlt_properties_get_data( cache->active, key, NULL ); if ( item && item->destructor ) { item->destructor( item->data ); item->data = NULL; item->destructor = NULL; mlt_properties_set_data( cache->active, key, NULL, 0, NULL, NULL ); } // Remove the object's items from the garbage collection regardless of refcount i = mlt_properties_count( cache->garbage ); while ( i-- ) { item = mlt_properties_get_data_at( cache->garbage, i, NULL ); if ( object == item->object && item->destructor ) { sprintf( key, "%p", item->data ); item->destructor( item->data ); item->data = NULL; item->destructor = NULL; mlt_properties_set_data( cache->garbage, key, NULL, 0, NULL, NULL ); } } } pthread_mutex_unlock( &cache->mutex ); }
void mlt_service_cache_purge( mlt_service self ) { mlt_properties caches = mlt_properties_get_data( mlt_global_properties(), "caches", NULL ); if ( caches ) { int i = mlt_properties_count( caches ); while ( i-- ) { mlt_cache_purge( mlt_properties_get_data_at( caches, i, NULL ), self ); mlt_properties_set_data( mlt_global_properties(), mlt_properties_get_name( caches, i ), NULL, 0, NULL, NULL ); } } }
int mlt_producer_optimise( mlt_producer self ) { int error = 1; mlt_parser parser = mlt_parser_new( ); if ( parser != NULL ) { int i = 0, j = 0, k = 0; mlt_properties properties = mlt_parser_properties( parser ); mlt_properties producers = mlt_properties_new( ); mlt_deque stack = mlt_deque_init( ); mlt_properties_set_data( properties, "producers", producers, 0, ( mlt_destructor )mlt_properties_close, NULL ); mlt_properties_set_data( properties, "stack", stack, 0, ( mlt_destructor )mlt_deque_close, NULL ); parser->on_start_producer = on_start_producer; parser->on_start_track = on_start_track; parser->on_end_track = on_end_track; parser->on_start_multitrack = on_start_multitrack; parser->on_end_multitrack = on_end_multitrack; push( parser, 0, 0, 0 ); mlt_parser_start( parser, MLT_PRODUCER_SERVICE( self ) ); free( pop( parser ) ); for ( k = 0; k < mlt_properties_count( producers ); k ++ ) { char *name = mlt_properties_get_name( producers, k ); int count = 0; int clones = 0; int max_clones = 0; mlt_producer producer = mlt_properties_get_data_at( producers, k, &count ); if ( producer != NULL && count > 1 ) { clip_references *refs = mlt_properties_get_data( properties, name, &count ); for ( i = 0; i < count; i ++ ) { clones = 0; for ( j = i + 1; j < count; j ++ ) { if ( intersect( &refs[ i ], &refs[ j ] ) ) { clones ++; mlt_properties_set_int( MLT_PRODUCER_PROPERTIES( refs[ j ].cut ), "_clone", clones ); } } if ( clones > max_clones ) max_clones = clones; } for ( i = 0; i < count; i ++ ) { mlt_producer cut = refs[ i ].cut; if ( mlt_properties_get_int( MLT_PRODUCER_PROPERTIES( cut ), "_clone" ) == -1 ) mlt_properties_set_int( MLT_PRODUCER_PROPERTIES( cut ), "_clone", 0 ); } mlt_producer_set_clones( producer, max_clones ); } else if ( producer != NULL ) { clip_references *refs = mlt_properties_get_data( properties, name, &count ); for ( i = 0; i < count; i ++ ) { mlt_producer cut = refs[ i ].cut; mlt_properties_set_int( MLT_PRODUCER_PROPERTIES( cut ), "_clone", 0 ); } mlt_producer_set_clones( producer, 0 ); } } mlt_parser_close( parser ); } return error; }