summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/out/vo.c54
-rw-r--r--video/out/vo.h3
-rw-r--r--video/out/vo_gpu.c2
-rw-r--r--video/out/wayland_common.c15
4 files changed, 4 insertions, 70 deletions
diff --git a/video/out/vo.c b/video/out/vo.c
index e5b4198f76..53db20d3b4 100644
--- a/video/out/vo.c
+++ b/video/out/vo.c
@@ -128,8 +128,6 @@ struct vo_internal {
int64_t nominal_vsync_interval;
- bool external_renderloop_drive;
-
int64_t vsync_interval;
int64_t *vsync_samples;
int num_vsync_samples;
@@ -820,12 +818,11 @@ static void wait_until(struct vo *vo, int64_t target)
pthread_mutex_unlock(&in->lock);
}
-bool vo_render_frame_external(struct vo *vo)
+static bool render_frame(struct vo *vo)
{
struct vo_internal *in = vo->in;
struct vo_frame *frame = NULL;
bool got_frame = false;
- bool flipped = false;
update_display_fps(vo);
@@ -887,7 +884,6 @@ bool vo_render_frame_external(struct vo *vo)
if (in->dropped_frame) {
in->drop_count += 1;
} else {
- flipped = true;
in->rendering = true;
in->hasframe_rendered = true;
int64_t prev_drop_count = vo->in->drop_count;
@@ -949,8 +945,6 @@ bool vo_render_frame_external(struct vo *vo)
done:
talloc_free(frame);
pthread_mutex_unlock(&in->lock);
- if (in->external_renderloop_drive)
- return flipped;
return got_frame || (in->frame_queued && in->frame_queued->display_synced);
}
@@ -993,44 +987,6 @@ static void do_redraw(struct vo *vo)
talloc_free(frame);
}
-static void drop_unrendered_frame(struct vo *vo)
-{
- struct vo_internal *in = vo->in;
-
- pthread_mutex_lock(&in->lock);
-
- if (!in->frame_queued)
- goto end;
-
- if ((in->frame_queued->pts + in->frame_queued->duration) > mp_time_us())
- goto end;
-
- MP_VERBOSE(vo, "Dropping unrendered frame (pts %"PRId64")\n", in->frame_queued->pts);
-
- talloc_free(in->frame_queued);
- in->frame_queued = NULL;
- in->hasframe = false;
- pthread_cond_broadcast(&in->wakeup);
- wakeup_core(vo);
-
-end:
- pthread_mutex_unlock(&in->lock);
-}
-
-void vo_enable_external_renderloop(struct vo *vo)
-{
- struct vo_internal *in = vo->in;
- MP_VERBOSE(vo, "Enabling event driven renderloop!\n");
- in->external_renderloop_drive = true;
-}
-
-void vo_disable_external_renderloop(struct vo *vo)
-{
- struct vo_internal *in = vo->in;
- MP_VERBOSE(vo, "Disabling event driven renderloop!\n");
- in->external_renderloop_drive = false;
-}
-
static struct mp_image *get_image_vo(void *ctx, int imgfmt, int w, int h,
int stride_align)
{
@@ -1065,11 +1021,7 @@ static void *vo_thread(void *ptr)
if (in->terminate)
break;
vo->driver->control(vo, VOCTRL_CHECK_EVENTS, NULL);
- bool working = false;
- if (!in->external_renderloop_drive || !in->hasframe_rendered)
- working = vo_render_frame_external(vo);
- else
- drop_unrendered_frame(vo);
+ bool working = render_frame(vo);
int64_t now = mp_time_us();
int64_t wait_until = now + (working ? 0 : (int64_t)1e9);
@@ -1082,7 +1034,7 @@ static void *vo_thread(void *ptr)
wakeup_core(vo);
}
}
- if (vo->want_redraw) {
+ if (vo->want_redraw && !in->want_redraw) {
vo->want_redraw = false;
in->want_redraw = true;
wakeup_core(vo);
diff --git a/video/out/vo.h b/video/out/vo.h
index e3580db0e9..08ca1219a1 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -505,9 +505,6 @@ void vo_query_formats(struct vo *vo, uint8_t *list);
void vo_event(struct vo *vo, int event);
int vo_query_and_reset_events(struct vo *vo, int events);
struct mp_image *vo_get_current_frame(struct vo *vo);
-void vo_enable_external_renderloop(struct vo *vo);
-void vo_disable_external_renderloop(struct vo *vo);
-bool vo_render_frame_external(struct vo *vo);
void vo_set_queue_params(struct vo *vo, int64_t offset_us, int num_req_frames);
int vo_get_num_req_frames(struct vo *vo);
int64_t vo_get_vsync_interval(struct vo *vo);
diff --git a/video/out/vo_gpu.c b/video/out/vo_gpu.c
index 3229594d9f..5b21646aa2 100644
--- a/video/out/vo_gpu.c
+++ b/video/out/vo_gpu.c
@@ -206,7 +206,7 @@ static int control(struct vo *vo, uint32_t request, void *data)
case VOCTRL_PAUSE:
if (gl_video_showing_interpolated_frame(p->renderer))
vo->want_redraw = true;
- break;
+ return true;
case VOCTRL_PERFORMANCE_DATA:
gl_video_perfdata(p->renderer, (struct voctrl_performance_data *)data);
return true;
diff --git a/video/out/wayland_common.c b/video/out/wayland_common.c
index a70377f3c6..cc07296a43 100644
--- a/video/out/wayland_common.c
+++ b/video/out/wayland_common.c
@@ -807,9 +807,6 @@ static void frame_callback(void *data, struct wl_callback *callback, uint32_t ti
wl->frame_callback = wl_surface_frame(wl->surface);
wl_callback_add_listener(wl->frame_callback, &frame_listener, wl);
-
- if (!vo_render_frame_external(wl->vo))
- wl_surface_commit(wl->surface);
}
static const struct wl_callback_listener frame_listener = {
@@ -827,7 +824,6 @@ static void registry_handle_add(void *data, struct wl_registry *reg, uint32_t id
wl->surface = wl_compositor_create_surface(wl->compositor);
wl->cursor_surface = wl_compositor_create_surface(wl->compositor);
wl_surface_add_listener(wl->surface, &surface_listener, wl);
- vo_enable_external_renderloop(wl->vo);
wl->frame_callback = wl_surface_frame(wl->surface);
wl_callback_add_listener(wl->frame_callback, &frame_listener, wl);
}
@@ -1386,17 +1382,6 @@ int vo_wayland_control(struct vo *vo, int *events, int request, void *arg)
*(char ***)arg = get_displays_spanned(wl);
return VO_TRUE;
}
- case VOCTRL_PAUSE: {
- wl_callback_destroy(wl->frame_callback);
- wl->frame_callback = NULL;
- vo_disable_external_renderloop(wl->vo);
- return VO_TRUE;
- }
- case VOCTRL_RESUME: {
- vo_enable_external_renderloop(wl->vo);
- frame_callback(wl, NULL, 0);
- return VO_TRUE;
- }
case VOCTRL_GET_UNFS_WINDOW_SIZE: {
int *s = arg;
s[0] = mp_rect_w(wl->geometry)*wl->scaling;