#include <string.h>
#include <ctype.h>
#include <stdarg.h>
-
+#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>
int size;
mlt_properties mirror;
int ref_count;
+ pthread_mutex_t mutex;
}
property_list;
// Increment the ref count
( ( property_list * )this->local )->ref_count = 1;
+ pthread_mutex_init( &( ( property_list * )this->local )->mutex, NULL );;
}
// Check that initialisation was successful
int mlt_properties_inc_ref( mlt_properties this )
{
+ int result = 0;
if ( this != NULL )
{
property_list *list = this->local;
- return ++ list->ref_count;
+ pthread_mutex_lock( &list->mutex );
+ result = ++ list->ref_count;
+ pthread_mutex_unlock( &list->mutex );
}
- return 0;
+ return result;
}
/** Maintain ref count to allow multiple uses of an mlt object.
int mlt_properties_dec_ref( mlt_properties this )
{
+ int result = 0;
if ( this != NULL )
{
property_list *list = this->local;
- return -- list->ref_count;
+ pthread_mutex_lock( &list->mutex );
+ result = -- list->ref_count;
+ pthread_mutex_unlock( &list->mutex );
}
- return 0;
+ return result;
}
/** Return the ref count of this object.
}
else if ( value[ 0 ] == '@' )
{
- int total = 0;
- int current = 0;
+ double total = 0;
+ double current = 0;
char id[ 255 ];
char op = '+';
if ( isdigit( id[ 0 ] ) )
current = atof( id );
else
- current = mlt_properties_get_int( this, id );
+ current = mlt_properties_get_double( this, id );
// Apply the operation
switch( op )
total *= current;
break;
case '/':
- total /= current;
+ total = total / current;
break;
}
op = *value != '\0' ? *value ++ : ' ';
}
- error = mlt_property_set_int( property, total );
+ error = mlt_property_set_double( property, total );
mlt_properties_do_mirror( this, name );
}
}
// Clear up the list
+ pthread_mutex_destroy( &list->mutex );
free( list->name );
free( list->value );
free( list );