X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Fopengl%2Ffilter_deconvolution_sharpen.cpp;h=8a33f4947508ef8183fcd35e1a2d2144d5751a00;hb=4b425d84e9afc3cbcee587344a7852f1b36f152f;hp=546c489f915d12d1672b53938dfb5e11b1d85379;hpb=cd87c4c715c1c3373cec5baded108ec5bd353fa2;p=mlt diff --git a/src/modules/opengl/filter_deconvolution_sharpen.cpp b/src/modules/opengl/filter_deconvolution_sharpen.cpp index 546c489f..8a33f494 100644 --- a/src/modules/opengl/filter_deconvolution_sharpen.cpp +++ b/src/modules/opengl/filter_deconvolution_sharpen.cpp @@ -21,25 +21,43 @@ #include #include -#include "glsl_manager.h" +#include "filter_glsl_manager.h" #include +static int get_image( mlt_frame frame, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable ) +{ + mlt_filter filter = (mlt_filter) mlt_frame_pop_service( frame ); + mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); + GlslManager::get_instance()->lock_service( frame ); + Effect* effect = GlslManager::get_effect( MLT_FILTER_SERVICE( filter ), frame ); + if ( effect ) { + mlt_position position = mlt_filter_get_position( filter, frame ); + mlt_position length = mlt_filter_get_length2( filter, frame ); + bool ok = effect->set_int( "matrix_size", + mlt_properties_anim_get_int( properties, "matrix_size", position, length ) ); + ok |= effect->set_float( "cirlce_radius", + mlt_properties_anim_get_double( properties, "circle_radius", position, length ) ); + ok |= effect->set_float( "gaussian_radius", + mlt_properties_anim_get_double( properties, "gaussian_radius", position, length ) ); + ok |= effect->set_float( "correlation", + mlt_properties_anim_get_double( properties, "correlation", position, length ) ); + ok |= effect->set_float( "noise", + mlt_properties_anim_get_double( properties, "noise", position, length ) ); + assert(ok); + } + GlslManager::get_instance()->unlock_service( frame ); + *format = mlt_image_glsl; + return mlt_frame_get_image( frame, image, format, width, height, writable ); +} + static mlt_frame process( mlt_filter filter, mlt_frame frame ) { if ( !mlt_frame_is_test_card( frame ) ) { - Effect* effect = GlslManager::get_effect( filter, frame ); - if ( !effect ) - GlslManager::add_effect( filter, frame, new DeconvolutionSharpenEffect() ); - if ( effect ) { - mlt_properties filter_props = MLT_FILTER_PROPERTIES( filter ); - bool ok = effect->set_int( "matrix_size", mlt_properties_get_int( filter_props, "matrix_size" ) ); - ok |= effect->set_float( "circle_radius", mlt_properties_get_double( filter_props, "circle_radius" ) ); - ok |= effect->set_float( "gaussian_radius", mlt_properties_get_double( filter_props, "gaussian_radius" ) ); - ok |= effect->set_float( "correlation", mlt_properties_get_double( filter_props, "correlation" ) ); - ok |= effect->set_float( "noise", mlt_properties_get_double( filter_props, "noise" ) ); - assert(ok); - } + if ( !GlslManager::get_effect( MLT_FILTER_SERVICE( filter ), frame ) ) + GlslManager::add_effect( MLT_FILTER_SERVICE( filter ), frame, new DeconvolutionSharpenEffect() ); } + mlt_frame_push_service( frame, filter ); + mlt_frame_push_get_image( frame, get_image ); return frame; }