X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fplus%2Ffilter_charcoal.c;h=f48f37f27086554cd55e20fb0c51aefb8a731708;hb=8ea022814e4781856eea6767391274dfd5771a37;hp=76b8f58fbaccb9e1d0893c383d07e0d18ba54e75;hpb=b57890c57a31e765cc53ba5835b21fb46ae1d2a6;p=melted diff --git a/src/modules/plus/filter_charcoal.c b/src/modules/plus/filter_charcoal.c index 76b8f58..f48f37f 100644 --- a/src/modules/plus/filter_charcoal.c +++ b/src/modules/plus/filter_charcoal.c @@ -34,7 +34,7 @@ static inline int get_Y( uint8_t *pixels, int width, int height, int x, int y ) } else { - uint8_t *pixel = pixels + y * width * 2 + x * 2; + uint8_t *pixel = pixels + y * ( width << 1 ) + ( x << 1 ); return *pixel; } } @@ -47,13 +47,13 @@ static inline int sqrti( int n ) int h = 0; while( q <= n ) - q = 4 * q; + q = q << 2; while( q != 1 ) { - q = q / 4; + q = q >> 2; h = p + q; - p = p / 2; + p = p >> 1; if ( r >= h ) { p = p + q; @@ -79,11 +79,11 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format * if ( error == 0 && *format == mlt_image_yuv422 ) { // Get the charcoal scatter value - int x_scatter = mlt_properties_get_double( mlt_filter_properties( filter ), "x_scatter" ); - int y_scatter = mlt_properties_get_double( mlt_filter_properties( filter ), "y_scatter" ); - float scale = mlt_properties_get_double( mlt_filter_properties( filter ), "scale" ); - float mix = mlt_properties_get_double( mlt_filter_properties( filter ), "mix" ); - int invert = mlt_properties_get_int( mlt_filter_properties( filter ), "invert" ); + int x_scatter = mlt_properties_get_double( MLT_FILTER_PROPERTIES( filter ), "x_scatter" ); + int y_scatter = mlt_properties_get_double( MLT_FILTER_PROPERTIES( filter ), "y_scatter" ); + float scale = mlt_properties_get_double( MLT_FILTER_PROPERTIES( filter ), "scale" ); + float mix = mlt_properties_get_double( MLT_FILTER_PROPERTIES( filter ), "mix" ); + int invert = mlt_properties_get_int( MLT_FILTER_PROPERTIES( filter ), "invert" ); // We'll process pixel by pixel int x = 0; @@ -101,6 +101,7 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format * int sum1; int sum2; float sum; + int val; // Loop for each row for ( y = 0; y < *height; y ++ ) @@ -119,15 +120,17 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format * matrix[ 2 ][ 2 ] = get_Y( *image, *width, *height, x + x_scatter, y + y_scatter ); // Do calculations - sum1 = (matrix[2][0] - matrix[0][0]) + 2*(matrix[2][1] - matrix[0][1]) + (matrix[2][2] - matrix[2][0]); - sum2 = (matrix[0][2] - matrix[0][0]) + 2*(matrix[1][2] - matrix[1][0]) + (matrix[2][2] - matrix[2][0]); + sum1 = (matrix[2][0] - matrix[0][0]) + ( (matrix[2][1] - matrix[0][1]) << 1 ) + (matrix[2][2] - matrix[2][0]); + sum2 = (matrix[0][2] - matrix[0][0]) + ( (matrix[1][2] - matrix[1][0]) << 1 ) + (matrix[2][2] - matrix[2][0]); sum = scale * sqrti( sum1 * sum1 + sum2 * sum2 ); // Assign value *p ++ = !invert ? ( sum >= 16 && sum <= 235 ? 251 - sum : sum < 16 ? 235 : 16 ) : ( sum >= 16 && sum <= 235 ? sum : sum < 16 ? 16 : 235 ); q ++; - *p ++ = 128 + mix * ( *q ++ - 128 ); + val = 128 + mix * ( *q ++ - 128 ); + val = val < 16 ? 16 : val > 240 ? 240 : val; + *p ++ = val; } } @@ -135,7 +138,7 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format * *image = temp; // Store new and destroy old - mlt_properties_set_data( mlt_frame_properties( this ), "image", *image, *width * *height * 2, mlt_pool_release, NULL ); + mlt_properties_set_data( MLT_FRAME_PROPERTIES( this ), "image", *image, *width * *height * 2, mlt_pool_release, NULL ); } return error; @@ -162,10 +165,10 @@ mlt_filter filter_charcoal_init( char *arg ) if ( this != NULL ) { this->process = filter_process; - mlt_properties_set( mlt_filter_properties( this ), "x_scatter", "1" ); - mlt_properties_set( mlt_filter_properties( this ), "y_scatter", "1" ); - mlt_properties_set( mlt_filter_properties( this ), "scale", "1.5" ); - mlt_properties_set( mlt_filter_properties( this ), "mix", "0" ); + mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "x_scatter", "1" ); + mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "y_scatter", "1" ); + mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "scale", "1.5" ); + mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "mix", "0" ); } return this; }