#define MAX_CACHE_SIZE (200)
/** the default number of data objects to cache per line */
-#define DEFAULT_CACHE_SIZE (10)
+#define DEFAULT_CACHE_SIZE (4)
/** \brief Cache item class
*
{
int count; /**< the number of items currently in the cache */
int size; /**< the maximum number of items permitted in the cache <= \p MAX_CACHE_SIZE */
+ int is_frames; /**< indicates if this cache is used to cache frames */
void* *current; /**< pointer to the current array of pointers */
void* A[ MAX_CACHE_SIZE ];
void* B[ MAX_CACHE_SIZE ];
{
char key[19];
+ if ( cache->is_frames )
+ {
+ // Frame caches are easy - just close the object as mlt_frame.
+ mlt_frame_close( object );
+ return;
+ }
+
// Fetch the cache item from the active list by its owner's address
sprintf( key, "%p", object );
mlt_cache_item item = mlt_properties_get_data( cache->active, key, NULL );
sprintf( key, "%p", *hit );
result = mlt_properties_get_data( cache->active, key, NULL );
if ( result && result->data )
+ {
result->refcount++;
- mlt_log( NULL, MLT_LOG_DEBUG, "%s: get %d = %p, %p\n", __FUNCTION__, cache->count - 1, *hit, result->data );
+ mlt_log( NULL, MLT_LOG_DEBUG, "%s: get %d = %p, %p\n", __FUNCTION__, cache->count - 1, *hit, result->data );
+ }
// swap the current array
cache->current = alt;
while ( i-- && !hit )
{
mlt_frame *o = (mlt_frame*) &cache->current[ i ];
- if ( mlt_frame_get_position( *o ) == position )
+ if ( mlt_frame_original_position( *o ) == position )
hit = o;
}
// if there was no hit, we will not be shuffling out an entry
{
mlt_frame *o = (mlt_frame*) &cache->current[ i ];
- if ( !hit && mlt_frame_get_position( *o ) == position )
+ if ( !hit && mlt_frame_original_position( *o ) == position )
{
hit = o;
}
void mlt_cache_put_frame( mlt_cache cache, mlt_frame frame )
{
pthread_mutex_lock( &cache->mutex );
- mlt_frame *hit = shuffle_get_frame( cache, mlt_frame_get_position( frame ) );
+ mlt_frame *hit = shuffle_get_frame( cache, mlt_frame_original_position( frame ) );
mlt_frame *alt = (mlt_frame*) ( cache->current == cache->A ? cache->B : cache->A );
// add the frame to the cache
// swap the current array
cache->current = (void**) alt;
+ cache->is_frames = 1;
pthread_mutex_unlock( &cache->mutex );
}