X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Ffrei0r%2Ffactory.c;h=132123f4a9e3fe16716071877db74faa571ade0b;hb=b9402bbbbcc5c6569d55700564275f59cd9e2242;hp=52eb9bb60e81244d7beb68806ea9b90431ec6c1e;hpb=c079de116b132025ee09e8766d773424f17605e9;p=melted diff --git a/src/modules/frei0r/factory.c b/src/modules/frei0r/factory.c index 52eb9bb..132123f 100644 --- a/src/modules/frei0r/factory.c +++ b/src/modules/frei0r/factory.c @@ -23,10 +23,14 @@ #include #include +#include #include #include #include #include +#include + +#define FREI0R_PLUGIN_PATH "/usr/lib/frei0r-1:/usr/local/lib/frei0r-1:/opt/local/lib/frei0r-1" extern mlt_filter filter_frei0r_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ); extern mlt_frame filter_process( mlt_filter this, mlt_frame frame ); @@ -34,63 +38,81 @@ extern void filter_close( mlt_filter this ); extern void transition_close( mlt_transition this ); extern mlt_frame transition_process( mlt_transition transition, mlt_frame a_frame, mlt_frame b_frame ); -void fill_param_info ( mlt_repository repository , void* handle, f0r_plugin_info_t* info , mlt_service_type type , char* name ) { - - int j=0; - void (*param_info)(f0r_param_info_t*,int param_index)=dlsym(handle,"f0r_get_param_info"); - mlt_properties metadata_properties=NULL; - switch (type){ +static mlt_properties fill_param_info ( mlt_service_type type, const char *service_name, char *name ) +{ + char file[ PATH_MAX ]; + char servicetype[ 1024 ]=""; + struct stat stat_buff; + + switch ( type ) { case filter_type: - metadata_properties=mlt_repository_filters(repository); + strcpy ( servicetype , "filter" ); + break; + case transition_type: + strcpy ( servicetype , "transition" ) ; break; default: - metadata_properties=NULL; - } - - if (!metadata_properties){ - return; + strcpy ( servicetype , "" ); + }; + + snprintf( file, PATH_MAX, "%s/frei0r/%s_%s.yml", mlt_environment( "MLT_DATA" ), servicetype, service_name ); + stat(file,&stat_buff); + + if (S_ISREG(stat_buff.st_mode)){ + return mlt_properties_parse_yaml( file ); } - - mlt_properties this_item_properties = mlt_properties_get_data( metadata_properties , name , NULL ); - mlt_properties metadata = mlt_properties_get_data( this_item_properties , "metadata" , NULL ); - if (!metadata){ - metadata = mlt_properties_new( ); - mlt_properties_set_data( this_item_properties , "metadata" , metadata , 0 , NULL, NULL ); + + void* handle=dlopen(name,RTLD_LAZY); + if (!handle) return NULL; + void (*plginfo)(f0r_plugin_info_t*)=dlsym(handle,"f0r_get_plugin_info"); + void (*param_info)(f0r_param_info_t*,int param_index)=dlsym(handle,"f0r_get_param_info"); + if (!plginfo || !param_info) { + dlclose(handle); + return NULL; } - char descstr[2048]; - snprintf ( descstr, 2048 , "%s (Version: %d.%d)" , info->explanation , info->major_version , info->minor_version ); - mlt_properties_set ( metadata, "title" , info->name ); - mlt_properties_set ( metadata, "identifier" , name ); - mlt_properties_set ( metadata, "description" , descstr ); - mlt_properties_set ( metadata, "creator" , info->author ); - - mlt_properties parameter = mlt_properties_get_data( metadata , "parameters" , NULL ); - - if (!parameter){ - parameter = mlt_properties_new ( ); - mlt_properties_set_data ( metadata , "parameters" , parameter , 0 , NULL, NULL ); + mlt_properties metadata = mlt_properties_new(); + f0r_plugin_info_t info; + char string[48]; + int j=0; + + plginfo(&info); + snprintf ( string, sizeof(string) , "%d.%d" , info.major_version , info.minor_version ); + mlt_properties_set ( metadata, "schema_version" , "0.1" ); + mlt_properties_set ( metadata, "title" , info.name ); + mlt_properties_set ( metadata, "version", string ); + mlt_properties_set ( metadata, "identifier" , service_name ); + mlt_properties_set ( metadata, "description" , info.explanation ); + mlt_properties_set ( metadata, "creator" , info.author ); + switch (type){ + case filter_type: + mlt_properties_set ( metadata, "type" , "filter" ); + break; + case transition_type: + mlt_properties_set ( metadata, "type" , "transition" ); + break; + default: + break; } - - char numstr[512]; - - for (j=0;jnum_params;j++){ - snprintf ( numstr , 512 , "%d" , j ); - mlt_properties pnum = mlt_properties_get_data( metadata , numstr , NULL ); - if (!pnum){ - pnum = mlt_properties_new ( ); - mlt_properties_set_data ( parameter , numstr , pnum , 0 , NULL, NULL ); - } - + + mlt_properties parameter = mlt_properties_new ( ); + mlt_properties_set_data ( metadata , "parameters" , parameter , 0 , ( mlt_destructor )mlt_properties_close, NULL ); + mlt_properties tags = mlt_properties_new ( ); + mlt_properties_set_data ( metadata , "tags" , tags , 0 , ( mlt_destructor )mlt_properties_close, NULL ); + mlt_properties_set ( tags , "0" , "Video" ); + + for (j=0;jprocess = filter_process; - this->close = filter_close; + this->close = filter_close; f0r_init(); properties=MLT_FILTER_PROPERTIES ( this ); - + for (i=0;i