[vlc-devel] [PATCH v2 01/13] video_output: use filter lock to change filters in the vout thread

Steve Lhomme robux4 at ycbcr.xyz
Mon Aug 17 15:15:20 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.

We don't use the control lock anymore, just the filters lock.

Now the filter changes are applied even in frame by frame mode.

Remove related control push/clean functions.
---
 src/video_output/control.c      | 26 --------------------------
 src/video_output/control.h      |  4 ----
 src/video_output/video_output.c | 29 +++++++++++++++++++++++------
 3 files changed, 23 insertions(+), 36 deletions(-)

diff --git a/src/video_output/control.c b/src/video_output/control.c
index fd0c80fe6eb..db9c30b32ad 100644
--- a/src/video_output/control.c
+++ b/src/video_output/control.c
@@ -35,17 +35,6 @@ void vout_control_cmd_Init(vout_control_cmd_t *cmd, int type)
     cmd->type = 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;
-    }
-}
-
 /* */
 void vout_control_Init(vout_control_t *ctrl)
 {
@@ -63,10 +52,6 @@ void vout_control_Init(vout_control_t *ctrl)
 void vout_control_Clean(vout_control_t *ctrl)
 {
     /* */
-    for (int i = 0; i < ctrl->cmd.i_size; i++) {
-        vout_control_cmd_t cmd = ARRAY_VAL(ctrl->cmd, i);
-        vout_control_cmd_Clean(&cmd);
-    }
     ARRAY_RESET(ctrl->cmd);
 }
 
@@ -83,8 +68,6 @@ void vout_control_Push(vout_control_t *ctrl, vout_control_cmd_t *cmd)
     if (!ctrl->is_dead) {
         ARRAY_APPEND(ctrl->cmd, *cmd);
         vlc_cond_signal(&ctrl->wait_request);
-    } else {
-        vout_control_cmd_Clean(cmd);
     }
     vlc_mutex_unlock(&ctrl->lock);
 }
@@ -113,15 +96,6 @@ void vout_control_PushBool(vout_control_t *ctrl, int type, bool boolean)
     vout_control_Push(ctrl, &cmd);
 }
 
-void vout_control_PushString(vout_control_t *ctrl, int type, const char *string)
-{
-    vout_control_cmd_t cmd;
-
-    vout_control_cmd_Init(&cmd, type);
-    cmd.string = string ? strdup(string) : NULL;
-    vout_control_Push(ctrl, &cmd);
-}
-
 void vout_control_Hold(vout_control_t *ctrl)
 {
     vlc_mutex_lock(&ctrl->lock);
diff --git a/src/video_output/control.h b/src/video_output/control.h
index eee86c4ca93..ed4613d6c14 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 */
@@ -39,13 +38,11 @@ typedef struct {
 
     union {
         bool    boolean;
-        char    *string;
         vlc_mouse_t mouse;
     };
 } vout_control_cmd_t;
 
 void vout_control_cmd_Init(vout_control_cmd_t *, int type);
-void vout_control_cmd_Clean(vout_control_cmd_t *);
 
 typedef struct {
     vlc_mutex_t lock;
@@ -70,7 +67,6 @@ void vout_control_WaitEmpty(vout_control_t *);
 void vout_control_Push(vout_control_t *, vout_control_cmd_t *);
 void vout_control_PushVoid(vout_control_t *, int type);
 void vout_control_PushBool(vout_control_t *, int type, bool boolean);
-void vout_control_PushString(vout_control_t *, int type, const char *string);
 void vout_control_Wake(vout_control_t *);
 void vout_control_Hold(vout_control_t *);
 void vout_control_Release(vout_control_t *);
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 6cf7a426673..c934430dae8 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            filters_changed;
+        char            *new_filters;
         char            *configuration;
         video_format_t    src_fmt;
         vlc_video_context *src_vctx;
@@ -740,8 +742,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.filters_changed = true;
+        }
+    }
+    else if (filters != NULL)
+    {
+        sys->filter.new_filters = strdup(filters);
+        sys->filter.filters_changed = true;
+    }
+    vlc_mutex_unlock(&sys->filter.lock);
 }
 
 void vout_ControlChangeInterlacing(vout_thread_t *vout, bool set)
@@ -1443,6 +1459,11 @@ static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
 
     assert(sys->clock);
 
+    vlc_mutex_lock(&sys->filter.lock);
+    if (sys->filter.filters_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;
@@ -1863,9 +1884,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;
@@ -1873,7 +1891,6 @@ static void *Thread(void *object)
                     ThreadProcessMouseState(vout, &cmd.mouse);
                     break;
             }
-            vout_control_cmd_Clean(&cmd);
         }
 
         deadline = VLC_TICK_INVALID;
-- 
2.26.2



More information about the vlc-devel mailing list