[vlc-devel] [PATCH 1/2] vout: add window properties in vout_display_cfg_t
Rémi Denis-Courmont
remi at remlab.net
Fri Mar 27 10:18:40 CET 2020
Le perjantaina 27. maaliskuuta 2020, 10.57.35 EET Thomas Guillem a écrit :
> It should be used before the initialisation of the vd plugin. During the
> lifetime of the vd plugin, only cfg->display size should be used.
>
> Refs #22674
> ---
> include/vlc_vout_display.h | 9 +++++++++
> src/video_output/display.c | 29 +++++++++++++++++++++++++----
> 2 files changed, 34 insertions(+), 4 deletions(-)
>
> diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
> index cd183fb56c..f9fbc4e0e1 100644
> --- a/include/vlc_vout_display.h
> +++ b/include/vlc_vout_display.h
> @@ -86,6 +86,7 @@ typedef struct vlc_video_align {
> * window, as follows:
> * - If \ref is_display_filled is set,
> * the video size is fitted to the display size.
> + * - If \ref window size is valid, the video size is set to the window
> size, * - Otherwise, the video size is determined from the original video
> format, * multiplied by the zoom factor.
> */
> @@ -102,6 +103,14 @@ typedef struct vout_display_cfg {
> vlc_rational_t sar; /**< Requested sample aspect ratio */
> } display;
>
> + /** Window properties (should be ignored from display modules) */
> + struct {
> + /** Current window width, if valid (>0), height need to be valid.
> */
Nit: Doxygen wants empty line to separate the short and long description.
I am not sure if windowing systems universally treat 0 as an invalid dimension
though.
> + unsigned width;
> + /** Current window height, if valid (>0), width need to be valid.
> */ + unsigned height;
> + } window_props;
I would have first moved window as window.handle or something, and then added
window.width and window.height, but whatever.
> +
> /** Alignment of the video within the window */
> vlc_video_align_t align;
>
> diff --git a/src/video_output/display.c b/src/video_output/display.c
> index 76d49ee240..de8f39a836 100644
> --- a/src/video_output/display.c
> +++ b/src/video_output/display.c
> @@ -102,6 +102,9 @@ void vout_display_GetDefaultDisplaySize(unsigned *width,
> unsigned *height, const video_format_t *source, const vout_display_cfg_t
> *cfg) {
> + assert((cfg->window_props.width == 0) == (cfg->window_props.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 +116,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 (cfg->window_props.width != 0) {
> + *width = cfg->window_props.width;
> + *height = cfg->window_props.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 {
> @@ -137,6 +147,10 @@ void vout_display_PlacePicture(vout_display_place_t
> *place, const video_format_t *source,
> const vout_display_cfg_t *cfg)
> {
> + /* vout_display_PlacePicture() is called from vd plugins. They should
> not + * care about the initial window properties. */
> + assert(cfg->window_props.width == 0 && cfg->window_props.height == 0);
> +
> /* */
> memset(place, 0, sizeof(*place));
> if (cfg->display.width == 0 || cfg->display.height == 0)
> @@ -733,10 +747,17 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
> if (unlikely(osys == NULL))
> return NULL;
>
> + unsigned display_width, display_height;
> + vout_display_GetDefaultDisplaySize(&display_width, &display_height,
> + source, cfg);
> +
> osys->cfg = *cfg;
> - vout_display_GetDefaultDisplaySize(&osys->cfg.display.width,
> - &osys->cfg.display.height,
> - source, &osys->cfg);
> + /* The window size was used for the initial setup. Now it can be
> dropped in + * favor of the calculated display size. */
> + osys->cfg.display.width = display_width;
> + osys->cfg.display.height = display_height;
> + osys->cfg.window_props.width = osys->cfg.window_props.height = 0;
> +
> #ifdef _WIN32
> osys->reset_pictures = false;
> #endif
--
雷米‧德尼-库尔蒙
http://www.remlab.net/
More information about the vlc-devel
mailing list