[vlc-devel] [PATCH v2 1/7] video_output: rework the deadline parameter return
Steve Lhomme
robux4 at ycbcr.xyz
Fri Aug 14 12:00:58 CEST 2020
v2 changes patches 5 and 6, removing the while and explaining that
there's no spurious wakeups anymore.
On 2020-08-14 11:57, Steve Lhomme wrote:
> It's not a deadline that we get, but a value we return.
>
> We should always return a value, even if the picture wasn't rendered yet.
> Setting a dummy value before calling the function seems more hackish.
>
> Do not compare a next_deadline value if it's VLC_TICK_INVALID.
> Set it to date_refresh even if it's VLC_TICK_INVALID.
>
> Substract the render delay once we have the date we want the next render,
> outside of ThreadDisplayPicture().
>
> Reorder the code to avoid intermediate variables and so we can compare the
> display refresh deadline and the render time of the next picture.
>
> date_next was computed even when next_system_pts is INT64_MAX.
> ---
> src/video_output/video_output.c | 64 +++++++++++++++++----------------
> 1 file changed, 33 insertions(+), 31 deletions(-)
>
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index 6cf7a426673..c5115ce3009 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -1434,15 +1434,18 @@ static int ThreadDisplayRenderPicture(vout_thread_sys_t *vout, bool is_forced)
> return VLC_SUCCESS;
> }
>
> -static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
> +static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *next_render)
> {
> vout_thread_sys_t *sys = vout;
> - bool frame_by_frame = !deadline;
> + bool frame_by_frame = !next_render;
> bool paused = sys->pause.is_on;
> bool first = !sys->displayed.current;
>
> assert(sys->clock);
>
> + if (next_render)
> + *next_render = VLC_TICK_INVALID;
> +
> if (first)
> if (ThreadDisplayPreparePicture(vout, true, frame_by_frame, &paused)) /* FIXME not sure it is ok */
> return VLC_EGENERIC;
> @@ -1453,27 +1456,8 @@ static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
> ;
>
> const vlc_tick_t system_now = vlc_tick_now();
> - const vlc_tick_t render_delay = vout_chrono_GetHigh(&sys->render) + VOUT_MWAIT_TOLERANCE;
>
> bool drop_next_frame = frame_by_frame;
> - vlc_tick_t date_next = VLC_TICK_INVALID;
> -
> - if (!paused && sys->displayed.next) {
> - const vlc_tick_t next_system_pts =
> - vlc_clock_ConvertToSystem(sys->clock, system_now,
> - sys->displayed.next->date, sys->rate);
> - if (unlikely(next_system_pts == INT64_MAX))
> - {
> - /* The clock was just paused, don't display the next frame (keep
> - * the current one). */
> - paused = true;
> - }
> - {
> - date_next = next_system_pts - render_delay;
> - if (date_next <= system_now)
> - drop_next_frame = true;
> - }
> - }
>
> /* FIXME/XXX we must redisplay the last decoded picture (because
> * of potential vout updated, or filters update or SPU update)
> @@ -1486,20 +1470,37 @@ static int ThreadDisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
> */
> bool refresh = false;
>
> - vlc_tick_t date_refresh = VLC_TICK_INVALID;
> if (sys->displayed.date != VLC_TICK_INVALID) {
> - date_refresh = sys->displayed.date + VOUT_REDISPLAY_DELAY - render_delay;
> + vlc_tick_t date_refresh = sys->displayed.date + VOUT_REDISPLAY_DELAY;
> refresh = date_refresh <= system_now;
> + if (!frame_by_frame)
> + *next_render = date_refresh;
> }
> - bool force_refresh = !drop_next_frame && refresh;
>
> - if (!frame_by_frame) {
> - if (date_refresh != VLC_TICK_INVALID)
> - *deadline = date_refresh;
> - if (date_next != VLC_TICK_INVALID && date_next < *deadline)
> - *deadline = date_next;
> + if (!paused && sys->displayed.next) {
> + const vlc_tick_t next_system_pts =
> + vlc_clock_ConvertToSystem(sys->clock, system_now,
> + sys->displayed.next->date, sys->rate);
> + if (unlikely(next_system_pts == INT64_MAX))
> + {
> + /* The clock was just paused, don't display the next frame (keep
> + * the current one). */
> + paused = true;
> + }
> + else
> + {
> + if (!frame_by_frame) {
> + if (*next_render == VLC_TICK_INVALID || *next_render > next_system_pts)
> + *next_render = next_system_pts;
> + }
> +
> + if (next_system_pts <= system_now)
> + drop_next_frame = true;
> + }
> }
>
> + bool force_refresh = !drop_next_frame && refresh;
> +
> if (!first && !refresh && !drop_next_frame) {
> return VLC_EGENERIC;
> }
> @@ -1599,7 +1600,7 @@ void vout_NextPicture(vout_thread_t *vout, vlc_tick_t *duration)
> if (sys->step.last == VLC_TICK_INVALID)
> sys->step.last = sys->displayed.timestamp;
>
> - if (ThreadDisplayPicture(sys, NULL) == 0) {
> + if (ThreadDisplayPicture(sys, NULL) == VLC_SUCCESS) {
> sys->step.timestamp = sys->displayed.timestamp;
>
> if (sys->step.last != VLC_TICK_INVALID &&
> @@ -1876,8 +1877,9 @@ static void *Thread(void *object)
> vout_control_cmd_Clean(&cmd);
> }
>
> - deadline = VLC_TICK_INVALID;
> wait = ThreadDisplayPicture(vout, &deadline) != VLC_SUCCESS;
> + if (deadline != VLC_TICK_INVALID)
> + deadline -= vout_chrono_GetHigh(&sys->render) + VOUT_MWAIT_TOLERANCE;
>
> const bool picture_interlaced = sys->displayed.is_interlaced;
>
> --
> 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