summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-08-16 00:05:02 +0200
committerwm4 <wm4@nowhere>2014-08-16 00:05:02 +0200
commit4f984b987c323b63db9e4926da8f6265f841a6ca (patch)
tree76db26ac39918a25fbd3bf4d9602123de430df47
parent07aba86b37887c0aef7ea90af250fcf19062369b (diff)
downloadmpv-4f984b987c323b63db9e4926da8f6265f841a6ca.tar.bz2
mpv-4f984b987c323b63db9e4926da8f6265f841a6ca.tar.xz
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.
-rw-r--r--DOCS/man/options.rst7
-rw-r--r--options/options.c2
-rw-r--r--options/options.h1
-rw-r--r--video/out/vo.c10
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=<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=<api>``
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;