summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/mplayer.115
-rw-r--r--libvo/video_out.h2
-rw-r--r--libvo/vo_vdpau.c8
-rw-r--r--mplayer.c6
4 files changed, 27 insertions, 4 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index 41fec8df17..5239a0e39a 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -3514,6 +3514,21 @@ Override autodetected display refresh rate value (the value is needed for framed
Default 0 means use autodetected value.
A positive value is interpreted as a refresh rate in Hz and overrides the autodetected value.
A negative value disables all timing adjustment and framedrop logic.
+.IPs queuetime_windowed=<number>
+.IPs queuetime_fs=<number>
+Use VDPAU's presentation queue functionality to queue future video frame
+changes at most this many milliseconds in advance (default: 50).
+This makes MPlayer's flip timing less sensitive to system CPU load and allows
+it to start decoding the next frame slightly earlier which can reduce jitter
+caused by individual slow-to-decode frames.
+However the NVIDIA graphics drivers can make other window behavior such as
+window moves choppy if VDPAU is using the blit queue (mainly happens
+if you have the composite extension enabled) and this feature is active.
+If this happens on your system and you care about it then you can set the
+time to 0 to disable this feature.
+The settings to use in windowed and fullscreen mode are separate because there
+should be less reason to disable this for fullscreen mode (as the driver issue
+shouldn't affect the video itself).
.RE
.PD 1
.
diff --git a/libvo/video_out.h b/libvo/video_out.h
index 9331e80faf..697cc4e0d5 100644
--- a/libvo/video_out.h
+++ b/libvo/video_out.h
@@ -239,6 +239,8 @@ struct vo {
double next_pts; // pts value of the next frame if any
double next_pts2; // optional pts of frame after that
+ double flip_queue_offset; // queue flip events at most this much in advance
+
const struct vo_driver *driver;
void *priv;
struct MPOpts *opts;
diff --git a/libvo/vo_vdpau.c b/libvo/vo_vdpau.c
index 79465748c5..1b34cba642 100644
--- a/libvo/vo_vdpau.c
+++ b/libvo/vo_vdpau.c
@@ -134,6 +134,8 @@ struct vdpctx {
float sharpen;
int hqscaling;
int chroma_deint;
+ int flip_offset_window;
+ int flip_offset_fs;
int top_field_first;
bool flip;
@@ -386,6 +388,8 @@ static void resize(struct vo *vo)
force_load_font = 1;
#endif
vo_osd_changed(OSDTYPE_OSD);
+ int flip_offset_ms = vo_fs ? vc->flip_offset_fs : vc->flip_offset_window;
+ vo->flip_queue_offset = flip_offset_ms / 1000.;
bool had_frames = vc->num_shown_frames;
if (vc->output_surface_width < vo->dwidth
@@ -1593,6 +1597,8 @@ static int preinit(struct vo *vo, const char *arg)
vc->deint_type = 3;
vc->chroma_deint = 1;
vc->user_colorspace = 1;
+ vc->flip_offset_window = 50;
+ vc->flip_offset_fs = 50;
const opt_t subopts[] = {
{"deint", OPT_ARG_INT, &vc->deint, (opt_test_f)int_non_neg},
{"chroma-deint", OPT_ARG_BOOL, &vc->chroma_deint, NULL},
@@ -1602,6 +1608,8 @@ static int preinit(struct vo *vo, const char *arg)
{"colorspace", OPT_ARG_INT, &vc->user_colorspace, NULL},
{"hqscaling", OPT_ARG_INT, &vc->hqscaling, NULL},
{"fps", OPT_ARG_FLOAT, &vc->user_fps, NULL},
+ {"queuetime_windowed", OPT_ARG_INT, &vc->flip_offset_window, NULL},
+ {"queuetime_fs", OPT_ARG_INT, &vc->flip_offset_fs, NULL},
{NULL}
};
if (subopt_parse(arg, subopts) != 0) {
diff --git a/mplayer.c b/mplayer.c
index a6e3882157..1aa20e183d 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -2167,13 +2167,11 @@ static int sleep_until_update(struct MPContext *mpctx, float *time_frame,
//============================== SLEEP: ===================================
- if (mpctx->video_out->driver->flip_page_timed)
- *time_frame -= 0.05;
+ *time_frame -= mpctx->video_out->flip_queue_offset;
// flag 256 means: libvo driver does its timing (dvb card)
if (*time_frame > 0.001 && !(mpctx->sh_video->output_flags&256))
*time_frame = timing_sleep(mpctx, *time_frame);
- if (mpctx->video_out->driver->flip_page_timed)
- *time_frame += 0.05;
+ *time_frame += mpctx->video_out->flip_queue_offset;
return frame_time_remaining;
}