Commit d6cfb16f authored by Ilkka Ollakka's avatar 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.
parent 5e2b1119
...@@ -92,6 +92,9 @@ struct filter_sys_t ...@@ -92,6 +92,9 @@ struct filter_sys_t
int w[3], h[3]; int w[3], h[3];
struct vf_priv_s cfg; 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) ...@@ -140,30 +143,24 @@ static int Open(vlc_object_t *this)
return VLC_ENOMEM; return VLC_ENOMEM;
} }
filter->p_sys = sys;
filter->pf_video_filter = Filter;
config_ChainParse(filter, FILTER_PREFIX, filter_options, config_ChainParse(filter, FILTER_PREFIX, filter_options,
filter->p_cfg); filter->p_cfg);
float luma_spat =
var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-spat"); vlc_mutex_init( &sys->coefs_mutex );
float chroma_spat = sys->b_recalc_coefs = true;
var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-spat"); sys->luma_spat = var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-spat");
float luma_temp = sys->chroma_spat = var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-spat");
var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-temp"); sys->luma_temp = var_CreateGetFloatCommand(filter, FILTER_PREFIX "luma-temp");
float chroma_temp = sys->chroma_temp = var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-temp");
var_CreateGetFloatCommand(filter, FILTER_PREFIX "chroma-temp");
filter->p_sys = sys;
PrecalcCoefs(cfg->Coefs[0], luma_spat); filter->pf_video_filter = Filter;
PrecalcCoefs(cfg->Coefs[1], luma_temp);
PrecalcCoefs(cfg->Coefs[2], chroma_spat); var_AddCallback( filter, FILTER_PREFIX "luma-spat", DenoiseCallback, sys );
PrecalcCoefs(cfg->Coefs[3], chroma_temp); var_AddCallback( filter, FILTER_PREFIX "chroma-spat", DenoiseCallback, sys );
var_AddCallback( filter, FILTER_PREFIX "luma-temp", DenoiseCallback, sys );
var_AddCallback( filter, FILTER_PREFIX "luma-spat", DenoiseCallback, cfg ); var_AddCallback( filter, FILTER_PREFIX "chroma-temp", DenoiseCallback, sys );
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 );
return VLC_SUCCESS; return VLC_SUCCESS;
} }
...@@ -177,6 +174,13 @@ static void Close(vlc_object_t *this) ...@@ -177,6 +174,13 @@ static void Close(vlc_object_t *this)
filter_sys_t *sys = filter->p_sys; filter_sys_t *sys = filter->p_sys;
struct vf_priv_s *cfg = &sys->cfg; 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) { for (int i = 0; i < 3; ++i) {
free(cfg->Frame[i]); free(cfg->Frame[i]);
} }
...@@ -192,6 +196,7 @@ static picture_t *Filter(filter_t *filter, picture_t *src) ...@@ -192,6 +196,7 @@ static picture_t *Filter(filter_t *filter, picture_t *src)
picture_t *dst; picture_t *dst;
filter_sys_t *sys = filter->p_sys; filter_sys_t *sys = filter->p_sys;
struct vf_priv_s *cfg = &sys->cfg; struct vf_priv_s *cfg = &sys->cfg;
bool recalc = false;
if (!src) return NULL; if (!src) return NULL;
...@@ -200,6 +205,20 @@ static picture_t *Filter(filter_t *filter, picture_t *src) ...@@ -200,6 +205,20 @@ static picture_t *Filter(filter_t *filter, picture_t *src)
picture_Release(src); picture_Release(src);
return NULL; 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, deNoise(src->p[0].p_pixels, dst->p[0].p_pixels,
cfg->Line, &cfg->Frame[0], sys->w[0], sys->h[0], 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, ...@@ -230,16 +249,21 @@ static int DenoiseCallback( vlc_object_t *p_this, char const *psz_var,
{ {
VLC_UNUSED(p_this); VLC_UNUSED(oldval); 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" ) ) /* Just take values and flag for recalc so we don't block UI thread calling this
PrecalcCoefs(cfg->Coefs[0], newval.f_float); * and don't right thread safety calcing coefs in here without mutex*/
else if( !strcmp( psz_var, FILTER_PREFIX "luma-temp" ) ) vlc_mutex_lock( &sys->coefs_mutex );
PrecalcCoefs(cfg->Coefs[1], newval.f_float); if( !strcmp( psz_var, FILTER_PREFIX "luma-spat") )
else if( !strcmp( psz_var, FILTER_PREFIX "chroma-spat") ) sys->luma_spat = newval.f_float;
PrecalcCoefs(cfg->Coefs[2], 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") ) 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; return VLC_SUCCESS;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment