コード例 #1
0
ファイル: mlt_cache.c プロジェクト: rayl/MLT
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 );
}
コード例 #2
0
ファイル: mlt_service.c プロジェクト: bmatherly/mlt
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 );
		}
	}
}
コード例 #3
0
ファイル: mlt_producer.c プロジェクト: jliljebl/mlt
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;
}