[vlc-devel] [PATCH 1/2] vout: use the window size to configure the vout display size

Thomas Guillem thomas at gllm.fr
Wed Mar 25 15:32:10 CET 2020


Refs #22674
---
 include/vlc_vout_display.h      | 10 +++++++---
 modules/video_output/splitter.c |  4 ++--
 src/video_output/display.c      | 23 +++++++++++++++++++----
 src/video_output/vout_wrapper.c |  1 +
 4 files changed, 29 insertions(+), 9 deletions(-)

diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
index cd183fb56c..8209f61cac 100644
--- a/include/vlc_vout_display.h
+++ b/include/vlc_vout_display.h
@@ -371,8 +371,8 @@ 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_owner_t *);
+    const vout_display_cfg_t *, unsigned window_width, unsigned window_height,
+    const char *module, const vout_display_owner_t *);
 
 /**
  * Destroys a video output display.
@@ -462,7 +462,11 @@ static inline bool vout_display_cfg_IsWindowed(const vout_display_cfg_t *cfg)
  *
  * This asssumes that the picture is already cropped.
  */
-VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height, const video_format_t *source, const vout_display_cfg_t *);
+VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height,
+                                                const video_format_t *source,
+                                                const vout_display_cfg_t *,
+                                                unsigned window_width,
+                                                unsigned window_height);
 
 
 /**
diff --git a/modules/video_output/splitter.c b/modules/video_output/splitter.c
index 71ceda4674..a8a548314c 100644
--- a/modules/video_output/splitter.c
+++ b/modules/video_output/splitter.c
@@ -207,7 +207,7 @@ static vout_window_t *video_splitter_CreateWindow(vlc_object_t *obj,
     };
 
     vout_display_GetDefaultDisplaySize(&cfg.width, &cfg.height, source,
-                                       vdcfg);
+                                       vdcfg, 0, 0);
 
     vout_window_t *window = vout_window_New(obj, NULL, &owner);
     if (window != NULL) {
@@ -288,7 +288,7 @@ static int vlc_vidsplit_Open(vout_display_t *vd,
 
         vdcfg.window = part->window;
         vout_display_t *display = vout_display_New(obj, &output->fmt, ctx, &vdcfg,
-                                                   modname, NULL);
+                                                   modname, NULL, 0, 0);
         if (display == NULL) {
             vout_window_Disable(part->window);
             vout_window_Delete(part->window);
diff --git a/src/video_output/display.c b/src/video_output/display.c
index 76d49ee240..6c0aa69cb8 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -100,8 +100,14 @@ static int vout_display_start(void *func, bool forced, va_list ap)
 /* */
 void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height,
                                         const video_format_t *source,
-                                        const vout_display_cfg_t *cfg)
+                                        const vout_display_cfg_t *cfg,
+                                        unsigned window_width,
+                                        unsigned window_height)
 {
+    /* The window size is either fully valid or not at all */
+    assert((window_width == 0) == (window_height == 0));
+
+    /* Requested by the user */
     if (cfg->display.width != 0 && cfg->display.height != 0) {
         *width  = cfg->display.width;
         *height = cfg->display.height;
@@ -113,7 +119,14 @@ void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height,
         *width  = (int64_t)source->i_visible_width * source->i_sar_num * cfg->display.height * cfg->display.sar.den /
             source->i_visible_height / source->i_sar_den / cfg->display.sar.num;
         *height = cfg->display.height;
-    } else if (source->i_sar_num >= source->i_sar_den) {
+    }
+    /* Size reported by the window module */
+    else if (window_width != 0 && window_height != 0) {
+        *width = window_width;
+        *height = window_height;
+    }
+    /* Use the original video size */
+    else if (source->i_sar_num >= source->i_sar_den) {
         *width  = (int64_t)source->i_visible_width * source->i_sar_num * cfg->display.sar.den / source->i_sar_den / cfg->display.sar.num;
         *height = source->i_visible_height;
     } else {
@@ -159,7 +172,7 @@ void vout_display_PlacePicture(vout_display_place_t *place,
         cfg_tmp.display.width  = 0;
         cfg_tmp.display.height = 0;
         vout_display_GetDefaultDisplaySize(&display_width, &display_height,
-                                           source, &cfg_tmp);
+                                           source, &cfg_tmp, 0, 0);
     }
 
     const unsigned width  = source->i_visible_width;
@@ -725,6 +738,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,
+                                 unsigned window_width, unsigned window_height,
                                  const char *module,
                                  const vout_display_owner_t *owner)
 {
@@ -736,7 +750,8 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
     osys->cfg = *cfg;
     vout_display_GetDefaultDisplaySize(&osys->cfg.display.width,
                                        &osys->cfg.display.height,
-                                       source, &osys->cfg);
+                                       source, &osys->cfg,
+                                       window_width, window_height);
 #ifdef _WIN32
     osys->reset_pictures = false;
 #endif
diff --git a/src/video_output/vout_wrapper.c b/src/video_output/vout_wrapper.c
index 9e5b14a56b..f92da8cfab 100644
--- a/src/video_output/vout_wrapper.c
+++ b/src/video_output/vout_wrapper.c
@@ -74,6 +74,7 @@ vout_display_t *vout_OpenWrapper(vout_thread_t *vout,
         modlist = "splitter,none";
 
     vd = vout_display_New(VLC_OBJECT(vout), &sys->original, vctx, cfg,
+                          0, 0,
                           modlist, &owner);
     free(modlistbuf);
 
-- 
2.20.1



More information about the vlc-devel mailing list