Browse Source

vout : display pictures when vsync is never reached

Maxime Chapelet 4 years ago
parent
commit
afcab3db7e
  1. 42
      src/video_output/video_output.c

42
src/video_output/video_output.c

@ -1727,7 +1727,7 @@ static int DisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
}
bool render_now = true;
const vlc_tick_t system_now = vlc_tick_now();
vlc_tick_t system_now = vlc_tick_now();
const vlc_tick_t render_delay = vout_chrono_GetHigh(&sys->render) + VOUT_MWAIT_TOLERANCE;
const bool first = !sys->displayed.current;
@ -1744,7 +1744,7 @@ static int DisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
if (!paused && !first)
{
const vlc_tick_t new_next_pts =
vlc_tick_t new_next_pts =
vlc_clock_ConvertToSystem(sys->clock, system_now,
sys->displayed.next->date, sys->rate);
@ -1769,7 +1769,14 @@ static int DisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
&& (sys->vsync.last_date == sys->vsync.next_date
|| sys->vsync.missed == true) )
{
vlc_cond_wait(&sys->vsync.cond_update, &sys->vsync.lock);
system_now = vlc_tick_now();
vlc_cond_timedwait(&sys->vsync.cond_update, &sys->vsync.lock, new_next_pts);
system_now = vlc_tick_now();
if (system_now > new_next_pts) {
sys->vsync.current_date = system_now;
sys->vsync.next_date = system_now + VLC_TICK_FROM_MS(16);
sys->vsync.missed = false;
}
}
vsync_date = sys->vsync.next_date;
vlc_mutex_unlock(&sys->vsync.lock);
@ -1800,7 +1807,14 @@ static int DisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
&& (sys->vsync.last_date == sys->vsync.next_date
|| sys->vsync.missed == true) )
{
vlc_cond_wait(&sys->vsync.cond_update, &sys->vsync.lock);
system_now = vlc_tick_now();
vlc_cond_timedwait(&sys->vsync.cond_update, &sys->vsync.lock, new_next_pts);
system_now = vlc_tick_now();
if (system_now > new_next_pts) {
sys->vsync.current_date = system_now;
sys->vsync.next_date = system_now + VLC_TICK_FROM_MS(16);
sys->vsync.missed = false;
}
}
vsync_date = sys->vsync.next_date;
@ -1821,8 +1835,24 @@ static int DisplayPicture(vout_thread_sys_t *vout, vlc_tick_t *deadline)
while ( sys->vsync.next_date != VLC_TICK_INVALID
&& !atomic_load(&sys->control_is_terminated)
&& !atomic_load(&sys->vsync_halted)
&& (sys->vsync.last_date == sys->vsync.next_date))
vlc_cond_wait(&sys->vsync.cond_update, &sys->vsync.lock);
&& (sys->vsync.last_date == sys->vsync.next_date))
{
if (sys->displayed.next) {
const vlc_tick_t deadline =
vlc_clock_ConvertToSystem(sys->clock, vlc_tick_now(),
sys->displayed.next->date, sys->rate);
vlc_cond_timedwait(&sys->vsync.cond_update, &sys->vsync.lock, deadline);
system_now = vlc_tick_now();
if (system_now > deadline ) {
sys->vsync.current_date = system_now;
sys->vsync.next_date = system_now + VLC_TICK_FROM_MS(16);
sys->vsync.missed = false;
}
} else {
vlc_cond_wait(&sys->vsync.cond_update, &sys->vsync.lock);
}
}
vsync_date = sys->vsync.next_date;
vlc_mutex_unlock(&sys->vsync.lock);
if (atomic_load(&sys->control_is_terminated) || !no_vsync_halted)

Loading…
Cancel
Save