From 0d0444fed02fb0f1ebd2cc7ab98a0ce5fd8740d7 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sun, 24 May 2015 15:48:48 +0200 Subject: vo_null: add framerate emulation --- video/out/vo_null.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) (limited to 'video') diff --git a/video/out/vo_null.c b/video/out/vo_null.c index 6455210d66..52ec934586 100644 --- a/video/out/vo_null.c +++ b/video/out/vo_null.c @@ -19,14 +19,18 @@ * with mpv. If not, see . */ -#include #include -#include -#include -#include "config.h" #include "common/msg.h" #include "vo.h" #include "video/mp_image.h" +#include "osdep/timer.h" +#include "options/m_option.h" + +struct priv { + int64_t last_vsync; + + double cfg_fps; +}; static void draw_image(struct vo *vo, mp_image_t *mpi) { @@ -35,6 +39,18 @@ static void draw_image(struct vo *vo, mp_image_t *mpi) static void flip_page(struct vo *vo) { + struct priv *p = vo->priv; + if (p->cfg_fps) { + int64_t ft = 1e6 / p->cfg_fps; + int64_t prev_vsync = mp_time_us() / ft; + int64_t target_time = (prev_vsync + 1) * ft; + for (;;) { + int64_t now = mp_time_us(); + if (now >= target_time) + break; + mp_sleep_us(target_time - now); + } + } } static int query_format(struct vo *vo, int format) @@ -58,9 +74,18 @@ static int preinit(struct vo *vo) static int control(struct vo *vo, uint32_t request, void *data) { + struct priv *p = vo->priv; + switch (request) { + case VOCTRL_GET_DISPLAY_FPS: + if (!p->cfg_fps) + break; + *(double *)data = p->cfg_fps; + return VO_TRUE; + } return VO_NOTIMPL; } +#define OPT_BASE_STRUCT struct priv const struct vo_driver video_out_null = { .description = "Null video output", .name = "null", @@ -71,4 +96,9 @@ const struct vo_driver video_out_null = { .draw_image = draw_image, .flip_page = flip_page, .uninit = uninit, + .priv_size = sizeof(struct priv), + .options = (const struct m_option[]) { + OPT_DOUBLE("fps", cfg_fps, M_OPT_RANGE, .min = 0, .max = 10000), + {0}, + }, }; -- cgit v1.2.3