[vlc-devel] [PATCH] vout: create/release the decoder device when the window is enabled/disabled
Thomas Guillem
thomas at gllm.fr
Wed Sep 18 17:16:16 CEST 2019
On Wed, Sep 18, 2019, at 16:13, Steve Lhomme wrote:
> The decoder device ("dec-dev") should be tied to the lifecyle of the window.
> It won't change during the lifetime of the window enabled state.
>
> This decoder device is stored in the vout private structure.
>
> Before this patch the decoder device was created each time a display module was
> created.
I agree with this rational.
> ---
> include/vlc_vout_display.h | 2 +-
> modules/video_output/splitter.c | 5 +++--
> src/video_output/display.c | 17 +++++------------
> src/video_output/video_output.c | 10 ++++++++++
> src/video_output/vout_internal.h | 2 ++
> src/video_output/vout_wrapper.c | 4 ++--
> 6 files changed, 23 insertions(+), 17 deletions(-)
>
> diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
> index 80f813ba873..c7834b463b7 100644
> --- a/include/vlc_vout_display.h
> +++ b/include/vlc_vout_display.h
> @@ -308,7 +308,7 @@ struct vout_display_t {
> */
> VLC_API
> vout_display_t *vout_display_New(vlc_object_t *, const video_format_t *,
> - const vout_display_cfg_t *, const char *module,
> + const vout_display_cfg_t *, vlc_decoder_device *, const char *module,
> const vout_display_owner_t *);
>
> /**
> diff --git a/modules/video_output/splitter.c
> b/modules/video_output/splitter.c
> index 401de4853d6..c2e56e545e1 100644
> --- a/modules/video_output/splitter.c
> +++ b/modules/video_output/splitter.c
> @@ -223,9 +223,10 @@ static vout_window_t
> *video_splitter_CreateWindow(vlc_object_t *obj,
> static vout_display_t *vlc_vidsplit_CreateDisplay(vlc_object_t *obj,
> const video_format_t *restrict source,
> const vout_display_cfg_t *restrict cfg,
> + vlc_decoder_device *dec_device,
> const char *name)
> {
> - return vout_display_New(obj, source, cfg, name, NULL);
> + return vout_display_New(obj, source, cfg, dec_device, name, NULL);
> }
>
> static int vlc_vidsplit_Open(vout_display_t *vd,
> @@ -299,7 +300,7 @@ static int vlc_vidsplit_Open(vout_display_t *vd,
>
> vdcfg.window = part->window;
> display = vlc_vidsplit_CreateDisplay(obj, &output->fmt, &vdcfg,
> - modname);
> + ctx->device, modname);
> 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 e95e9539f17..97603317d17 100644
> --- a/src/video_output/display.c
> +++ b/src/video_output/display.c
> @@ -286,9 +286,6 @@ typedef struct {
> atomic_bool reset_pictures;
> #endif
> picture_pool_t *pool;
> -
> - /* temporary: must come from decoder module */
> - vlc_video_context video_context;
> } vout_display_priv_t;
>
> static const struct filter_video_callbacks vout_display_filter_cbs = {
> @@ -733,6 +730,7 @@ void vout_SetDisplayViewpoint(vout_display_t *vd,
> vout_display_t *vout_display_New(vlc_object_t *parent,
> const video_format_t *source,
> const vout_display_cfg_t *cfg,
> + vlc_decoder_device *dec_device,
> const char *module,
> const vout_display_owner_t *owner)
> {
> @@ -772,13 +770,13 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
> if (owner)
> vd->owner = *owner;
>
> - osys->video_context.device = vlc_decoder_device_Create(osys->cfg.window);
> - vlc_video_context *video_context = osys->video_context.device ?
> - &osys->video_context : NULL;
> + vlc_video_context fake_vctx = {
> + .device = dec_device,
> + };
>
> if (vlc_module_load(vd, "vout display", module, module && *module != '\0',
> vout_display_start, vd, &osys->cfg, &vd->fmt,
> - video_context) == NULL)
> + &fake_vctx) == NULL)
> goto error;
>
> #if defined(__OS2__)
> @@ -803,8 +801,6 @@ vout_display_t *vout_display_New(vlc_object_t *parent,
> return vd;
> error:
> video_format_Clean(&vd->source);
> - if (osys->video_context.device)
> - vlc_decoder_device_Release(osys->video_context.device);
> vlc_object_delete(vd);
> return NULL;
> }
> @@ -823,9 +819,6 @@ void vout_display_Delete(vout_display_t *vd)
> vd->close(vd);
> vlc_objres_clear(VLC_OBJECT(vd));
>
> - if (osys->video_context.device)
> - vlc_decoder_device_Release(osys->video_context.device);
> -
> video_format_Clean(&vd->source);
> video_format_Clean(&vd->fmt);
> vlc_object_delete(vd);
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index 6dfddaad33a..a1dbcd89196 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -49,6 +49,7 @@
> #include <vlc_vout_osd.h>
> #include <vlc_image.h>
> #include <vlc_plugin.h>
> +#include <vlc_codec.h>
>
> #include <libvlc.h>
> #include "vout_internal.h"
> @@ -1673,6 +1674,8 @@ void vout_Stop(vout_thread_t *vout)
> vout_StopDisplay(vout);
>
> vlc_mutex_lock(&sys->window_lock);
> + vlc_decoder_device_Release(sys->dec_device);
No null check here ?
> + sys->dec_device = NULL;
> if (sys->window_enabled) {
> vout_window_Disable(sys->display_cfg.window);
> sys->window_enabled = false;
> @@ -1906,6 +1909,8 @@ int vout_Request(const vout_configuration_t *cfg,
> input_thread_t *input)
> goto error;
> }
> sys->window_enabled = true;
> +
> + sys->dec_device =
> vlc_decoder_device_Create(sys->display_cfg.window);
Is it allowed to load a vd plugin with a NULL dec device ?
> } else
> vout_UpdateWindowSizeLocked(vout);
>
> @@ -1921,6 +1926,11 @@ int vout_Request(const vout_configuration_t
> *cfg, input_thread_t *input)
> vlc_mutex_lock(&sys->window_lock);
> vout_window_Disable(sys->display_cfg.window);
> sys->window_enabled = false;
> + if (sys->dec_device)
> + {
> + vlc_decoder_device_Release(sys->dec_device);
> + sys->dec_device = NULL;
> + }
> vlc_mutex_unlock(&sys->window_lock);
> goto error;
> }
> diff --git a/src/video_output/vout_internal.h
> b/src/video_output/vout_internal.h
> index a48637a714c..c827b80e583 100644
> --- a/src/video_output/vout_internal.h
> +++ b/src/video_output/vout_internal.h
> @@ -179,6 +179,8 @@ struct vout_thread_sys_t
> vout_display_t *display;
> vlc_mutex_t display_lock;
>
> + vlc_decoder_device *dec_device;
> +
> picture_pool_t *private_pool;
> picture_pool_t *display_pool;
> picture_pool_t *decoder_pool;
> diff --git a/src/video_output/vout_wrapper.c b/src/video_output/vout_wrapper.c
> index 9ac6e2eab08..80907bcac7d 100644
> --- a/src/video_output/vout_wrapper.c
> +++ b/src/video_output/vout_wrapper.c
> @@ -72,8 +72,8 @@ vout_display_t *vout_OpenWrapper(vout_thread_t *vout,
> else
> modlist = "splitter,none";
>
> - vd = vout_display_New(VLC_OBJECT(vout), &sys->original, cfg, modlist,
> - &owner);
> + vd = vout_display_New(VLC_OBJECT(vout), &sys->original, cfg,
> + sys->dec_device, modlist, &owner);
> free(modlistbuf);
>
> if (vd == NULL)
> --
> 2.17.1
>
> _______________________________________________
> 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