diff options
-rw-r--r-- | player/playloop.c | 3 | ||||
-rw-r--r-- | video/out/vo.c | 22 | ||||
-rw-r--r-- | video/out/vo.h | 1 |
3 files changed, 22 insertions, 4 deletions
diff --git a/player/playloop.c b/player/playloop.c index de1165e963..3ee37d2381 100644 --- a/player/playloop.c +++ b/player/playloop.c @@ -533,7 +533,8 @@ static void handle_osd_redraw(struct MPContext *mpctx) // Don't redraw immediately during a seek (makes it significantly slower). if (mpctx->d_video && mp_time_sec() - mpctx->start_timestamp < 0.1) return; - bool want_redraw = osd_query_and_reset_want_redraw(mpctx->osd); + bool want_redraw = osd_query_and_reset_want_redraw(mpctx->osd) || + vo_want_redraw(mpctx->video_out); if (!want_redraw) return; vo_redraw(mpctx->video_out); diff --git a/video/out/vo.c b/video/out/vo.c index 9d005647e2..fcc15e4008 100644 --- a/video/out/vo.c +++ b/video/out/vo.c @@ -125,7 +125,8 @@ struct vo_internal { bool hasframe; bool hasframe_rendered; - bool request_redraw; + bool request_redraw; // redraw request from player to VO + bool want_redraw; // redraw request from VO to player bool paused; int64_t flip_queue_offset; // queue flip events at most this much in advance @@ -615,6 +616,7 @@ static bool render_frame(struct vo *vo) vo->want_redraw = false; + in->want_redraw = false; in->request_redraw = false; in->rendering = false; @@ -634,6 +636,7 @@ static void do_redraw(struct vo *vo) pthread_mutex_lock(&in->lock); in->request_redraw = false; + in->want_redraw = false; bool skip = !in->paused && in->dropped_frame; struct mp_image *img = in->dropped_image; if (!skip) { @@ -685,9 +688,13 @@ static void *vo_thread(void *ptr) mp_input_wakeup(vo->input_ctx); } } - vo->want_redraw |= in->request_redraw; + if (vo->want_redraw && !in->want_redraw) { + in->want_redraw = true; + mp_input_wakeup(vo->input_ctx); + } + bool redraw = in->request_redraw; pthread_mutex_unlock(&in->lock); - if (wait_until > now && vo->want_redraw) { + if (wait_until > now && redraw) { do_redraw(vo); // now is a good time continue; } @@ -731,6 +738,15 @@ void vo_redraw(struct vo *vo) pthread_mutex_unlock(&in->lock); } +bool vo_want_redraw(struct vo *vo) +{ + struct vo_internal *in = vo->in; + pthread_mutex_lock(&in->lock); + bool r = in->want_redraw; + pthread_mutex_unlock(&in->lock); + return r; +} + void vo_seek_reset(struct vo *vo) { pthread_mutex_lock(&vo->in->lock); diff --git a/video/out/vo.h b/video/out/vo.h index 0b6c0a5144..feb2907c67 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -292,6 +292,7 @@ void vo_wait_frame(struct vo *vo); bool vo_still_displaying(struct vo *vo); bool vo_has_frame(struct vo *vo); void vo_redraw(struct vo *vo); +bool vo_want_redraw(struct vo *vo); void vo_seek_reset(struct vo *vo); void vo_destroy(struct vo *vo); void vo_set_paused(struct vo *vo, bool paused); |