[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