[vlc-devel] [PATCH v2] video_output: wait half the extra time we have without getting the display_lock

Steve Lhomme robux4 at ycbcr.xyz
Mon Feb 22 07:47:59 UTC 2021


v2 with some inline explanation

On 2021-02-22 8:47, Steve Lhomme wrote:
> Since f1bf7ce5b4480a3d38d54c7ae1d1564f0670d83f we start the rendering much
> earlier than before, so we have more time to do things if necessary.
> 
> The problem is that for almost all the duration of the call display_lock is
> held. So it's blocking all other UI related events from being handled. Even if
> we are going to spend most of the time waiting until we can do the display.
> 
> This patch waits a bit before locking the display_lock when we estimate we will
> have so extra time before doing the display/swap.
> 
> Fixes #25479
> ---
>   src/video_output/video_output.c | 27 +++++++++++++++++++++++++++
>   1 file changed, 27 insertions(+)
> 
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index 9881dcccd5d..ad8ee5f2dae 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -1119,6 +1119,33 @@ static int ThreadDisplayRenderPicture(vout_thread_sys_t *vout, bool render_now)
>       if (filtered->date != sys->displayed.current->date)
>           msg_Warn(&vout->obj, "Unsupported timestamp modifications done by chain_interactive");
>   
> +    if (!render_now)
> +    {
> +        vlc_tick_t now = vlc_tick_now();
> +        vlc_tick_t system_pts = vlc_clock_ConvertToSystem(sys->clock, now, filtered->date, sys->rate);
> +        if (unlikely(system_pts != INT64_MAX))
> +        {
> +            const vlc_tick_t late = now - system_pts;
> +            if (unlikely(late <= 0))
> +            {
> +                // wait half the extra time we have without the display_lock
> +                /* Work around the fact that once we have the next picture we start
> +                 * the rendering right away instead of waiting for the last moment to do it.
> +                 *
> +                 * On Windows the deadline handling is not accurate enough, it can exit
> +                 * way too late and we end up dropping the picture we were about to display.
> +                 *
> +                 * Here we are sure we don't miss the opportunity to display it but we
> +                 * still need to leave some time without the display_lock so the UI
> +                 * has a chance to send some messages.
> +                 */
> +                vlc_tick_t max_time_to_render = sys->render.avg;
> +                vlc_clock_Wait(sys->clock, now , filtered->date - max_time_to_render / 2, sys->rate,
> +                            VOUT_REDISPLAY_DELAY);
> +            }
> +        }
> +    }
> +
>       vout_display_t *vd = sys->display;
>   
>       vlc_mutex_lock(&sys->display_lock);
> -- 
> 2.29.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