[vlc-devel] [PATCH v6 1/5] video-filtering_sharpening: remove precalc_table, replace locks with atomic accesses

victorien.lecouviour.tuffet at gmail.com victorien.lecouviour.tuffet at gmail.com
Tue Apr 11 23:39:18 CEST 2017


From: Victorien Le Couviour--Tuffet <victorien.lecouviour.tuffet at gmail.com>

precalc_table wasn't used
---
 modules/video_filter/sharpen.c | 36 +++++++++++-------------------------
 1 file changed, 11 insertions(+), 25 deletions(-)

diff --git a/modules/video_filter/sharpen.c b/modules/video_filter/sharpen.c
index 6ca9020195..65268cc6a4 100644
--- a/modules/video_filter/sharpen.c
+++ b/modules/video_filter/sharpen.c
@@ -38,6 +38,7 @@
 #endif
 
 #include <vlc_common.h>
+#include <vlc_atomic.h>
 #include <vlc_plugin.h>
 #include <vlc_filter.h>
 #include <vlc_picture.h>
@@ -69,8 +70,9 @@ vlc_module_begin ()
     set_category( CAT_VIDEO )
     set_subcategory( SUBCAT_VIDEO_VFILTER )
     set_capability( "video filter", 0 )
-    add_float_with_range( "sharpen-sigma", 0.05, 0.0, 2.0,
+    add_float_with_range( FILTER_PREFIX "sigma", 0.05, 0.0, 2.0,
         SIG_TEXT, SIG_LONGTEXT, false )
+    change_safe()
     add_shortcut( "sharpen" )
     set_callbacks( Create, Destroy )
 vlc_module_end ()
@@ -88,18 +90,9 @@ static const char *const ppsz_filter_options[] = {
 
 struct filter_sys_t
 {
-    vlc_mutex_t lock;
-    int tab_precalc[512];
+    atomic_int sigma;
 };
 
-static void init_precalc_table(filter_sys_t *p_filter, float sigma)
-{
-    for(int i = 0; i < 512; ++i)
-    {
-        p_filter->tab_precalc[i] = (i - 256) * sigma;
-    }
-}
-
 /*****************************************************************************
  * Create: allocates Sharpen video thread output method
  *****************************************************************************
@@ -129,10 +122,10 @@ static int Create( vlc_object_t *p_this )
     config_ChainParse( p_filter, FILTER_PREFIX, ppsz_filter_options,
                    p_filter->p_cfg );
 
-    float sigma = var_CreateGetFloatCommand( p_filter, FILTER_PREFIX "sigma" );
-    init_precalc_table(p_filter->p_sys, sigma);
+    atomic_init(&p_filter->p_sys->sigma,
+                var_CreateGetFloatCommand(p_filter, FILTER_PREFIX "sigma")
+                * (1 << 20));
 
-    vlc_mutex_init( &p_filter->p_sys->lock );
     var_AddCallback( p_filter, FILTER_PREFIX "sigma",
                      SharpenCallback, p_filter->p_sys );
 
@@ -151,7 +144,6 @@ static void Destroy( vlc_object_t *p_this )
     filter_sys_t *p_sys = p_filter->p_sys;
 
     var_DelCallback( p_filter, FILTER_PREFIX "sigma", SharpenCallback, p_sys );
-    vlc_mutex_destroy( &p_sys->lock );
     free( p_sys );
 }
 
@@ -193,7 +185,7 @@ static void Destroy( vlc_object_t *p_this )
                     (p_src[(i + 1) * i_src_line_len + j + 1] * v[0]);   \
                                                                         \
                 pix = pix >= 0 ? VLC_CLIP(pix, 0, maxval) : -VLC_CLIP(pix * -1, 0, maxval); \
-                p_out[i * i_out_line_len + j] = VLC_CLIP( p_src[i * i_src_line_len + j] + ((pix * sigma) >> 20), 0, maxval); \
+                p_out[i * i_out_line_len + j] = VLC_CLIP( p_src[i * i_src_line_len + j] + ((pix * atomic_load(&p_filter->p_sys->sigma)) >> 20), 0, maxval); \
             }                                                           \
             p_out[i * i_out_line_len + i_visible_pitch / 2 - 1] =       \
                 p_src[i * i_src_line_len + i_visible_pitch / 2 - 1];    \
@@ -209,7 +201,6 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
     const int v[2] = { -1, 3 /* 2^3 = 8 */ };
     const unsigned i_visible_lines = p_pic->p[Y_PLANE].i_visible_lines;
     const unsigned i_visible_pitch = p_pic->p[Y_PLANE].i_visible_pitch;
-    const int sigma = var_GetFloat( p_filter, FILTER_PREFIX "sigma" ) * (1 << 20);
 
     p_outpic = filter_NewPicture( p_filter );
     if( !p_outpic )
@@ -218,9 +209,6 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
         return NULL;
     }
 
-    /* perform convolution only on Y plane. Avoid border line. */
-    vlc_mutex_lock( &p_filter->p_sys->lock );
-
     if (!IS_YUV_420_10BITS(p_pic->format.i_chroma))
     {
         typedef uint8_t data_t;
@@ -234,8 +222,6 @@ static picture_t *Filter( filter_t *p_filter, picture_t *p_pic )
         SHARPEN_FRAME(1023);
     }
 
-    vlc_mutex_unlock( &p_filter->p_sys->lock );
-
     plane_CopyPixels( &p_outpic->p[U_PLANE], &p_pic->p[U_PLANE] );
     plane_CopyPixels( &p_outpic->p[V_PLANE], &p_pic->p[V_PLANE] );
 
@@ -249,8 +235,8 @@ static int SharpenCallback( vlc_object_t *p_this, char const *psz_var,
     VLC_UNUSED(p_this); VLC_UNUSED(oldval); VLC_UNUSED(psz_var);
     filter_sys_t *p_sys = (filter_sys_t *)p_data;
 
-    vlc_mutex_lock( &p_sys->lock );
-    init_precalc_table( p_sys,  VLC_CLIP( newval.f_float, 0.f, 2.f ) );
-    vlc_mutex_unlock( &p_sys->lock );
+    atomic_store(&p_sys->sigma,
+                 VLC_CLIP(newval.f_float, 0.f, 2.f) * (1 << 20));
+
     return VLC_SUCCESS;
 }
-- 
2.12.0



More information about the vlc-devel mailing list