[vlc-devel] [PATCH 13/17] video_output: group the code to setup and load the display module in a function

Thomas Guillem thomas at gllm.fr
Fri Nov 20 21:09:34 CET 2020



On Fri, Nov 20, 2020, at 15:45, Steve Lhomme wrote:
> vout_Start is also handling filter setup.
> 
> The function must be called under display lock. The crop and aspect ratio
> values need to be read under window lock.
> ---
>  src/video_output/video_output.c | 67 +++++++++++++++++++++------------
>  1 file changed, 42 insertions(+), 25 deletions(-)
> 
> diff --git a/src/video_output/video_output.c 
> b/src/video_output/video_output.c
> index 5ff0a7d1bef..74602e09c76 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -1725,6 +1725,39 @@ static void 
> ThreadProcessMouseState(vout_thread_sys_t *p_vout,
>          sys->mouse_event(m, sys->mouse_opaque);
>  }
>  
> +static int vout_StartDisplayAloneLocked(vout_thread_sys_t *vout,
> +                                        const video_format_t *fmt, 

I prefer vout_StartDisplayLocked

It's self-explanatory that it is starting only the display.

> vlc_video_context *vctx,
> +                                        const vout_display_cfg_t *cfg,
> +                                        const vlc_rational_t *dar, 
> const vlc_rational_t *crop,
> +                                        int x, int y, int w, int h)
> +{
> +    vout_thread_sys_t *sys = vout;
> +    sys->private.display_pool = NULL;
> +    sys->private.private_pool = NULL;
> +
> +    vout_display_cfg_t dcfg = *cfg;
> +
> +    /* Setup the window size, protected by the display_lock */
> +    dcfg.window_props.width = sys->window_width;
> +    dcfg.window_props.height = sys->window_height;
> +
> +    // original is used both as decoder output and display input
> +    video_format_Clean(&sys->original);
> +    video_format_Copy(&sys->original, fmt);
> +
> +    sys->display = vout_OpenWrapper(&vout->obj, &sys->private, 
> sys->splitter_name, &dcfg,
> +                                    fmt, vctx);
> +    if (sys->display == NULL)
> +        return VLC_EGENERIC;
> +
> +    vout_SetDisplayCrop(sys->display, crop->num, crop->den, x, y, w, 
> h);
> +
> +    if (dar->num != 0 && dar->den != 0)
> +        vout_SetDisplayAspect(sys->display, dar->num, dar->den);
> +
> +    return VLC_SUCCESS;
> +}
> +
>  static int vout_Start(vout_thread_sys_t *vout, vlc_video_context 
> *vctx, const vout_configuration_t *cfg)
>  {
>      vout_thread_sys_t *sys = vout;
> @@ -1735,8 +1768,6 @@ static int vout_Start(vout_thread_sys_t *vout, 
> vlc_video_context *vctx, const vo
>      vlc_mouse_Init(&sys->mouse);
>  
>      sys->decoder_fifo = picture_fifo_New();
> -    sys->private.display_pool = NULL;
> -    sys->private.private_pool = NULL;
>  
>      sys->filter.configuration = NULL;
>      video_format_Copy(&sys->filter.src_fmt, &sys->original);
> @@ -1758,9 +1789,6 @@ static int vout_Start(vout_thread_sys_t *vout, 
> vlc_video_context *vctx, const vo
>      sys->filter.chain_interactive = filter_chain_NewVideo(&vout->obj, 
> true, &owner);
>  
>      vout_display_cfg_t dcfg;
> -    int x = 0, y = 0, w = 0, h = 0;
> -    unsigned crop_num = 0, crop_den = 0;
> -    unsigned num, den;
>  
>      vlc_mutex_lock(&sys->window_lock);
>  #ifndef NDEBUG
> @@ -1775,12 +1803,14 @@ static int vout_Start(vout_thread_sys_t *vout, 
> vlc_video_context *vctx, const vo
>  
>      dcfg = sys->display_cfg;
>  
> +    int x = 0, y = 0, w = 0, h = 0;
> +    vlc_rational_t crop = {0};
>      switch (sys->source.crop.mode) {
>          case VOUT_CROP_NONE:
>              break;
>          case VOUT_CROP_RATIO:
> -            crop_num = sys->source.crop.ratio.num;
> -            crop_den = sys->source.crop.ratio.den;
> +            crop = (vlc_rational_t) { sys->source.crop.ratio.num,
> +                                      sys->source.crop.ratio.den };
>              break;
>          case VOUT_CROP_WINDOW:
>              x = sys->source.crop.window.x;
> @@ -1796,31 +1826,18 @@ static int vout_Start(vout_thread_sys_t *vout, 
> vlc_video_context *vctx, const vo
>              break;
>      }
>  
> -    num = sys->source.dar.num;
> -    den = sys->source.dar.den;
> +    vlc_rational_t dar = (vlc_rational_t) { sys->source.dar.num, 
> sys->source.dar.den };
>      vlc_mutex_lock(&sys->display_lock);
>      vlc_mutex_unlock(&sys->window_lock);
>  
> -    /* Setup the window size, protected by the display_lock */
> -    dcfg.window_props.width = sys->window_width;
> -    dcfg.window_props.height = sys->window_height;
> -
> -    sys->display = vout_OpenWrapper(&vout->obj, &sys->private, 
> sys->splitter_name, &dcfg,
> -                                    &sys->original, vctx);
> -    if (sys->display == NULL) {
> -        vlc_mutex_unlock(&sys->display_lock);
> -        goto error;
> -    }
> -
> -    vout_SetDisplayCrop(sys->display, crop_num, crop_den, x, y, w, h);
> -
> -    if (num != 0 && den != 0)
> -        vout_SetDisplayAspect(sys->display, num, den);
> +    int err = vout_StartDisplayAloneLocked(vout, &sys->original, vctx, 
> &dcfg,
> +                                           &dar, &crop, x, y, h, w);
>      vlc_mutex_unlock(&sys->display_lock);
> +    if (err != VLC_SUCCESS)
> +        goto error;
>  
>      assert(sys->private.display_pool != NULL && 
> sys->private.private_pool != NULL);
>  
> -    sys->displayed.current       = NULL;
>      sys->displayed.decoded       = NULL;
>      sys->displayed.date          = VLC_TICK_INVALID;
>      sys->displayed.is_interlaced = false;
> -- 
> 2.26.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