[vlc-devel] [PATCH 2/7] vout: move out vout_window_t from vout_display_cfg_t

Thomas Guillem thomas at gllm.fr
Thu Mar 26 16:33:48 CET 2020


The main reason of this change is that the vout_display_cfg_t struct is
expected to change (from the different vd controls) whereas the window should
not change during the lifetime of the vd plugin. Furthermore, the window can't
be "configured" like the other members of this struct.
---
 include/vlc_opengl.h                    |  3 +++
 include/vlc_vout_display.h              | 18 ++++++++++-----
 modules/hw/mmal/vout.c                  |  4 ++--
 modules/hw/vdpau/display.c              |  4 ++--
 modules/video_output/android/display.c  |  4 ++--
 modules/video_output/caca.c             |  4 ++--
 modules/video_output/caopengllayer.m    |  4 ++--
 modules/video_output/fb.c               |  3 ++-
 modules/video_output/ios.m              |  4 ++--
 modules/video_output/kms.c              |  2 +-
 modules/video_output/kva.c              |  8 +++----
 modules/video_output/macosx.m           |  4 ++--
 modules/video_output/opengl/display.c   |  4 ++--
 modules/video_output/splitter.c         | 10 ++++-----
 modules/video_output/vulkan/display.c   |  2 +-
 modules/video_output/wayland/shm.c      |  4 ++--
 modules/video_output/win32/common.c     |  5 +++--
 modules/video_output/win32/direct3d11.c |  2 +-
 modules/video_output/win32/direct3d9.c  |  2 +-
 modules/video_output/win32/glwin32.c    |  2 +-
 modules/video_output/win32/wingdi.c     |  2 +-
 modules/video_output/xcb/render.c       |  4 ++--
 modules/video_output/xcb/x11.c          |  4 ++--
 src/video_output/display.c              |  2 ++
 src/video_output/opengl.c               |  5 ++---
 src/video_output/video_output.c         | 29 +++++++++++++------------
 src/video_output/vout_internal.h        |  4 +++-
 src/video_output/vout_wrapper.c         |  4 ++--
 28 files changed, 81 insertions(+), 66 deletions(-)

diff --git a/include/vlc_opengl.h b/include/vlc_opengl.h
index 4e436c939b..85f35571a9 100644
--- a/include/vlc_opengl.h
+++ b/include/vlc_opengl.h
@@ -24,6 +24,8 @@
 #ifndef VLC_GL_H
 #define VLC_GL_H 1
 
+#include <vlc_vout_window.h>
+
 /**
  * \file
  * This file defines GL structures and functions.
@@ -95,6 +97,7 @@ enum {
  * @return a new context, or NULL on failure
  */
 VLC_API vlc_gl_t *vlc_gl_Create(const struct vout_display_cfg *cfg,
+                                vout_window_t *window,
                                 unsigned flags, const char *name) VLC_USED;
 VLC_API void vlc_gl_Release(vlc_gl_t *);
 VLC_API void vlc_gl_Hold(vlc_gl_t *);
diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
index cef9b47b40..7d748813a9 100644
--- a/include/vlc_vout_display.h
+++ b/include/vlc_vout_display.h
@@ -90,7 +90,6 @@ typedef struct vlc_video_align {
  *   multiplied by the zoom factor.
  */
 typedef struct vout_display_cfg {
-    struct vout_window_t *window; /**< Window */
 #if defined(__OS2__)
     bool is_fullscreen VLC_DEPRECATED;  /* Is the display fullscreen */
 #endif
@@ -258,6 +257,13 @@ typedef int (*vout_display_open_cb)(vout_display_t *vd,
 struct vout_display_t {
     struct vlc_object_t obj;
 
+    /**
+     * Window used by this display plugin.
+     *
+     * Always valid and can't be modified during the lifetime of the module.
+     */
+    vout_window_t *window;
+
     /**
      * User configuration.
      *
@@ -371,7 +377,7 @@ struct vout_display_t {
 VLC_API
 vout_display_t *vout_display_New(vlc_object_t *,
     const video_format_t *, vlc_video_context *,
-    const vout_display_cfg_t *, const char *module,
+    const vout_display_cfg_t *, vout_window_t *window, const char *module,
     const vout_display_owner_t *);
 
 /**
@@ -421,15 +427,15 @@ VLC_API void vout_display_SendEventPicturesInvalid(vout_display_t *vd);
 
 static inline void vout_display_SendEventMousePressed(vout_display_t *vd, int button)
 {
-    vout_window_ReportMousePressed(vd->cfg->window, button);
+    vout_window_ReportMousePressed(vd->window, button);
 }
 static inline void vout_display_SendEventMouseReleased(vout_display_t *vd, int button)
 {
-    vout_window_ReportMouseReleased(vd->cfg->window, button);
+    vout_window_ReportMouseReleased(vd->window, button);
 }
 static inline void vout_display_SendEventMouseDoubleClick(vout_display_t *vd)
 {
-    vout_window_ReportMouseDoubleClick(vd->cfg->window, MOUSE_BUTTON_LEFT);
+    vout_window_ReportMouseDoubleClick(vd->window, MOUSE_BUTTON_LEFT);
 }
 static inline void vout_display_SendEventViewpointMoved(vout_display_t *vd,
                                                         const vlc_viewpoint_t *vp)
@@ -448,7 +454,7 @@ static inline void vout_display_SendEventViewpointMoved(vout_display_t *vd,
  */
 static inline void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, int m_x, int m_y)
 {
-    vout_window_ReportMouseMoved(vd->cfg->window, m_x, m_y);
+    vout_window_ReportMouseMoved(vd->window, m_x, m_y);
 }
 
 /**
diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
index ee48a6a552..b36b1f8c68 100644
--- a/modules/hw/mmal/vout.c
+++ b/modules/hw/mmal/vout.c
@@ -754,7 +754,7 @@ static void vd_manage(vout_display_t *vd)
         if (query_resolution(vd, sys->display_id, &width, &height) >= 0) {
             sys->display_width = width;
             sys->display_height = height;
-//            vout_window_ReportSize(vd->cfg->window, width, height);
+//            vout_window_ReportSize(vd->window, width, height);
         }
 
         sys->need_configure_display = false;
@@ -1130,7 +1130,7 @@ static int OpenMmalVout(vout_display_t *vd, const vout_display_cfg_t *cfg,
     }
 
     if (sys->dec_dev == NULL)
-        sys->dec_dev = vlc_decoder_device_Create(VLC_OBJECT(vd), cfg->window);
+        sys->dec_dev = vlc_decoder_device_Create(VLC_OBJECT(vd), vd->window);
     if (sys->dec_dev == NULL || sys->dec_dev->type != VLC_DECODER_DEVICE_MMAL)
     {
         msg_Err(vd, "Missing decoder device");
diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c
index 5963be6371..4fcb76c15d 100644
--- a/modules/hw/vdpau/display.c
+++ b/modules/hw/vdpau/display.c
@@ -293,7 +293,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
         return VLC_ENOMEM;
 
     const xcb_screen_t *screen;
-    if (vlc_xcb_parent_Create(vd, cfg->window, &sys->conn, &screen) != VLC_SUCCESS)
+    if (vlc_xcb_parent_Create(vd, vd->window, &sys->conn, &screen) != VLC_SUCCESS)
     {
         free(sys);
         return VLC_EGENERIC;
@@ -432,7 +432,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
 
         xcb_void_cookie_t c =
             xcb_create_window_checked(sys->conn, screen->root_depth,
-                sys->window, cfg->window->handle.xid, place.x, place.y,
+                sys->window, vd->window->handle.xid, place.x, place.y,
                 place.width, place.height, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
                 screen->root_visual, mask, values);
         if (vlc_xcb_error_Check(vd, sys->conn, "window creation failure", c))
diff --git a/modules/video_output/android/display.c b/modules/video_output/android/display.c
index 3ad9aeb452..6948516ad1 100644
--- a/modules/video_output/android/display.c
+++ b/modules/video_output/android/display.c
@@ -483,7 +483,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     vout_display_sys_t *sys;
     video_format_t fmt, sub_fmt;
 
-    vout_window_t *embed = cfg->window;
+    vout_window_t *embed = vd->window;
     if (embed->type != VOUT_WINDOW_TYPE_ANDROID_NATIVE)
         return VLC_EGENERIC;
 
@@ -610,7 +610,7 @@ static void ClearSurface(vout_display_t *vd)
     {
         /* Clear the surface to black with OpenGL ES 2 */
         char *modlist = var_InheritString(sys->embed, "gles2");
-        vlc_gl_t *gl = vlc_gl_Create(vd->cfg, VLC_OPENGL_ES2, modlist);
+        vlc_gl_t *gl = vlc_gl_Create(vd->cfg, vd->window, VLC_OPENGL_ES2, modlist);
         free(modlist);
         if (gl == NULL)
             return;
diff --git a/modules/video_output/caca.c b/modules/video_output/caca.c
index b3f235ab91..5fe85ef722 100644
--- a/modules/video_output/caca.c
+++ b/modules/video_output/caca.c
@@ -383,7 +383,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
 
     (void) context;
 
-    if (vout_window_IsValid(cfg->window))
+    if (vout_window_IsValid(vd->window))
         return VLC_EGENERIC;
 #if !defined(__APPLE__) && !defined(_WIN32)
 # ifndef X_DISPLAY_MISSING
@@ -452,7 +452,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
         goto error;
     }
 
-    sys->window = cfg->window;
+    sys->window = vd->window;
     const char *driver = NULL;
 #ifdef __APPLE__
     // Make sure we don't try to open a window.
diff --git a/modules/video_output/caopengllayer.m b/modules/video_output/caopengllayer.m
index 10fccdf90d..2638b9c443 100644
--- a/modules/video_output/caopengllayer.m
+++ b/modules/video_output/caopengllayer.m
@@ -110,7 +110,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
 {
     vout_display_sys_t *sys;
 
-    if (cfg->window->type != VOUT_WINDOW_TYPE_NSOBJECT)
+    if (vd->window->type != VOUT_WINDOW_TYPE_NSOBJECT)
         return VLC_EGENERIC;
 
     /* Allocate structure */
@@ -121,7 +121,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
     @autoreleasepool {
         id container = var_CreateGetAddress(vd, "drawable-nsobject");
         if (!container) {
-            sys->embed = cfg->window;
+            sys->embed = vd->window;
             container = sys->embed->handle.nsobject;
 
             if (!container) {
diff --git a/modules/video_output/fb.c b/modules/video_output/fb.c
index 338099e02c..7e130eb697 100644
--- a/modules/video_output/fb.c
+++ b/modules/video_output/fb.c
@@ -167,9 +167,10 @@ static void ClearScreen(vout_display_sys_t *sys)
 static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
                 video_format_t *fmtp, vlc_video_context *context)
 {
+    (void) cfg;
     vout_display_sys_t *sys;
 
-    if (vout_window_IsValid(cfg->window))
+    if (vout_window_IsValid(vd->window))
         return VLC_EGENERIC;
 
     /* Allocate instance and initialize some members */
diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
index 34ffcd8bf8..72f3f2176e 100644
--- a/modules/video_output/ios.m
+++ b/modules/video_output/ios.m
@@ -142,7 +142,7 @@ static void *OurGetProcAddress(vlc_gl_t *gl, const char *name)
 static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
                 video_format_t *fmt, vlc_video_context *context)
 {
-    if (vout_window_IsValid(cfg->window))
+    if (vout_window_IsValid(vd->window))
         return VLC_EGENERIC;
 
     vout_display_sys_t *sys = vlc_obj_calloc(VLC_OBJECT(vd), 1, sizeof(*sys));
@@ -171,7 +171,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
 
         const vlc_fourcc_t *subpicture_chromas;
 
-        sys->embed = cfg->window;
+        sys->embed = vd->window;
         sys->gl = vlc_object_create(vd, sizeof(*sys->gl));
         if (!sys->gl)
             goto bailout;
diff --git a/modules/video_output/kms.c b/modules/video_output/kms.c
index 2c01aa36c5..96cf50a734 100644
--- a/modules/video_output/kms.c
+++ b/modules/video_output/kms.c
@@ -693,7 +693,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     video_format_t fmt = {};
     char *chroma;
 
-    if (vout_window_IsValid(cfg->window))
+    if (vout_window_IsValid(vd->window))
         return VLC_EGENERIC;
 
     /*
diff --git a/modules/video_output/kva.c b/modules/video_output/kva.c
index 185e826960..6dab6c615c 100644
--- a/modules/video_output/kva.c
+++ b/modules/video_output/kva.c
@@ -185,9 +185,9 @@ static void PMThread( void *arg )
 
     sys->b_fixt23 = var_CreateGetBool( vd, "kva-fixt23");
 
-    if( !sys->b_fixt23 && vd->cfg->window->type == VOUT_WINDOW_TYPE_HWND )
+    if( !sys->b_fixt23 && vd->window->type == VOUT_WINDOW_TYPE_HWND )
         /* If an external window was specified, we'll draw in it. */
-        sys->parent_window = vd->cfg->window;
+        sys->parent_window = vd->window;
 
     if( sys->parent_window )
     {
@@ -921,7 +921,7 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
     {
         /* the user wants to close the window */
         case WM_CLOSE:
-            vout_window_ReportClose(vd->cfg->window);
+            vout_window_ReportClose(vd->window);
             result = 0;
             break;
 
@@ -1020,7 +1020,7 @@ static MRESULT EXPENTRY WndProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
                     if( i_flags & KC_ALT )
                         i_key |= KEY_MODIFIER_ALT;
 
-                    vout_window_ReportKeyPress(vd->cfg->window, i_key);
+                    vout_window_ReportKeyPress(vd->window, i_key);
                 }
             }
             break;
diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m
index 5e0a10af6f..64db52fb6e 100644
--- a/modules/video_output/macosx.m
+++ b/modules/video_output/macosx.m
@@ -131,7 +131,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
 {
     vout_display_sys_t *sys = calloc (1, sizeof(*sys));
 
-    if (cfg->window->type != VOUT_WINDOW_TYPE_NSOBJECT)
+    if (vd->window->type != VOUT_WINDOW_TYPE_NSOBJECT)
         return VLC_EGENERIC;
 
     if (!sys)
@@ -152,7 +152,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
         /* Get the drawable object */
         id container = var_CreateGetAddress (vd, "drawable-nsobject");
         if (!container) {
-            sys->embed = cfg->window;
+            sys->embed = vd->window;
             container = sys->embed->handle.nsobject;
 
             if (!container) {
diff --git a/modules/video_output/opengl/display.c b/modules/video_output/opengl/display.c
index ebb313926a..c1612019c4 100644
--- a/modules/video_output/opengl/display.c
+++ b/modules/video_output/opengl/display.c
@@ -94,7 +94,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     sys->gl = NULL;
     sys->place_changed = false;
 
-    vout_window_t *surface = cfg->window;
+    vout_window_t *surface = vd->window;
     char *gl_name = var_InheritString(surface, MODULE_VARNAME);
 
     /* VDPAU GL interop works only with GLX. Override the "gl" option to force
@@ -123,7 +123,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     }
 #endif
 
-    sys->gl = vlc_gl_Create(cfg, API, gl_name);
+    sys->gl = vlc_gl_Create(cfg, surface, API, gl_name);
     free(gl_name);
     if (sys->gl == NULL)
         goto error;
diff --git a/modules/video_output/splitter.c b/modules/video_output/splitter.c
index 06f6c05d76..475ddac70b 100644
--- a/modules/video_output/splitter.c
+++ b/modules/video_output/splitter.c
@@ -173,7 +173,7 @@ static void vlc_vidsplit_window_MouseEvent(vout_window_t *wnd,
     vlc_mutex_lock(&sys->lock);
     if (video_splitter_Mouse(&sys->splitter, part - sys->parts,
                              &ev) == VLC_SUCCESS)
-        vout_window_SendMouseEvent(vd->cfg->window, &ev);
+        vout_window_SendMouseEvent(vd->window, &ev);
     vlc_mutex_unlock(&sys->lock);
 }
 
@@ -183,7 +183,7 @@ static void vlc_vidsplit_window_KeyboardEvent(vout_window_t *wnd, unsigned key)
     vout_display_sys_t *sys = vd->sys;
 
     vlc_mutex_lock(&sys->lock);
-    vout_window_ReportKeyPress(vd->cfg->window, key);
+    vout_window_ReportKeyPress(vd->window, key);
     vlc_mutex_unlock(&sys->lock);
 }
 
@@ -223,9 +223,10 @@ static int vlc_vidsplit_Open(vout_display_t *vd,
                              const vout_display_cfg_t *cfg,
                              video_format_t *fmtp, vlc_video_context *ctx)
 {
+    (void) cfg;
     vlc_object_t *obj = VLC_OBJECT(vd);
 
-    if (vout_window_IsValid(cfg->window))
+    if (vout_window_IsValid(vd->window))
         return VLC_EGENERIC;
 
     char *name = var_InheritString(obj, "video-splitter");
@@ -286,9 +287,8 @@ static int vlc_vidsplit_Open(vout_display_t *vd,
             return VLC_EGENERIC;
         }
 
-        vdcfg.window = part->window;
         vout_display_t *display = vout_display_New(obj, &output->fmt, ctx, &vdcfg,
-                                                   modname, NULL);
+                                                   part->window, modname, NULL);
         if (display == NULL) {
             vout_window_Disable(part->window);
             vout_window_Delete(part->window);
diff --git a/modules/video_output/vulkan/display.c b/modules/video_output/vulkan/display.c
index 174627d67d..51c7cb4238 100644
--- a/modules/video_output/vulkan/display.c
+++ b/modules/video_output/vulkan/display.c
@@ -86,7 +86,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     if (unlikely(sys == NULL))
         return VLC_ENOMEM;
 
-    vout_window_t *window = vd->cfg->window;
+    vout_window_t *window = vd->window;
     if (window == NULL)
     {
         msg_Err(vd, "parent window not available");
diff --git a/modules/video_output/wayland/shm.c b/modules/video_output/wayland/shm.c
index 77acabdd0c..81e0bd0cc2 100644
--- a/modules/video_output/wayland/shm.c
+++ b/modules/video_output/wayland/shm.c
@@ -267,7 +267,7 @@ static void Close(vout_display_t *vd)
 static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
                 video_format_t *fmtp, vlc_video_context *context)
 {
-    if (cfg->window->type != VOUT_WINDOW_TYPE_WAYLAND)
+    if (vd->window->type != VOUT_WINDOW_TYPE_WAYLAND)
         return VLC_EGENERIC;
 
     vout_display_sys_t *sys = malloc(sizeof (*sys));
@@ -283,7 +283,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     sys->display_height = cfg->display.height;
 
     /* Get window */
-    sys->embed = cfg->window;
+    sys->embed = vd->window;
     assert(sys->embed != NULL);
 
     struct wl_display *display = sys->embed->display.wl;
diff --git a/modules/video_output/win32/common.c b/modules/video_output/win32/common.c
index b31c77d0be..00bde81cea 100644
--- a/modules/video_output/win32/common.c
+++ b/modules/video_output/win32/common.c
@@ -48,6 +48,7 @@ void CommonInit(vout_display_t *vd, display_win32_area_t *area, const vout_displ
 {
     area->place_changed = false;
     area->vdcfg = *vdcfg;
+    aera->window = vd->window;
 
     area->texture_source = vd->source;
 
@@ -61,7 +62,7 @@ static void CommonChangeThumbnailClip(vlc_object_t *, vout_display_sys_win32_t *
 int CommonWindowInit(vlc_object_t *obj, display_win32_area_t *area,
                      vout_display_sys_win32_t *sys, bool projection_gestures)
 {
-    if (unlikely(area->vdcfg.window == NULL))
+    if (unlikely(area->window == NULL))
         return VLC_EGENERIC;
 
     /* */
@@ -72,7 +73,7 @@ int CommonWindowInit(vlc_object_t *obj, display_win32_area_t *area,
     sys->hparent   = NULL;
 
     /* */
-    sys->event = EventThreadCreate(obj, area->vdcfg.window);
+    sys->event = EventThreadCreate(obj, area->window);
     if (!sys->event)
         return VLC_EGENERIC;
 
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index dd815124e5..dc1d407aea 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -345,7 +345,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
         goto error;
     }
 
-    vout_window_SetTitle(sys->area.vdcfg.window, VOUT_TITLE " (Direct3D11 output)");
+    vout_window_SetTitle(vd->window, VOUT_TITLE " (Direct3D11 output)");
     msg_Dbg(vd, "Direct3D11 display adapter successfully initialized");
 
     vd->info.can_scale_spu        = true;
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index ef0d83ef01..497821badd 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -1668,7 +1668,7 @@ static int Direct3D9Open(vout_display_t *vd, video_format_t *fmt, vlc_video_cont
     }
 
     /* Change the window title bar text */
-    vout_window_SetTitle(sys->area.vdcfg.window, VOUT_TITLE " (Direct3D9 output)");
+    vout_window_SetTitle(vd->window, VOUT_TITLE " (Direct3D9 output)");
 
     msg_Dbg(vd, "Direct3D9 display adapter successfully initialized");
     return VLC_SUCCESS;
diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c
index da893768c4..97dc01f91f 100644
--- a/modules/video_output/win32/glwin32.c
+++ b/modules/video_output/win32/glwin32.c
@@ -128,7 +128,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     if (vd->source.projection_mode != PROJECTION_MODE_RECTANGULAR)
         sys->p_sensors = HookWindowsSensors(vd, sys->sys.hvideownd);
 
-    vout_window_SetTitle(sys->area.vdcfg.window, VOUT_TITLE " (OpenGL output)");
+    vout_window_SetTitle(vd->window, VOUT_TITLE " (OpenGL output)");
 
     vout_display_cfg_t embed_cfg = *cfg;
     embed_cfg.window = EmbedVideoWindow_Create(vd);
diff --git a/modules/video_output/win32/wingdi.c b/modules/video_output/win32/wingdi.c
index 6653401b78..6038d504e0 100644
--- a/modules/video_output/win32/wingdi.c
+++ b/modules/video_output/win32/wingdi.c
@@ -272,7 +272,7 @@ static int Init(vout_display_t *vd, video_format_t *fmt)
     SelectObject(sys->off_dc, sys->off_bitmap);
     ReleaseDC(sys->sys.hvideownd, window_dc);
 
-    vout_window_SetTitle(sys->area.vdcfg.window, VOUT_TITLE " (WinGDI output)");
+    vout_window_SetTitle(vd->window, VOUT_TITLE " (WinGDI output)");
 
     return VLC_SUCCESS;
 }
diff --git a/modules/video_output/xcb/render.c b/modules/video_output/xcb/render.c
index c3e71933f3..63c3a8b8b0 100644
--- a/modules/video_output/xcb/render.c
+++ b/modules/video_output/xcb/render.c
@@ -563,7 +563,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     xcb_connection_t *conn;
     const xcb_screen_t *screen;
 
-    if (vlc_xcb_parent_Create(vd, cfg->window, &conn, &screen) != VLC_SUCCESS)
+    if (vlc_xcb_parent_Create(vd, vd->window, &conn, &screen) != VLC_SUCCESS)
         return VLC_EGENERIC;
 
     sys->conn = conn;
@@ -673,7 +673,7 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
     xcb_create_pixmap(conn, 32, sys->drawable.source, screen->root,
                       vd->source.i_width, vd->source.i_height);
     xcb_create_gc(conn, sys->gc, sys->drawable.source, 0, NULL);
-    xcb_create_window(conn, 32, sys->drawable.dest, cfg->window->handle.xid,
+    xcb_create_window(conn, 32, sys->drawable.dest, vd->window->handle.xid,
                       0, 0, cfg->display.width, cfg->display.height, 0,
                       XCB_WINDOW_CLASS_INPUT_OUTPUT, visual, cw_mask, cw_list);
     xcb_render_create_picture(conn, sys->picture.source, sys->drawable.source,
diff --git a/modules/video_output/xcb/x11.c b/modules/video_output/xcb/x11.c
index 05e012f389..9e465500e7 100644
--- a/modules/video_output/xcb/x11.c
+++ b/modules/video_output/xcb/x11.c
@@ -265,7 +265,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
     /* Get window, connect to X server */
     xcb_connection_t *conn;
     const xcb_screen_t *scr;
-    if (vlc_xcb_parent_Create(vd, cfg->window, &conn, &scr) != VLC_SUCCESS)
+    if (vlc_xcb_parent_Create(vd, vd->window, &conn, &scr) != VLC_SUCCESS)
     {
         free (sys);
         return VLC_EGENERIC;
@@ -317,7 +317,7 @@ static int Open (vout_display_t *vd, const vout_display_cfg_t *cfg,
     sys->window = xcb_generate_id (conn);
     sys->gc = xcb_generate_id (conn);
 
-    xcb_create_window(conn, sys->depth, sys->window, cfg->window->handle.xid,
+    xcb_create_window(conn, sys->depth, sys->window, vd->window->handle.xid,
         place.x, place.y, place.width, place.height, 0,
         XCB_WINDOW_CLASS_INPUT_OUTPUT, vid, mask, values);
     xcb_map_window(conn, sys->window);
diff --git a/src/video_output/display.c b/src/video_output/display.c
index 76d49ee240..9ef2cd5a41 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -725,6 +725,7 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
                                  const video_format_t *source,
                                  vlc_video_context *vctx,
                                  const vout_display_cfg_t *cfg,
+                                 vout_window_t *window,
                                  const char *module,
                                  const vout_display_owner_t *owner)
 {
@@ -754,6 +755,7 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
 
     /* */
     vout_display_t *vd = &osys->display;
+    vd->window = window;
     video_format_Copy(&vd->source, source);
     vd->info = (vout_display_info_t){ };
     vd->cfg = &osys->cfg;
diff --git a/src/video_output/opengl.c b/src/video_output/opengl.c
index 99ba7b29e7..9cc8c8573c 100644
--- a/src/video_output/opengl.c
+++ b/src/video_output/opengl.c
@@ -53,9 +53,9 @@ static int vlc_gl_start(void *func, bool forced, va_list ap)
 }
 
 vlc_gl_t *vlc_gl_Create(const struct vout_display_cfg *restrict cfg,
+                        vout_window_t *restrict wnd,
                         unsigned flags, const char *name)
 {
-    vout_window_t *wnd = cfg->window;
     struct vlc_gl_priv_t *glpriv;
     const char *type;
 
@@ -165,7 +165,6 @@ vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *obj,
 
     /* TODO: support ES? */
     struct vout_display_cfg dcfg = {
-        .window = surface,
         .display = { .width = cfg->width, cfg->height },
     };
 
@@ -178,7 +177,7 @@ vlc_gl_t *vlc_gl_surface_Create(vlc_object_t *obj,
     }
     vlc_mutex_unlock(&sys->lock);
 
-    vlc_gl_t *gl = vlc_gl_Create(&dcfg, VLC_OPENGL, NULL);
+    vlc_gl_t *gl = vlc_gl_Create(&dcfg, surface, VLC_OPENGL, NULL);
     if (gl == NULL) {
         vout_window_Delete(surface);
         goto error;
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 373c09f1dc..0f4387d684 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -210,7 +210,7 @@ static void vout_UpdateWindowSizeLocked(vout_thread_t *vout)
         vlc_mutex_unlock(&sys->display_lock);
 
         msg_Dbg(vout, "requested window size: %ux%u", width, height);
-        vout_window_SetSize(sys->display_cfg.window, width, height);
+        vout_window_SetSize(sys->window, width, height);
     } else
         vlc_mutex_unlock(&sys->display_lock);
 }
@@ -393,7 +393,7 @@ 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);
+    vout_window_SetFullScreen(vout->p->window, id);
     vlc_mutex_unlock(&vout->p->window_lock);
 }
 
@@ -402,7 +402,7 @@ void vout_ChangeWindowed(vout_thread_t *vout)
     assert(!vout->p->dummy);
     vlc_mutex_lock(&vout->p->window_lock);
     vout_thread_sys_t *sys = vout->p;
-    vout_window_UnsetFullScreen(sys->display_cfg.window);
+    vout_window_UnsetFullScreen(sys->window);
     /* Attempt to reset the intended window size */
     vout_UpdateWindowSizeLocked(vout);
     vlc_mutex_unlock(&vout->p->window_lock);
@@ -412,7 +412,7 @@ 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);
+    vout_window_SetState(vout->p->window, st);
     vlc_mutex_unlock(&vout->p->window_lock);
 }
 
@@ -1374,7 +1374,7 @@ void vout_ChangePause(vout_thread_t *vout, bool is_paused, vlc_tick_t date)
     vout_control_Release(&vout->p->control);
 
     vlc_mutex_lock(&vout->p->window_lock);
-    vout_window_SetInhibition(vout->p->display_cfg.window, !is_paused);
+    vout_window_SetInhibition(vout->p->window, !is_paused);
     vlc_mutex_unlock(&vout->p->window_lock);
 }
 
@@ -1605,7 +1605,8 @@ static int vout_Start(vout_thread_t *vout, vlc_video_context *vctx, const vout_c
     vlc_mutex_lock(&sys->display_lock);
     vlc_mutex_unlock(&sys->window_lock);
 
-    sys->display = vout_OpenWrapper(vout, sys->splitter_name, &dcfg, vctx);
+    sys->display = vout_OpenWrapper(vout, sys->splitter_name, &dcfg,
+                                    sys->window, vctx);
     if (sys->display == NULL) {
         vlc_mutex_unlock(&sys->display_lock);
         goto error;
@@ -1786,7 +1787,7 @@ static void vout_DisableWindow(vout_thread_t *vout)
     vout_thread_sys_t *sys = vout->p;
     vlc_mutex_lock(&sys->window_lock);
     if (sys->window_enabled) {
-        vout_window_Disable(sys->display_cfg.window);
+        vout_window_Disable(sys->window);
         sys->window_enabled = false;
     }
     vlc_mutex_unlock(&sys->window_lock);
@@ -1843,7 +1844,7 @@ void vout_Release(vout_thread_t *vout)
         vlc_decoder_device_Release(sys->dec_device);
 
     assert(!sys->window_enabled);
-    vout_display_window_Delete(sys->display_cfg.window);
+    vout_display_window_Delete(sys->window);
 
     vout_control_Clean(&sys->control);
 
@@ -1938,8 +1939,8 @@ vout_thread_t *vout_Create(vlc_object_t *object)
     vlc_mutex_init(&sys->display_lock);
 
     /* Window */
-    sys->display_cfg.window = vout_display_window_New(vout);
-    if (sys->display_cfg.window == NULL) {
+    sys->window = vout_display_window_New(vout);
+    if (sys->window == NULL) {
         if (sys->spu)
             spu_Destroy(sys->spu);
         vlc_object_delete(vout);
@@ -1955,9 +1956,9 @@ vout_thread_t *vout_Create(vlc_object_t *object)
     vout_chrono_Init(&sys->render, 5, VLC_TICK_FROM_MS(10));
 
     if (var_InheritBool(vout, "video-wallpaper"))
-        vout_window_SetState(sys->display_cfg.window, VOUT_WINDOW_STATE_BELOW);
+        vout_window_SetState(sys->window, VOUT_WINDOW_STATE_BELOW);
     else if (var_InheritBool(vout, "video-on-top"))
-        vout_window_SetState(sys->display_cfg.window, VOUT_WINDOW_STATE_ABOVE);
+        vout_window_SetState(sys->window, VOUT_WINDOW_STATE_ABOVE);
 
     return vout;
 }
@@ -2007,7 +2008,7 @@ static int EnableWindowLocked(vout_thread_t *vout, const video_format_t *origina
         VoutGetDisplayCfg(vout, original, &sys->display_cfg);
         vout_SizeWindow(vout, original, &wcfg.width, &wcfg.height);
 
-        if (vout_window_Enable(sys->display_cfg.window, &wcfg)) {
+        if (vout_window_Enable(sys->window, &wcfg)) {
             msg_Err(vout, "failed to enable window");
             return -1;
         }
@@ -2088,7 +2089,7 @@ vlc_decoder_device *vout_GetDevice(vout_thread_t *vout)
 
     vlc_mutex_lock(&sys->window_lock);
     if (sys->dec_device == NULL)
-        sys->dec_device = vlc_decoder_device_Create(&vout->obj, sys->display_cfg.window);
+        sys->dec_device = vlc_decoder_device_Create(&vout->obj, sys->window);
     dec_device = sys->dec_device ? vlc_decoder_device_Hold( sys->dec_device ) : NULL;
     vlc_mutex_unlock(&sys->window_lock);
     return dec_device;
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index fdc92bfa45..4d8a63784e 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -169,6 +169,7 @@ struct vout_thread_sys_t
     void            *mouse_opaque;
 
     /* Video output window */
+    vout_window_t  *window;
     bool            window_enabled;
     vlc_mutex_t     window_lock;
     vlc_decoder_device *dec_device;
@@ -272,7 +273,8 @@ void vout_IntfDeinit(vlc_object_t *);
 
 /* */
 vout_display_t *vout_OpenWrapper(vout_thread_t *, const char *,
-                     const vout_display_cfg_t *, vlc_video_context *);
+                     const vout_display_cfg_t *, vout_window_t *,
+                     vlc_video_context *);
 void vout_CloseWrapper(vout_thread_t *, vout_display_t *vd);
 
 /* */
diff --git a/src/video_output/vout_wrapper.c b/src/video_output/vout_wrapper.c
index 9e5b14a56b..13eabd672f 100644
--- a/src/video_output/vout_wrapper.c
+++ b/src/video_output/vout_wrapper.c
@@ -56,7 +56,7 @@ static void VoutViewpointMoved(void *sys, const vlc_viewpoint_t *vp)
  *****************************************************************************/
 vout_display_t *vout_OpenWrapper(vout_thread_t *vout,
                      const char *splitter_name, const vout_display_cfg_t *cfg,
-                     vlc_video_context *vctx)
+                     vout_window_t *window, vlc_video_context *vctx)
 {
     vout_thread_sys_t *sys = vout->p;
     vout_display_t *vd;
@@ -73,7 +73,7 @@ vout_display_t *vout_OpenWrapper(vout_thread_t *vout,
     else
         modlist = "splitter,none";
 
-    vd = vout_display_New(VLC_OBJECT(vout), &sys->original, vctx, cfg,
+    vd = vout_display_New(VLC_OBJECT(vout), &sys->original, vctx, cfg, window,
                           modlist, &owner);
     free(modlistbuf);
 
-- 
2.20.1



More information about the vlc-devel mailing list