X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fvideo_filter%2Fmotionblur.c;h=aad8946b0710e680060e009330d974d7c214cbde;hb=40a2f546e1dca36312916b391f64f96a438f0a37;hp=40c7044d3b84e708f7d49ab43435c1bbce628c3c;hpb=fa4bde0b26a6c7a2a617362ea0b17144686e39fe;p=vlc diff --git a/modules/video_filter/motionblur.c b/modules/video_filter/motionblur.c index 40c7044d3b..aad8946b07 100644 --- a/modules/video_filter/motionblur.c +++ b/modules/video_filter/motionblur.c @@ -33,7 +33,6 @@ #include #include #include -#include #include #include "filter_picture.h" @@ -80,6 +79,7 @@ static const char *const ppsz_filter_options[] = { *****************************************************************************/ struct filter_sys_t { + vlc_spinlock_t lock; int i_factor; uint8_t **pp_planes; @@ -105,6 +105,7 @@ static int Create( vlc_object_t *p_this ) p_filter->p_sys->i_factor = var_CreateGetIntegerCommand( p_filter, FILTER_PREFIX "factor" ); + vlc_spin_init( &p_filter->p_sys->lock ); var_AddCallback( p_filter, FILTER_PREFIX "factor", MotionBlurCallback, p_filter->p_sys ); @@ -121,6 +122,10 @@ static void Destroy( vlc_object_t *p_this ) { filter_t *p_filter = (filter_t *)p_this; + var_DelCallback( p_filter, FILTER_PREFIX "factor", + MotionBlurCallback, p_filter->p_sys ); + vlc_spin_destroy( &p_filter->p_sys->lock ); + while( p_filter->p_sys->i_planes-- ) free( p_filter->p_sys->pp_planes[p_filter->p_sys->i_planes] ); free( p_filter->p_sys->pp_planes ); @@ -173,8 +178,11 @@ static void RenderBlur( filter_sys_t *p_sys, picture_t *p_newpic, picture_t *p_outpic ) { int i_plane; - int i_oldfactor = p_sys->i_factor; + vlc_spin_lock( &p_sys->lock ); + const int i_oldfactor = p_sys->i_factor; + vlc_spin_unlock( &p_sys->lock ); int i_newfactor = 128 - i_oldfactor; + for( i_plane = 0; i_plane < p_outpic->i_planes; i_plane++ ) { uint8_t *p_old, *p_new, *p_out, *p_out_end, *p_out_line_end; @@ -220,7 +228,12 @@ static int MotionBlurCallback( vlc_object_t *p_this, char const *psz_var, { VLC_UNUSED(p_this); VLC_UNUSED(oldval); filter_sys_t *p_sys = (filter_sys_t *)p_data; + if( !strcmp( psz_var, FILTER_PREFIX "factor" ) ) + { + vlc_spin_lock( &p_sys->lock ); p_sys->i_factor = __MIN( 127, __MAX( 1, newval.i_int ) ); + vlc_spin_unlock( &p_sys->lock ); + } return VLC_SUCCESS; }