[vlc-devel] [PATCH 1/3] vout: put subpictures on calling thread

RĂ©mi Denis-Courmont remi at remlab.net
Sun Jan 27 15:41:20 CET 2019


There is a mixture of subpicture-related calls, with some running on
the calling thread, and others running on the video output thread
control loop.

The later may be delayed, depending on other video output thread
processing, sleeping and pending control requests. This leads to a
race condition, and potentially inconsistent ordering of calls on the
SPU instance.

This patch runs vout_SubPicture() directly on the calling thread and
adds a missing check for nonexistent/destroyed SPU.
---
 src/video_output/control.c      |  4 ----
 src/video_output/control.h      |  2 --
 src/video_output/video_output.c | 22 ++++++++--------------
 3 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/src/video_output/control.c b/src/video_output/control.c
index c62d80b303..946f470872 100644
--- a/src/video_output/control.c
+++ b/src/video_output/control.c
@@ -38,10 +38,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_SUBPICTURE:
-        if (cmd->subpicture)
-            subpicture_Delete(cmd->subpicture);
-        break;
     case VOUT_CONTROL_CHANGE_FILTERS:
         free(cmd->string);
         break;
diff --git a/src/video_output/control.h b/src/video_output/control.h
index 989ba9dd9a..c161097f90 100644
--- a/src/video_output/control.h
+++ b/src/video_output/control.h
@@ -36,7 +36,6 @@ enum {
     VOUT_CONTROL_START,
     VOUT_CONTROL_STOP,
 #endif
-    VOUT_CONTROL_SUBPICTURE,            /* subpicture */
     VOUT_CONTROL_FLUSH_SUBPICTURE,      /* integer */
     VOUT_CONTROL_CHANGE_FILTERS,        /* string */
     VOUT_CONTROL_CHANGE_INTERLACE,      /* boolean */
@@ -89,7 +88,6 @@ typedef struct {
         } window;
         vlc_mouse_t mouse;
         const vout_configuration_t *cfg;
-        subpicture_t *subpicture;
         vlc_viewpoint_t viewpoint;
     };
 } vout_control_cmd_t;
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 98babd45fd..c346f6d10c 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -531,12 +531,16 @@ void vout_MouseState(vout_thread_t *vout, const vlc_mouse_t *mouse)
 
 void vout_PutSubpicture( vout_thread_t *vout, subpicture_t *subpic )
 {
-    vout_control_cmd_t cmd;
-    vout_control_cmd_Init(&cmd, VOUT_CONTROL_SUBPICTURE);
-    cmd.subpicture = subpic;
+    vout_thread_sys_t *sys = vout->p;
 
-    vout_control_Push(&vout->p->control, &cmd);
+    vlc_mutex_lock(&sys->spu_lock);
+    if (sys->spu != NULL)
+        spu_PutSubpicture(sys->spu, subpic);
+    else
+        subpicture_Delete(subpic);
+    vlc_mutex_unlock(&sys->spu_lock);
 }
+
 int vout_RegisterSubpictureChannel( vout_thread_t *vout )
 {
     int channel = VOUT_SPU_CHANNEL_AVAIL_FIRST;
@@ -1477,12 +1481,6 @@ static int ThreadDisplayPicture(vout_thread_t *vout, vlc_tick_t *deadline)
     return force_refresh ? VLC_EGENERIC : ret;
 }
 
-static void ThreadDisplaySubpicture(vout_thread_t *vout,
-                                    subpicture_t *subpicture)
-{
-    spu_PutSubpicture(vout->p->spu, subpicture);
-}
-
 static void ThreadFlushSubpicture(vout_thread_t *vout, int channel)
 {
     spu_ClearChannel(vout->p->spu, channel);
@@ -1785,10 +1783,6 @@ static int ThreadControl(vout_thread_t *vout, vout_control_cmd_t cmd)
     case VOUT_CONTROL_CANCEL:
         ThreadCancel(vout, cmd.boolean);
         break;
-    case VOUT_CONTROL_SUBPICTURE:
-        ThreadDisplaySubpicture(vout, cmd.subpicture);
-        cmd.subpicture = NULL;
-        break;
     case VOUT_CONTROL_FLUSH_SUBPICTURE:
         ThreadFlushSubpicture(vout, cmd.integer);
         break;
-- 
2.20.1



More information about the vlc-devel mailing list