[vlc-devel] [PATCH] video_output: wait half the extra time we have without getting the display_lock
Thomas Guillem
thomas at gllm.fr
Fri Feb 19 13:45:20 UTC 2021
On Fri, Feb 19, 2021, at 14:12, Steve Lhomme wrote:
> This is more a workaround than a clean solution.
>
> In an ideal world we would never wait between prepare and display, they
> would have predictable time and we could estimate exactly when we must
> do the prepare to be on-time for the display.
In an ideal world, most common "vout display" can handle asynchronous rendering. In that case, only the vd->prepare callback is needed, and the plugin take care of swapping at the given picture date. This is done like that with recent Android versions when using MediaCodec, cf. https://developer.android.com/reference/android/media/MediaCodec#releaseOutputBuffer(int,%20long)
vlc_clock_Wait() is called even if vd->display is null (plugin handle async swap), this is an error, that need to be fixed.
>
> That would also leave all that time to the vout control loop to process
> more mouse events that might occur before we start the displaying.
>
> Looking at how we handle the deadline in Windows, it seems we sometimes
> missing the deadline by too far and we end up having to skip the frame
> we wanted to display (with its deadline) because now we won't have
> enough time to render it in time.
>
> On 2021-02-19 12:16, 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 | 17 +++++++++++++++++
> > 1 file changed, 17 insertions(+)
> >
> > diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> > index d04d3f4d111..c176c274334 100644
> > --- a/src/video_output/video_output.c
> > +++ b/src/video_output/video_output.c
> > @@ -1119,6 +1119,23 @@ 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
> > + 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
> >
> _______________________________________________
> 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