[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