X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Foldfilm%2Ffilter_vignette.c;h=e9e3f5d0f814a44086b990deeeac8b4a98869b34;hb=00ec4e199c9bd1213ec1ada66b662b5b0b181811;hp=0574b20e6a95697bdf3b4d42098c20725f03856e;hpb=db8544a3fa169191be753f1a601ff0163c0b2c22;p=melted diff --git a/src/modules/oldfilm/filter_vignette.c b/src/modules/oldfilm/filter_vignette.c index 0574b20..e9e3f5d 100644 --- a/src/modules/oldfilm/filter_vignette.c +++ b/src/modules/oldfilm/filter_vignette.c @@ -19,6 +19,7 @@ #include #include +#include #include #include @@ -28,79 +29,62 @@ #define SIGMOD_STEPS 1000 #define POSITION_VALUE(p,s,e) (s+((double)(e-s)*p )) -static double pow2[SIGMOD_STEPS]; +//static double pow2[SIGMOD_STEPS]; static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable ) { mlt_filter filter = mlt_frame_pop_service( this ); int error = mlt_frame_get_image( this, image, format, width, height, 1 ); - + if ( error == 0 && *image && *format == mlt_image_yuv422 ) { - int smooth_s=80,radius_s=50,x_s=50,y_s=50,opac_s=0; - int smooth_e=80,radius_e=50,x_e=50,y_e=50,opac_e=0; - - sscanf(mlt_properties_get(MLT_FILTER_PROPERTIES( filter ), "start" ), "%d:%d,%dx%d,%d",&smooth_s,&radius_s,&x_s,&y_s,&opac_s); - if (mlt_properties_get(MLT_FILTER_PROPERTIES( filter ), "end" ) ){ - sscanf(mlt_properties_get(MLT_FILTER_PROPERTIES( filter ), "end" ), "%d:%d,%dx%d,%d",&smooth_e,&radius_e,&x_e,&y_e,&opac_e); - }else{ - smooth_e=smooth_s; - radius_e=radius_s; - x_e=x_s; - y_e=y_s; - opac_e=opac_s; - } mlt_position in = mlt_filter_get_in( filter ); - mlt_position out = mlt_filter_get_out( filter ); + //mlt_position out = mlt_filter_get_out( filter ); mlt_position time = mlt_frame_get_position( this ); - double position = ( double )( time -in ) / ( double )( out - in + 1 ) /100.0; - double smooth = POSITION_VALUE (position, smooth_s, smooth_e) ; - double radius = POSITION_VALUE (position, radius_s, radius_e)/100.0* *width; - - double cx = POSITION_VALUE (position, x_s, x_e ) * *width/100; - double cy = POSITION_VALUE (position, y_s, y_e ) * *height/100; - double opac= POSITION_VALUE(position, opac_s, opac_e) ; + mlt_geometry geom=mlt_geometry_init(); + struct mlt_geometry_item_s item; + float smooth, radius, cx, cy, opac; + char *val=mlt_properties_get(MLT_FILTER_PROPERTIES( filter ), "geometry" ); + mlt_geometry_parse(geom,val,-1,-1,-1); + mlt_geometry_fetch(geom,&item,time-in); + smooth=item.x; + radius=item.y; + cx=item.w; + cy=item.h; + opac=item.mix; + mlt_geometry_close(geom); int video_width = *width; int video_height = *height; int x,y; int w2=cx,h2=cy; - double delta=0.0; - double max_opac=255.0; - - if (opac>0.0) - max_opac=100.0/opac; - + double delta=1.0; + double max_opac=opac/100.0; + for (y=0;y0.001 && sigx>-10.0 && sigx<10.0){ - delta=pow2[((int)((sigx+10)*SIGMOD_STEPS/20))]; - }else if (smooth>0.001 && sigx>10.0){ + if (radius-smooth>dx){ //center, make not darker continue; - }else{ - delta=255.0; - } - if ( max_opac10 inner area, <-10 in dark area + //delta=pow2[((int)((sigx+10.0)*SIGMOD_STEPS/20.0))];//sigmoidal + delta = ((double)(radius+smooth-dx)/(2.0*smooth));//linear } - + delta=MAX(max_opac,delta); + *pix=(double)(*pix)*delta; + *(pix+1)=((double)(*(pix+1)-127.0)*delta)+127.0; } } - // short a, short b, short c, short d // a= gray val pix 1 // b: +=blue, -=yellow @@ -123,14 +107,17 @@ static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) mlt_filter filter_vignette_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ) { mlt_filter this = mlt_filter_new( ); - int i=0; + //int i=0; if ( this != NULL ) { + /* for (i=-SIGMOD_STEPS/2;iprocess = filter_process; - mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "start", "80:50:50x50:0" ); + mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "geometry", "80:50%:50%:50%:0" ); //mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "end", "" ); }