[vlc-commits] vout: add vout_CreateDummy

Thomas Guillem git at videolan.org
Fri May 10 09:51:31 CEST 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Thu May  9 16:57:01 2019 +0200| [65db330108f44381524058a7ead61621fdbc5d68] | committer: Thomas Guillem

vout: add vout_CreateDummy

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=65db330108f44381524058a7ead61621fdbc5d68
---

 src/video_output/video_output.c  | 80 +++++++++++++++++++++++++++++++++++++---
 src/video_output/vout_internal.h |  4 ++
 2 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index d09e88f281..6e8c8608eb 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -217,11 +217,13 @@ static void vout_UpdateWindowSize(vout_thread_t *vout)
 void vout_GetResetStatistic(vout_thread_t *vout, unsigned *restrict displayed,
                             unsigned *restrict lost)
 {
+    assert(!vout->p->dummy);
     vout_statistic_GetReset( &vout->p->statistic, displayed, lost );
 }
 
 bool vout_IsEmpty(vout_thread_t *vout)
 {
+    assert(!vout->p->dummy);
     picture_t *picture = picture_fifo_Peek(vout->p->decoder_fifo);
     if (picture)
         picture_Release(picture);
@@ -231,6 +233,7 @@ bool vout_IsEmpty(vout_thread_t *vout)
 
 void vout_DisplayTitle(vout_thread_t *vout, const char *title)
 {
+    assert(!vout->p->dummy);
     assert(title);
 
     if (!vout->p->title.show)
@@ -242,6 +245,7 @@ void vout_DisplayTitle(vout_thread_t *vout, const char *title)
 
 void vout_MouseState(vout_thread_t *vout, const vlc_mouse_t *mouse)
 {
+    assert(!vout->p->dummy);
     assert(mouse);
     vout_control_cmd_t cmd;
     vout_control_cmd_Init(&cmd, VOUT_CONTROL_MOUSE_STATE);
@@ -253,6 +257,7 @@ void vout_MouseState(vout_thread_t *vout, const vlc_mouse_t *mouse)
 void vout_PutSubpicture( vout_thread_t *vout, subpicture_t *subpic )
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vlc_mutex_lock(&sys->spu_lock);
     if (sys->spu != NULL)
@@ -264,6 +269,7 @@ void vout_PutSubpicture( vout_thread_t *vout, subpicture_t *subpic )
 
 int vout_RegisterSubpictureChannel( vout_thread_t *vout )
 {
+    assert(!vout->p->dummy);
     int channel = VOUT_SPU_CHANNEL_AVAIL_FIRST;
 
     vlc_mutex_lock(&vout->p->spu_lock);
@@ -276,6 +282,7 @@ int vout_RegisterSubpictureChannel( vout_thread_t *vout )
 
 void vout_SetSubpictureClock( vout_thread_t *vout, vlc_clock_t *clock )
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->spu_lock);
     if (vout->p->spu)
         spu_clock_Set(vout->p->spu, clock);
@@ -285,6 +292,7 @@ void vout_SetSubpictureClock( vout_thread_t *vout, vlc_clock_t *clock )
 void vout_FlushSubpictureChannel( vout_thread_t *vout, int channel )
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vlc_mutex_lock(&sys->spu_lock);
     if (sys->spu != NULL)
@@ -295,6 +303,7 @@ void vout_FlushSubpictureChannel( vout_thread_t *vout, int channel )
 void vout_SetSpuHighlight( vout_thread_t *vout,
                         const vlc_spu_highlight_t *spu_hl )
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->spu_lock);
     if (vout->p->spu)
         spu_SetHighlight(vout->p->spu, spu_hl);
@@ -312,6 +321,7 @@ void vout_SetSpuHighlight( vout_thread_t *vout,
  */
 picture_t *vout_GetPicture(vout_thread_t *vout)
 {
+    assert(!vout->p->dummy);
     picture_t *picture = picture_pool_Wait(vout->p->decoder_pool);
     if (likely(picture != NULL)) {
         picture_Reset(picture);
@@ -330,6 +340,7 @@ picture_t *vout_GetPicture(vout_thread_t *vout)
  */
 void vout_PutPicture(vout_thread_t *vout, picture_t *picture)
 {
+    assert(!vout->p->dummy);
     picture->p_next = NULL;
     picture_fifo_Push(vout->p->decoder_fifo, picture);
     vout_control_Wake(&vout->p->control);
@@ -341,6 +352,7 @@ int vout_GetSnapshot(vout_thread_t *vout,
                      video_format_t *fmt,
                      const char *type, vlc_tick_t timeout)
 {
+    assert(!vout->p->dummy);
     picture_t *picture = vout_snapshot_Get(vout->p->snapshot, timeout);
     if (!picture) {
         msg_Err(vout, "Failed to grab a snapshot");
@@ -372,6 +384,7 @@ int vout_GetSnapshot(vout_thread_t *vout,
 /* vout_Control* are usable by anyone at anytime */
 void vout_ChangeFullscreen(vout_thread_t *vout, const char *id)
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->window_lock);
     vout_window_SetFullScreen(vout->p->display_cfg.window, id);
     vlc_mutex_unlock(&vout->p->window_lock);
@@ -379,6 +392,7 @@ void vout_ChangeFullscreen(vout_thread_t *vout, const char *id)
 
 void vout_ChangeWindowed(vout_thread_t *vout)
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->window_lock);
     vout_window_UnsetFullScreen(vout->p->display_cfg.window);
     /* Attempt to reset the intended window size */
@@ -388,6 +402,7 @@ void vout_ChangeWindowed(vout_thread_t *vout)
 
 void vout_ChangeWindowState(vout_thread_t *vout, unsigned st)
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->window_lock);
     vout_window_SetState(vout->p->display_cfg.window, st);
     vlc_mutex_unlock(&vout->p->window_lock);
@@ -396,6 +411,7 @@ void vout_ChangeWindowState(vout_thread_t *vout, unsigned st)
 void vout_ChangeDisplaySize(vout_thread_t *vout,
                             unsigned width, unsigned height)
 {
+    assert(!vout->p->dummy);
     /* DO NOT call this outside the vout window callbacks */
     vout_control_cmd_t cmd;
 
@@ -410,6 +426,7 @@ void vout_ChangeDisplaySize(vout_thread_t *vout,
 void vout_ChangeDisplayFilled(vout_thread_t *vout, bool is_filled)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vlc_mutex_lock(&sys->window_lock);
     sys->display_cfg.is_display_filled = is_filled;
@@ -423,6 +440,7 @@ void vout_ChangeDisplayFilled(vout_thread_t *vout, bool is_filled)
 void vout_ChangeZoom(vout_thread_t *vout, unsigned num, unsigned den)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     if (num != 0 && den != 0) {
         vlc_ureduce(&num, &den, num, den, 0);
@@ -454,6 +472,7 @@ void vout_ChangeSampleAspectRatio(vout_thread_t *vout,
                                   unsigned num, unsigned den)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vlc_mutex_lock(&sys->window_lock);
     sys->source.dar.num = num;
@@ -469,6 +488,7 @@ void vout_ChangeSampleAspectRatio(vout_thread_t *vout,
 void vout_ChangeCropRatio(vout_thread_t *vout, unsigned num, unsigned den)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vlc_mutex_lock(&sys->window_lock);
     if (num != 0 && den != 0) {
@@ -489,6 +509,7 @@ void vout_ChangeCropWindow(vout_thread_t *vout,
                            int x, int y, int width, int height)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
     vout_control_cmd_t cmd;
 
     if (x < 0)
@@ -522,6 +543,7 @@ void vout_ChangeCropBorder(vout_thread_t *vout,
                            int left, int top, int right, int bottom)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
     vout_control_cmd_t cmd;
 
     if (left < 0)
@@ -553,12 +575,14 @@ void vout_ChangeCropBorder(vout_thread_t *vout,
 
 void vout_ControlChangeFilters(vout_thread_t *vout, const char *filters)
 {
+    assert(!vout->p->dummy);
     vout_control_PushString(&vout->p->control, VOUT_CONTROL_CHANGE_FILTERS,
                             filters);
 }
 
 void vout_ControlChangeSubSources(vout_thread_t *vout, const char *filters)
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->spu_lock);
     if (likely(vout->p->spu != NULL))
         spu_ChangeSources(vout->p->spu, filters);
@@ -567,6 +591,7 @@ void vout_ControlChangeSubSources(vout_thread_t *vout, const char *filters)
 
 void vout_ControlChangeSubFilters(vout_thread_t *vout, const char *filters)
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->spu_lock);
     if (likely(vout->p->spu != NULL))
         spu_ChangeFilters(vout->p->spu, filters);
@@ -575,6 +600,7 @@ void vout_ControlChangeSubFilters(vout_thread_t *vout, const char *filters)
 
 void vout_ChangeSubMargin(vout_thread_t *vout, int margin)
 {
+    assert(!vout->p->dummy);
     if (unlikely(vout->p->spu == NULL))
         return;
 
@@ -587,6 +613,7 @@ void vout_ChangeViewpoint(vout_thread_t *vout,
                           const vlc_viewpoint_t *p_viewpoint)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
     vout_control_cmd_t cmd;
 
     vlc_mutex_lock(&sys->window_lock);
@@ -1232,6 +1259,8 @@ static int ThreadDisplayPicture(vout_thread_t *vout, vlc_tick_t *deadline)
 
 void vout_ChangePause(vout_thread_t *vout, bool is_paused, vlc_tick_t date)
 {
+    assert(!vout->p->dummy);
+
     vout_control_Hold(&vout->p->control);
     assert(!vout->p->pause.is_on || !is_paused);
 
@@ -1292,6 +1321,7 @@ static void vout_FlushUnlocked(vout_thread_t *vout, bool below,
 void vout_Flush(vout_thread_t *vout, vlc_tick_t date)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     assert(vout->p->original.i_chroma != 0);
 
@@ -1302,6 +1332,7 @@ void vout_Flush(vout_thread_t *vout, vlc_tick_t date)
 
 void vout_NextPicture(vout_thread_t *vout, vlc_tick_t *duration)
 {
+    assert(!vout->p->dummy);
     *duration = 0;
 
     vout_control_Hold(&vout->p->control);
@@ -1324,6 +1355,7 @@ void vout_NextPicture(vout_thread_t *vout, vlc_tick_t *duration)
 void vout_ChangeDelay(vout_thread_t *vout, vlc_tick_t delay)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vout_control_Hold(&sys->control);
     vlc_clock_SetDelay(vout->p->clock, delay);
@@ -1334,6 +1366,7 @@ void vout_ChangeDelay(vout_thread_t *vout, vlc_tick_t delay)
 void vout_ChangeRate(vout_thread_t *vout, float rate)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vout_control_Hold(&sys->control);
     sys->rate = rate;
@@ -1342,6 +1375,7 @@ void vout_ChangeRate(vout_thread_t *vout, float rate)
 
 void vout_ChangeSpuDelay(vout_thread_t *vout, vlc_tick_t delay)
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->spu_lock);
     if (vout->p->spu)
         spu_clock_SetDelay(vout->p->spu, delay);
@@ -1351,6 +1385,7 @@ void vout_ChangeSpuDelay(vout_thread_t *vout, vlc_tick_t delay)
 
 void vout_ChangeSpuRate(vout_thread_t *vout, float rate)
 {
+    assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->spu_lock);
     vout->p->spu_rate = rate;
     vlc_mutex_unlock(&vout->p->spu_lock);
@@ -1408,6 +1443,7 @@ static void ThreadProcessMouseState(vout_thread_t *vout,
 static int vout_Start(vout_thread_t *vout, const vout_configuration_t *cfg)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     sys->mouse_event = cfg->mouse_event;
     sys->mouse_opaque = cfg->mouse_opaque;
@@ -1525,6 +1561,7 @@ error:
 void vout_Cancel(vout_thread_t *vout, bool canceled)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vout_control_Hold(&sys->control);
     if (sys->decoder_pool != NULL)
@@ -1707,6 +1744,7 @@ void vout_Pause(vout_thread_t *vout)
 void vout_Stop(vout_thread_t *vout)
 {
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     vout_StopDisplay(vout);
 
@@ -1723,6 +1761,7 @@ void vout_Close(vout_thread_t *vout)
     assert(vout);
 
     vout_thread_sys_t *sys = vout->p;
+    assert(!sys->dummy);
 
     if (sys->original.i_chroma != 0)
         vout_Stop(vout);
@@ -1747,6 +1786,12 @@ void vout_Release(vout_thread_t *vout)
     if (atomic_fetch_sub_explicit(&sys->refs, 1, memory_order_release))
         return;
 
+    if (sys->dummy)
+    {
+        vlc_object_delete(VLC_OBJECT(vout));
+        return;
+    }
+
     free(vout->p->splitter_name);
 
     /* Destroy the locks */
@@ -1768,7 +1813,7 @@ void vout_Release(vout_thread_t *vout)
     vlc_object_delete(VLC_OBJECT(vout));
 }
 
-vout_thread_t *vout_Create(vlc_object_t *object)
+static vout_thread_t *vout_CreateCommon(vlc_object_t *object)
 {
     /* Allocate descriptor */
     vout_thread_t *vout = vlc_custom_create(object,
@@ -1777,6 +1822,33 @@ vout_thread_t *vout_Create(vlc_object_t *object)
     if (!vout)
         return NULL;
 
+    vout_CreateVars(vout);
+
+    vout_thread_sys_t *sys = (vout_thread_sys_t *)&vout[1];
+
+    vout->p = sys;
+    return vout;
+}
+
+vout_thread_t *vout_CreateDummy(vlc_object_t *object)
+{
+    vout_thread_t *vout = vout_CreateCommon(object);
+    if (!vout)
+        return NULL;
+
+    vout_thread_sys_t *sys = vout->p;
+    sys->dummy = true;
+    return vout;
+}
+
+vout_thread_t *vout_Create(vlc_object_t *object)
+{
+    vout_thread_t *vout = vout_CreateCommon(object);
+    if (!vout)
+        return NULL;
+    vout_thread_sys_t *sys = vout->p;
+    sys->dummy = false;
+
     /* Register the VLC variable and callbacks. On the one hand, the variables
      * must be ready early on because further initializations below depend on
      * some of them. On the other hand, the callbacks depend on said
@@ -1784,13 +1856,8 @@ vout_thread_t *vout_Create(vlc_object_t *object)
      * visible and callbacks not triggerable before this function returns the
      * fully initialized object to its caller.
      */
-    vout_CreateVars(vout);
     vout_IntfInit(vout);
 
-    vout_thread_sys_t *sys = (vout_thread_sys_t *)&vout[1];
-
-    vout->p = sys;
-
     /* Get splitter name if present */
     sys->splitter_name = config_GetType("video-splitter") ?
         var_InheritString(vout, "video-splitter") : NULL;
@@ -1863,6 +1930,7 @@ int vout_Request(const vout_configuration_t *cfg, input_thread_t *input)
     vout_thread_t *vout = cfg->vout;
     vout_thread_sys_t *sys = vout->p;
 
+    assert(!sys->dummy);
     assert(vout != NULL);
     assert(cfg->fmt != NULL);
     assert(cfg->clock != NULL);
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index 28d8c05e28..5c876db393 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -64,6 +64,8 @@ enum vout_crop_mode {
 /* */
 struct vout_thread_sys_t
 {
+    bool dummy;
+
     /* Splitter module if used */
     char            *splitter_name;
 
@@ -193,6 +195,8 @@ struct vout_thread_sys_t
  */
 vout_thread_t *vout_Create(vlc_object_t *obj) VLC_USED;
 
+vout_thread_t *vout_CreateDummy(vlc_object_t *obj) VLC_USED;
+
 /**
  * Returns a suitable vout or release the given one.
  *



More information about the vlc-commits mailing list