X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Ffrei0r%2Ffrei0r_helper.c;h=dd7db7513469f794a924ab180fb4d981b2082c58;hb=b9402bbbbcc5c6569d55700564275f59cd9e2242;hp=8b21d8f7b0ce104f56a2086e2cc87c4f8146e4a0;hpb=804cde4a7e15b76587b48102a061e879b6cc0e77;p=melted diff --git a/src/modules/frei0r/frei0r_helper.c b/src/modules/frei0r/frei0r_helper.c index 8b21d8f..dd7db75 100644 --- a/src/modules/frei0r/frei0r_helper.c +++ b/src/modules/frei0r/frei0r_helper.c @@ -19,6 +19,22 @@ #include "frei0r_helper.h" #include #include +#include + + +static void parse_color( char *color, f0r_param_color_t *fcolor ) +{ + unsigned int temp = strtoul( color, &color, 0 ); + if ( strlen( color ) > 6 ) + temp >>= 8; + fcolor->r = ( temp >> 16 ) & 0xff; + fcolor->r /= 255; + fcolor->g = ( temp >> 8 ) & 0xff; + fcolor->g /= 255; + fcolor->b = ( temp >> 0 ) & 0xff; + fcolor->b /= 255; +} + int process_frei0r_item( mlt_service_type type, double position , mlt_properties prop , mlt_frame this, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable ){ @@ -26,21 +42,21 @@ f0r_instance_t ( *f0r_construct ) ( unsigned int , unsigned int ) = mlt_properties_get_data( prop , "f0r_construct" ,NULL); void (*f0r_update)(f0r_instance_t instance, double time, const uint32_t* inframe, uint32_t* outframe)=mlt_properties_get_data( prop , "f0r_update" ,NULL); void (*f0r_destruct)(f0r_instance_t instance)=mlt_properties_get_data( prop , "f0r_destruct" ,NULL); - + void (*f0r_get_plugin_info)(f0r_plugin_info_t*)=mlt_properties_get_data( prop, "f0r_get_plugin_info" ,NULL); void (*f0r_get_param_info)(f0r_param_info_t* info, int param_index)=mlt_properties_get_data( prop , "f0r_get_param_info" ,NULL); void (*f0r_set_param_value)(f0r_instance_t instance, f0r_param_t param, int param_index)=mlt_properties_get_data( prop , "f0r_set_param_value" ,NULL); void (*f0r_get_param_value)(f0r_instance_t instance, f0r_param_t param, int param_index)=mlt_properties_get_data( prop , "f0r_get_param_value" ,NULL); void (*f0r_update2) (f0r_instance_t instance, double time, const uint32_t* inframe1,const uint32_t* inframe2,const uint32_t* inframe3, - uint32_t* outframe)=mlt_properties_get_data( prop , "f0r_update2" ,NULL); - - + uint32_t* outframe)=mlt_properties_get_data( prop , "f0r_update2" ,NULL); + + //use as name the width and height f0r_instance_t inst; char ctorname[1024]=""; sprintf(ctorname,"ctor-%dx%d",*width,*height); - + void* neu=mlt_properties_get_data( prop , ctorname ,NULL ); if (!f0r_construct){ //printf("no ctor\n"); @@ -61,7 +77,7 @@ mlt_geometry geom=mlt_geometry_init(); struct mlt_geometry_item_s item; //set param if found - + double t=0.0; f0r_get_param_value(inst,&t,i); char *val; @@ -75,53 +91,58 @@ t=item.x; f0r_set_param_value(inst,&t,i); break; - //case F0R_PARAM_COLOR: - // t=mlt_properties_get_double( prop , pinfo.name ); - + case F0R_PARAM_COLOR: + { + f0r_param_color_t color; + parse_color(mlt_properties_get(prop , pinfo.name), &color); + f0r_set_param_value(inst, &color, i); + break; + } + } } - + mlt_geometry_close(geom); } } - + int video_area = *width * *height; uint32_t *img_a = mlt_pool_alloc( video_area * sizeof(uint32_t) ); uint32_t *img_b = mlt_pool_alloc( video_area * sizeof(uint32_t) ); - + if (type==filter_type){ mlt_convert_yuv422_to_rgb24a(*image, (uint8_t *)img_a, video_area); f0r_update ( inst , position , img_a , img_b ); - mlt_convert_rgb24a_to_yuv422((uint8_t *)img_b , *width, *height, *width * sizeof(uint32_t), - *image, NULL ); + mlt_convert_rgb24a_to_yuv422((uint8_t *)img_b , *width, *height, *width * sizeof(uint32_t), + *image, NULL ); }else if (type==transition_type && f0r_update2 ){ uint32_t *result = mlt_pool_alloc( video_area * sizeof(uint32_t) ); - + mlt_convert_yuv422_to_rgb24a ( image[0] , (uint8_t *)img_a , video_area ); mlt_convert_yuv422_to_rgb24a ( image[1] , (uint8_t *)img_b , video_area ); f0r_update2 ( inst , position , img_a , img_b , NULL , result ); - + uint8_t * image_ptr=mlt_properties_get_data(MLT_FRAME_PROPERTIES(this), "image", NULL ); if (image_ptr) mlt_convert_rgb24a_to_yuv422((uint8_t *)result, *width, *height, *width * sizeof(uint32_t), image_ptr , NULL ); - + mlt_pool_release(result); } mlt_pool_release(img_a); mlt_pool_release(img_b); - + return 0; } void destruct (mlt_properties prop ) { - + void (*f0r_destruct)(f0r_instance_t instance)=mlt_properties_get_data( prop , "f0r_destruct" , NULL ); void (*f0r_deinit)(void)=mlt_properties_get_data ( prop , "f0r_deinit" , NULL); int i=0; - + if ( f0r_deinit != NULL ) f0r_deinit(); - + for ( i=0 ; i < mlt_properties_count ( prop ) ; i++ ){ if ( strstr ( mlt_properties_get_name ( prop , i ) , "ctor-" ) != NULL ){ void * inst=mlt_properties_get_data( prop , mlt_properties_get_name ( prop , i ) , NULL ); @@ -130,11 +151,11 @@ void destruct (mlt_properties prop ) { } } } - void (*dlclose)(void*)=mlt_properties_get_data ( prop , "_dlclose" , NULL); - void *handle=mlt_properties_get_data ( prop , "_dlclose_handle" , NULL); - + void (*dlclose)(void*)=mlt_properties_get_data ( prop , "_dlclose" , NULL); + void *handle=mlt_properties_get_data ( prop , "_dlclose_handle" , NULL); + if (handle && dlclose ){ dlclose ( handle ); } - + }