[vlc-devel] [PATCH] mmal/vout: Implement a dummy window
Thomas Guillem
thomas at gllm.fr
Fri Oct 20 18:39:12 CEST 2017
Looks good to me.
On Fri, Oct 20, 2017, at 18:35, Julian Scheel wrote:
> Adds a fake window implementation to force the rendering into fullscreen
> at any time.
>
> Signed-off-by: Julian Scheel <julian at jusst.de>
> ---
> include/vlc_vout_window.h | 1 +
> modules/hw/mmal/vout.c | 68
> +++++++++++++++++++++++++++++++++++++++++------
> 2 files changed, 61 insertions(+), 8 deletions(-)
>
> diff --git a/include/vlc_vout_window.h b/include/vlc_vout_window.h
> index 3a613d4e47..ae47781eee 100644
> --- a/include/vlc_vout_window.h
> +++ b/include/vlc_vout_window.h
> @@ -53,6 +53,7 @@ enum vout_window_type {
> VOUT_WINDOW_TYPE_NSOBJECT /**< MacOS X view */,
> VOUT_WINDOW_TYPE_ANDROID_NATIVE /**< Android native window */,
> VOUT_WINDOW_TYPE_WAYLAND /**< Wayland surface */,
> + VOUT_WINDOW_TYPE_MMAL /**< MMAL dummy window */,
> };
>
> /**
> diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
> index dc5807edd6..80862542b1 100644
> --- a/modules/hw/mmal/vout.c
> +++ b/modules/hw/mmal/vout.c
> @@ -33,6 +33,7 @@
> #include <vlc_plugin.h>
> #include <vlc_threads.h>
> #include <vlc_vout_display.h>
> +#include <vlc_vout_window.h>
>
> #include "mmal_picture.h"
>
> @@ -71,6 +72,9 @@
> static int Open(vlc_object_t *);
> static void Close(vlc_object_t *);
>
> +static int window_Open(vout_window_t *wnd, vout_window_cfg_t *cfg);
> +static void window_Close(vout_window_t *wnd);
> +
> vlc_module_begin()
> set_shortname(N_("MMAL vout"))
> set_description(N_("MMAL-based vout plugin for Raspberry Pi"))
> @@ -84,6 +88,11 @@ vlc_module_begin()
> add_bool(MMAL_NATIVE_INTERLACED, false, MMAL_NATIVE_INTERLACE_TEXT,
> MMAL_NATIVE_INTERLACE_LONGTEXT, false)
> set_callbacks(Open, Close)
> +
> + add_submodule()
> + set_capability("vout window", 1)
> + set_callbacks(window_Open, window_Close)
You can put NULL for window_Close since it does nothing.
> +
> vlc_module_end()
>
> struct dmx_region_t {
> @@ -104,6 +113,8 @@ struct vout_display_sys_t {
> vlc_mutex_t buffer_mutex;
> vlc_mutex_t manage_mutex;
>
> + vout_window_t *embed;
> +
> plane_t planes[3]; /* Depending on video format up to 3 planes are
> used */
> picture_t **pictures; /* Actual list of alloced pictures passed into
> picture_pool */
> picture_pool_t *picture_pool;
> @@ -163,7 +174,7 @@ static void control_port_cb(MMAL_PORT_T *port,
> MMAL_BUFFER_HEADER_T *buffer);
> static void input_port_cb(MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T
> *buffer);
>
> /* TV service */
> -static int query_resolution(vout_display_t *vd, unsigned *width,
> unsigned *height);
> +static int query_resolution(vlc_object_t *obj, unsigned *width, unsigned
> *height);
> static void tvservice_cb(void *callback_data, uint32_t reason, uint32_t
> param1,
> uint32_t param2);
> static void adjust_refresh_rate(vout_display_t *vd, const video_format_t
> *fmt);
> @@ -181,6 +192,40 @@ static void dmx_region_delete(struct dmx_region_t
> *dmx_region,
> static void show_background(vout_display_t *vd, bool enable);
> static void maintain_phase_sync(vout_display_t *vd);
>
> +/* Fake window implementation */
> +static int window_Control(vout_window_t *wnd, int cmd, va_list ap)
> +{
> + (void) wnd;
> + (void) ap;
> + return VLC_EGENERIC;
> +}
> +
> +static int window_Open(vout_window_t *wnd, vout_window_cfg_t *cfg)
> +{
> + unsigned width, height;
> +
> + if (cfg->type != VOUT_WINDOW_TYPE_INVALID &&
> + cfg->type != VOUT_WINDOW_TYPE_MMAL)
> + return VLC_EGENERIC;
> +
> + wnd->type = VOUT_WINDOW_TYPE_MMAL;
> + wnd->control = window_Control;
> +
> + if (query_resolution((vlc_object_t*)wnd, &width, &height) >= 0) {
> + msg_Dbg(wnd, "Window report size: %dx%d", width, height);
> + vout_window_ReportSize(wnd, width, height);
> + } else
> + return VLC_EGENERIC;
> +
> + return VLC_SUCCESS;
> +}
> +
> +static void window_Close(vout_window_t *wnd)
> +{
> + (void) wnd;
> +}
> +
> +/* Vout */
> static int Open(vlc_object_t *object)
> {
> vout_display_t *vd = (vout_display_t *)object;
> @@ -192,9 +237,6 @@ static int Open(vlc_object_t *object)
> int ret = VLC_SUCCESS;
> unsigned i;
>
> - if (vout_display_IsWindowed(vd))
> - return VLC_EGENERIC;
> -
> sys = calloc(1, sizeof(struct vout_display_sys_t));
> if (!sys)
> return VLC_ENOMEM;
> @@ -305,7 +347,7 @@ static int Open(vlc_object_t *object)
>
> vc_tv_register_callback(tvservice_cb, vd);
>
> - if (query_resolution(vd, &sys->display_width, &sys->display_height)
> >= 0) {
> + if (query_resolution((vlc_object_t*)vd, &sys->display_width,
> &sys->display_height) >= 0) {
> vout_display_SendEventDisplaySize(vd, sys->display_width,
> sys->display_height);
> } else {
> sys->display_width = vd->cfg->display.width;
> @@ -315,6 +357,13 @@ static int Open(vlc_object_t *object)
> sys->dmx_handle = vc_dispmanx_display_open(0);
> vd->info.subpicture_chromas = subpicture_chromas;
>
> + sys->embed = vout_display_NewWindow(vd, VOUT_WINDOW_TYPE_MMAL);
> + if (!sys->embed) {
> + msg_Err(vd, "Failed to create mmal window");
> + ret = VLC_EGENERIC;
> + goto out;
> + }
> +
> out:
> if (ret != VLC_SUCCESS)
> Close(object);
> @@ -368,6 +417,9 @@ static void Close(vlc_object_t *object)
> msg_Warn(vd, "Could not reset hvs field mode");
> }
>
> + if (sys->embed)
> + vout_display_DeleteWindow(vd, sys->embed);
> +
> free(sys->pictures);
> free(sys);
>
> @@ -702,7 +754,7 @@ static void input_port_cb(MMAL_PORT_T *port,
> MMAL_BUFFER_HEADER_T *buffer)
> vlc_mutex_unlock(&sys->buffer_mutex);
> }
>
> -static int query_resolution(vout_display_t *vd, unsigned *width,
> unsigned *height)
> +static int query_resolution(vlc_object_t *obj, unsigned *width, unsigned
> *height)
> {
> TV_DISPLAY_STATE_T display_state;
> int ret = 0;
> @@ -715,11 +767,11 @@ static int query_resolution(vout_display_t *vd,
> unsigned *width, unsigned *heigh
> *width = display_state.display.sdtv.width;
> *height = display_state.display.sdtv.height;
> } else {
> - msg_Warn(vd, "Invalid display state %"PRIx32,
> display_state.state);
> + msg_Warn(obj, "Invalid display state %"PRIx32,
> display_state.state);
> ret = -1;
> }
> } else {
> - msg_Warn(vd, "Failed to query display resolution");
> + msg_Warn(obj, "Failed to query display resolution");
> ret = -1;
> }
>
> --
> 2.14.2
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list