vlc | branch: master | Thomas Guillem <tho...@gllm.fr> | Wed Mar 25 15:27:36 2015 +0000| [93e1d6ad785df9cae30fda05d85c6f0dada4708a] | committer: Jean-Baptiste Kempf
video_output: fix controls and events not processed This issue is easily reproducible with VDPAU activated, with a 60fps ts file, see #14199. With this sample, The video_output Thread is looping in ThreadDisplayPicture way more often than with other videos. Consequently, vout_ManageWrapper and ThreadControl are not called enough. As a result, subtitles are processed too late, the mouse isn't able to hide/unhide, we can be stuck in fullscreen mode, or second click on video to pop up the menu doesn't work. To fix this issue: don't loop in ThreadDisplayPicture and don't wait in vout_control_Pop if a picture was previously displayed. Fixes #14199 Signed-off-by: Jean-Baptiste Kempf <j...@videolan.org> > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=93e1d6ad785df9cae30fda05d85c6f0dada4708a --- src/video_output/control.c | 9 +++------ src/video_output/control.h | 2 +- src/video_output/video_output.c | 15 +++++++++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/video_output/control.c b/src/video_output/control.c index f317196..bbdb894 100644 --- a/src/video_output/control.c +++ b/src/video_output/control.c @@ -177,19 +177,16 @@ void vout_control_PushString(vout_control_t *ctrl, int type, const char *string) } int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd, - mtime_t deadline, mtime_t timeout) + mtime_t deadline) { vlc_mutex_lock(&ctrl->lock); if (ctrl->cmd.i_size <= 0) { ctrl->is_processing = false; vlc_cond_broadcast(&ctrl->wait_acknowledge); - const mtime_t max_deadline = mdate() + timeout; - const mtime_t wait_deadline = deadline <= VLC_TS_INVALID ? max_deadline : __MIN(deadline, max_deadline); - /* Spurious wakeups are perfectly fine */ - if (ctrl->can_sleep) - vlc_cond_timedwait(&ctrl->wait_request, &ctrl->lock, wait_deadline); + if (deadline > VLC_TS_INVALID && ctrl->can_sleep) + vlc_cond_timedwait(&ctrl->wait_request, &ctrl->lock, deadline); } bool has_cmd; diff --git a/src/video_output/control.h b/src/video_output/control.h index f52a529..159e5f8 100644 --- a/src/video_output/control.h +++ b/src/video_output/control.h @@ -130,7 +130,7 @@ void vout_control_PushString(vout_control_t *, int type, const char *string); void vout_control_Wake(vout_control_t *); /* control inside of the vout thread */ -int vout_control_Pop(vout_control_t *, vout_control_cmd_t *, mtime_t deadline, mtime_t timeout); +int vout_control_Pop(vout_control_t *, vout_control_cmd_t *, mtime_t deadline); void vout_control_Dead(vout_control_t *); #endif diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index 40701b7..43ff7ad 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -1558,16 +1558,23 @@ static void *Thread(void *object) }; mtime_t deadline = VLC_TS_INVALID; + bool wait = false; for (;;) { vout_control_cmd_t cmd; - /* FIXME remove thoses ugly timeouts */ - while (!vout_control_Pop(&sys->control, &cmd, deadline, 100000)) + + if (wait) + { + const mtime_t max_deadline = mdate() + 100000; + deadline = deadline <= VLC_TS_INVALID ? max_deadline : __MIN(deadline, max_deadline); + } else { + deadline = VLC_TS_INVALID; + } + while (!vout_control_Pop(&sys->control, &cmd, deadline)) if (ThreadControl(vout, cmd)) return NULL; deadline = VLC_TS_INVALID; - while (!ThreadDisplayPicture(vout, &deadline)) - ; + wait = ThreadDisplayPicture(vout, &deadline) != VLC_SUCCESS; const bool picture_interlaced = sys->displayed.is_interlaced; _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits