From 4f984b987c323b63db9e4926da8f6265f841a6ca Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 16 Aug 2014 00:05:02 +0200 Subject: video: add --display-fps switch to control framedrop FPS Since the display FPS is currently detected on X11 only (and even there it's known to be wrong on certain setups), it seems like a good idea to make this user-configurable. --- DOCS/man/options.rst | 7 +++++++ options/options.c | 2 ++ options/options.h | 1 + video/out/vo.c | 10 +++++++--- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index fa4dcd3b8b..9320a244ac 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -464,6 +464,13 @@ Video mode enabled. It doesn't increment the ``D:`` field in the statusline either. +``--display-fps=`` + Set the maximum assumed display FPS used with ``--framedrop``. By default + a detected value is used (X11 only, not correct on multi-monitor systems), + or infinite display FPS if that fails. Infinite FPS means only frames too + late are dropped. If a correct FPS is provided, frames that are predicted + to be too late are dropped too. + ``--hwdec=`` Specify the hardware video decoding API that should be used if possible. Whether hardware decoding is actually done depends on the video codec. If diff --git a/options/options.c b/options/options.c index 58e8d9dec4..aacb1b725a 100644 --- a/options/options.c +++ b/options/options.c @@ -462,6 +462,8 @@ const m_option_t mp_opts[] = { {"decoder", 2}, {"decoder+vo", 3})), + OPT_DOUBLE("display-fps", frame_drop_fps, M_OPT_MIN, .min = 0), + OPT_FLAG("audiodrop", insert_silence, 0), OPT_FLAG("untimed", untimed, M_OPT_FIXED), diff --git a/options/options.h b/options/options.h index 9b48a0162e..65007bd22e 100644 --- a/options/options.h +++ b/options/options.h @@ -137,6 +137,7 @@ typedef struct MPOpts { float default_max_pts_correction; int autosync; int frame_dropping; + double frame_drop_fps; int insert_silence; int term_osd; int term_osd_bar; diff --git a/video/out/vo.c b/video/out/vo.c index 72f98e8859..bb98160883 100644 --- a/video/out/vo.c +++ b/video/out/vo.c @@ -332,8 +332,12 @@ static void run_reconfig(void *p) forget_frames(vo); // implicitly synchronized double display_fps = 1000.0; // assume infinite if unset - vo->driver->control(vo, VOCTRL_GET_DISPLAY_FPS, &display_fps); - vo->in->vsync_interval = 1e6 / display_fps; + if (vo->global->opts->frame_drop_fps > 0) { + display_fps = vo->global->opts->frame_drop_fps; + } else { + vo->driver->control(vo, VOCTRL_GET_DISPLAY_FPS, &display_fps); + } + vo->in->vsync_interval = MPMAX((int64_t)(1e6 / display_fps), 1); MP_VERBOSE(vo, "Assuming %f FPS for framedrop.\n", display_fps); } @@ -515,7 +519,7 @@ static int64_t prev_sync(struct vo *vo, int64_t ts) struct vo_internal *in = vo->in; int64_t diff = (int64_t)(ts - in->last_flip); - int64_t offset = diff % MPMAX(in->vsync_interval, 1); + int64_t offset = diff % in->vsync_interval; if (offset < 0) offset += in->vsync_interval; return ts - offset; -- cgit v1.2.3