[vlc-devel] [PATCH 03/17] video_output: use filter lock to change filters in the vout thread

Steve Lhomme robux4 at ycbcr.xyz
Mon Sep 14 16:03:14 CEST 2020


We don't need to wait when enabling filters, it's OK if we miss the current
frame and apply it in the next loop iteration. The filter changes will
be applied just before the picture is rendered, only once between frames.

We don't use the control lock anymore (from vout_control_PushString), just the
filters lock.

Now the filter changes are applied even in frame by frame mode.
---
 src/video_output/control.c      |  3 ---
 src/video_output/control.h      |  1 -
 src/video_output/video_output.c | 32 +++++++++++++++++++++++++++-----
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/src/video_output/control.c b/src/video_output/control.c
index b4a9a71165f..7089157bcdb 100644
--- a/src/video_output/control.c
+++ b/src/video_output/control.c
@@ -39,9 +39,6 @@ void vout_control_cmd_Init(vout_control_cmd_t *cmd, int type)
 void vout_control_cmd_Clean(vout_control_cmd_t *cmd)
 {
     switch (cmd->type) {
-    case VOUT_CONTROL_CHANGE_FILTERS:
-        free(cmd->string);
-        break;
     default:
         break;
     }
diff --git a/src/video_output/control.h b/src/video_output/control.h
index eee86c4ca93..6db75d4b95e 100644
--- a/src/video_output/control.h
+++ b/src/video_output/control.h
@@ -28,7 +28,6 @@
 /* */
 enum {
     VOUT_CONTROL_TERMINATE,
-    VOUT_CONTROL_CHANGE_FILTERS,        /* string */
     VOUT_CONTROL_CHANGE_INTERLACE,      /* boolean */
 
     VOUT_CONTROL_MOUSE_STATE,           /* vlc_mouse_t */
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index ed1e3bfcb07..c7153a54c1c 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -172,6 +172,8 @@ typedef struct vout_thread_sys_t
     /* Video filter2 chain */
     struct {
         vlc_mutex_t     lock;
+        bool            changed;
+        char            *new_filters;
         char            *configuration;
         video_format_t    src_fmt;
         vlc_video_context *src_vctx;
@@ -771,8 +773,22 @@ void vout_ControlChangeFilters(vout_thread_t *vout, const char *filters)
 {
     vout_thread_sys_t *sys = VOUT_THREAD_TO_SYS(vout);
     assert(!sys->dummy);
-    vout_control_PushString(&sys->control, VOUT_CONTROL_CHANGE_FILTERS,
-                            filters);
+    vlc_mutex_lock(&sys->filter.lock);
+    if (sys->filter.new_filters)
+    {
+        if (filters == NULL || strcmp(sys->filter.new_filters, filters))
+        {
+            free(sys->filter.new_filters);
+            sys->filter.new_filters = filters ? strdup(filters) : NULL;
+            sys->filter.changed = true;
+        }
+    }
+    else if (filters != NULL)
+    {
+        sys->filter.new_filters = strdup(filters);
+        sys->filter.changed = true;
+    }
+    vlc_mutex_unlock(&sys->filter.lock);
 }
 
 void vout_ControlChangeInterlacing(vout_thread_t *vout, bool set)
@@ -1059,6 +1075,8 @@ static void ThreadChangeFilters(vout_thread_sys_t *vout,
         sys->filter.configuration = filters ? strdup(filters) : NULL;
     }
 
+    sys->filter.changed = false;
+
     if (!is_locked)
         vlc_mutex_unlock(&sys->filter.lock);
 }
@@ -1474,6 +1492,13 @@ static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
 
     assert(sys->clock);
 
+    vlc_mutex_lock(&sys->filter.lock);
+    if (sys->filter.changed)
+    {
+        ThreadChangeFilters(vout, sys->filter.new_filters, NULL, true);
+    }
+    vlc_mutex_unlock(&sys->filter.lock);
+
     if (first)
         if (ThreadDisplayPreparePicture(vout, true, frame_by_frame, &paused)) /* FIXME not sure it is ok */
             return VLC_EGENERIC;
@@ -1882,9 +1907,6 @@ static void *Thread(void *object)
             switch(cmd.type) {
                 case VOUT_CONTROL_TERMINATE:
                     return NULL; /* no need to clean &cmd */
-                case VOUT_CONTROL_CHANGE_FILTERS:
-                    ThreadChangeFilters(vout, cmd.string, NULL, false);
-                    break;
                 case VOUT_CONTROL_CHANGE_INTERLACE:
                     ThreadChangeFilters(vout, NULL, &cmd.boolean, false);
                     break;
-- 
2.26.2



More information about the vlc-devel mailing list