vlc | branch: master | Ilkka Ollakka <[email protected]> | Sun Dec 1 13:08:06 2013 +0200| [d6cfb16fa092a05130c6f92fdb896e2c0723824c] | committer: Ilkka Ollakka
hqdn3d: add mutex on callback and delete callback on close Now callbacks are thread-safe and don't block UI thread while calculating coefs again. Also remove callbacks on Close. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d6cfb16fa092a05130c6f92fdb896e2c0723824c --- modules/video_filter/hqdn3d.c | 82 ++++++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/modules/video_filter/hqdn3d.c b/modules/video_filter/hqdn3d.c index 59958a9..f65dbd2 100644 --- a/modules/video_filter/hqdn3d.c +++ b/modules/video_filter/hqdn3d.c @@ -92,6 +92,9 @@ struct filter_sys_t int w[3], h[3]; struct vf_priv_s cfg; + bool b_recalc_coefs; + vlc_mutex_t coefs_mutex; + float luma_spat, luma_temp, chroma_spat, chroma_temp; }; /***************************************************************************** @@ -140,30 +143,24 @@ static int Open(vlc_object_t *this) return VLC_ENOMEM; } - filter->p_sys = sys; - filter->pf_video_filter = Filter; - config_ChainParse(filter, FILTER_PREFIX, filter_options, filter->p_cfg); - float luma_spat = - var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-spat"); - float chroma_spat = - var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-spat"); - float luma_temp = - var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-temp"); - float chroma_temp = - var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-temp"); - - PrecalcCoefs(cfg->Coefs[0], luma_spat); - PrecalcCoefs(cfg->Coefs[1], luma_temp); - PrecalcCoefs(cfg->Coefs[2], chroma_spat); - PrecalcCoefs(cfg->Coefs[3], chroma_temp); - - var_AddCallback( filter, FILTER_PREFIX "luma-spat", DenoiseCallback, cfg ); - var_AddCallback( filter, FILTER_PREFIX "chroma-spat", DenoiseCallback, cfg ); - var_AddCallback( filter, FILTER_PREFIX "luma-temp", DenoiseCallback, cfg ); - var_AddCallback( filter, FILTER_PREFIX "chroma-temp", DenoiseCallback, cfg ); + + vlc_mutex_init( &sys->coefs_mutex ); + sys->b_recalc_coefs = true; + sys->luma_spat = var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-spat"); + sys->chroma_spat = var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-spat"); + sys->luma_temp = var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-temp"); + sys->chroma_temp = var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-temp"); + + filter->p_sys = sys; + filter->pf_video_filter = Filter; + + var_AddCallback( filter, FILTER_PREFIX "luma-spat", DenoiseCallback, sys ); + var_AddCallback( filter, FILTER_PREFIX "chroma-spat", DenoiseCallback, sys ); + var_AddCallback( filter, FILTER_PREFIX "luma-temp", DenoiseCallback, sys ); + var_AddCallback( filter, FILTER_PREFIX "chroma-temp", DenoiseCallback, sys ); return VLC_SUCCESS; } @@ -177,6 +174,13 @@ static void Close(vlc_object_t *this) filter_sys_t *sys = filter->p_sys; struct vf_priv_s *cfg = &sys->cfg; + var_DelCallback( filter, FILTER_PREFIX "luma-spat", DenoiseCallback, sys ); + var_DelCallback( filter, FILTER_PREFIX "chroma-spat", DenoiseCallback, sys ); + var_DelCallback( filter, FILTER_PREFIX "luma-temp", DenoiseCallback, sys ); + var_DelCallback( filter, FILTER_PREFIX "chroma-temp", DenoiseCallback, sys ); + + vlc_mutex_destroy( &sys->coefs_mutex ); + for (int i = 0; i < 3; ++i) { free(cfg->Frame[i]); } @@ -192,6 +196,7 @@ static picture_t *Filter(filter_t *filter, picture_t *src) picture_t *dst; filter_sys_t *sys = filter->p_sys; struct vf_priv_s *cfg = &sys->cfg; + bool recalc = false; if (!src) return NULL; @@ -200,6 +205,20 @@ static picture_t *Filter(filter_t *filter, picture_t *src) picture_Release(src); return NULL; } + vlc_mutex_lock( &sys->coefs_mutex ); + recalc = sys->b_recalc_coefs; + sys->b_recalc_coefs = false; + + if( unlikely( recalc ) ) + { + msg_Dbg( filter, "Changing coefs to %.2f %.2f %.2f %.2f", + sys->luma_spat, sys->luma_temp, sys->chroma_spat, sys->chroma_temp ); + PrecalcCoefs(cfg->Coefs[0], sys->luma_spat); + PrecalcCoefs(cfg->Coefs[1], sys->luma_temp); + PrecalcCoefs(cfg->Coefs[2], sys->chroma_spat); + PrecalcCoefs(cfg->Coefs[3], sys->chroma_temp); + } + vlc_mutex_unlock( &sys->coefs_mutex ); deNoise(src->p[0].p_pixels, dst->p[0].p_pixels, cfg->Line, &cfg->Frame[0], sys->w[0], sys->h[0], @@ -230,16 +249,21 @@ static int DenoiseCallback( vlc_object_t *p_this, char const *psz_var, { VLC_UNUSED(p_this); VLC_UNUSED(oldval); - struct vf_priv_s *cfg = (struct vf_priv_s *)p_data; + filter_sys_t *sys = (filter_sys_t*)p_data; - if( !strcmp( psz_var, FILTER_PREFIX "luma-spat" ) ) - PrecalcCoefs(cfg->Coefs[0], newval.f_float); - else if( !strcmp( psz_var, FILTER_PREFIX "luma-temp" ) ) - PrecalcCoefs(cfg->Coefs[1], newval.f_float); - else if( !strcmp( psz_var, FILTER_PREFIX "chroma-spat") ) - PrecalcCoefs(cfg->Coefs[2], newval.f_float); + /* Just take values and flag for recalc so we don't block UI thread calling this + * and don't right thread safety calcing coefs in here without mutex*/ + vlc_mutex_lock( &sys->coefs_mutex ); + if( !strcmp( psz_var, FILTER_PREFIX "luma-spat") ) + sys->luma_spat = newval.f_float; + else if( !strcmp( psz_var, FILTER_PREFIX "luma-temp") ) + sys->luma_temp = newval.f_float; else if( !strcmp( psz_var, FILTER_PREFIX "chroma-temp") ) - PrecalcCoefs(cfg->Coefs[3], newval.f_float); + sys->chroma_spat = newval.f_float; + else if( !strcmp( psz_var, FILTER_PREFIX "chroma-spat") ) + sys->chroma_temp = newval.f_float; + sys->b_recalc_coefs = true; + vlc_mutex_unlock( &sys->coefs_mutex ); return VLC_SUCCESS; } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
