void deinit(void) { destruct(); if(f0r_deinit) f0r_deinit(); }
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 producer_type: strcpy ( servicetype , "producer" ); break; case filter_type: strcpy ( servicetype , "filter" ); break; case transition_type: strcpy ( servicetype , "transition" ) ; break; default: strcpy ( servicetype , "" ); }; snprintf( file, PATH_MAX, "%s/frei0r/%s_%s.yml", mlt_environment( "MLT_DATA" ), servicetype, service_name ); memset(&stat_buff, 0, sizeof(stat_buff)); stat(file,&stat_buff); if (S_ISREG(stat_buff.st_mode)){ return mlt_properties_parse_yaml( file ); } 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"); void (*f0r_init)(void)=dlsym(handle,"f0r_init"); void (*f0r_deinit)(void)=dlsym(handle,"f0r_deinit"); f0r_instance_t (*f0r_construct)(unsigned int , unsigned int)=dlsym(handle, "f0r_construct"); void (*f0r_destruct)(f0r_instance_t)=dlsym(handle, "f0r_destruct"); void (*f0r_get_param_value)(f0r_instance_t instance, f0r_param_t param, int param_index)=dlsym(handle,"f0r_get_param_value" ); if (!plginfo || !param_info) { dlclose(handle); return NULL; } mlt_properties metadata = mlt_properties_new(); f0r_plugin_info_t info; char string[48]; int j=0; f0r_init(); f0r_instance_t instance = f0r_construct(720, 576); if (!instance) { f0r_deinit(); dlclose(handle); mlt_properties_close(metadata); return NULL; } plginfo(&info); snprintf ( string, sizeof(string) , "%d" , info.minor_version ); mlt_properties_set_double ( metadata, "schema_version" , 0.1 ); mlt_properties_set ( metadata, "title" , info.name ); mlt_properties_set_double ( metadata, "version", info.major_version + info.minor_version / pow( 10, strlen( 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 producer_type: mlt_properties_set ( metadata, "type" , "producer" ); break; case filter_type: mlt_properties_set ( metadata, "type" , "filter" ); break; case transition_type: mlt_properties_set ( metadata, "type" , "transition" ); break; default: break; } 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" ); mlt_properties parameter = mlt_properties_new ( ); mlt_properties_set_data ( metadata , "parameters" , parameter , 0 , ( mlt_destructor )mlt_properties_close, NULL ); for (j=0;j<info.num_params;j++){ snprintf ( string , sizeof(string), "%d" , j ); mlt_properties pnum = mlt_properties_new ( ); mlt_properties_set_data ( parameter , string , pnum , 0 , ( mlt_destructor )mlt_properties_close, NULL ); f0r_param_info_t paraminfo; param_info(¶minfo,j); mlt_properties_set ( pnum , "identifier" , string ); mlt_properties_set ( pnum , "title" , paraminfo.name ); mlt_properties_set ( pnum , "description" , paraminfo.explanation); if ( paraminfo.type == F0R_PARAM_DOUBLE ){ double deflt = 0; mlt_properties_set ( pnum , "type" , "float" ); mlt_properties_set ( pnum , "minimum" , "0" ); mlt_properties_set ( pnum , "maximum" , "1" ); f0r_get_param_value( instance, &deflt, j); mlt_properties_set_double ( pnum, "default", CLAMP(deflt, 0.0, 1.0) ); mlt_properties_set ( pnum , "mutable" , "yes" ); mlt_properties_set ( pnum , "widget" , "spinner" ); }else if ( paraminfo.type == F0R_PARAM_BOOL ){ double deflt = 0; mlt_properties_set ( pnum , "type" , "boolean" ); mlt_properties_set ( pnum , "minimum" , "0" ); mlt_properties_set ( pnum , "maximum" , "1" ); f0r_get_param_value( instance, &deflt, j); mlt_properties_set_int ( pnum, "default", deflt != 0.0 ); mlt_properties_set ( pnum , "mutable" , "yes" ); mlt_properties_set ( pnum , "widget" , "checkbox" ); }else if ( paraminfo.type == F0R_PARAM_COLOR ){ char colorstr[8]; f0r_param_color_t deflt = {0, 0, 0}; mlt_properties_set ( pnum , "type" , "color" ); f0r_get_param_value( instance, &deflt, j); sprintf( colorstr, "#%02x%02x%02x", (unsigned) CLAMP(deflt.r * 255, 0 , 255), (unsigned) CLAMP(deflt.g * 255, 0 , 255), (unsigned) CLAMP(deflt.b * 255, 0 , 255)); colorstr[7] = 0; mlt_properties_set ( pnum , "default", colorstr ); mlt_properties_set ( pnum , "mutable" , "yes" ); mlt_properties_set ( pnum , "widget" , "color" ); }else if ( paraminfo.type == F0R_PARAM_STRING ){ char *deflt = NULL; mlt_properties_set ( pnum , "type" , "string" ); f0r_get_param_value( instance, &deflt, j ); mlt_properties_set ( pnum , "default", deflt ); mlt_properties_set ( pnum , "mutable" , "yes" ); mlt_properties_set ( pnum , "widget" , "text" ); } } f0r_destruct(instance); f0r_deinit(); dlclose(handle); free(name); return metadata; }