vo_gpu: adjust interpolation_threshold's default

When mpv attempts to play a video that is, on average, 60 FPS on a
display that is not exactly 60.00 Hz, two options try to fight each
other: `video-sync-max-video-change` and `interpolation-threshold`.
Normally, container FPS in something such as an .mp4 or a .mkv is
precise enough such that the video can be retimed exactly to the display
Hz and interpolation is not activated.

In the case of something like certain live streaming videos or other scenario
where container FPS is not known, the default option of 0.0001 for
`interpolation-threshold` is extremely low, and while
`video-sync-max-video-change` retimes the video to what it approximately
knows as the "real" FPS, this may or may not be outside of
`interpolation-threshold`'s logic at any given time, which causes
interpolation to be frequently flipped on and off giving an appearance
of stuttering or repeated frames that is oftern quite jarring and makes
a video unwatchable.

This commit changes the default of `interpolation-threshold` to 0.01,
which is the same value as `video-sync-max-video-change`, and guarantees
that if the user accepts a video being retimed to match the display,
they do not additionally have to worry about a much more
precise interpolation threshold randomly flipping on or off. No internal
logic is changed so setting `interpolation-threshold` to -1 will still
disable this logic entirely and always enable interpolation.

The documentation has been updated to reflect this change and give
context to the user for which scenarios they might want to disable
`interpolation-threshold` logic or change it to a smaller value.
This commit is contained in:
LaserEyess 2021-03-16 21:44:29 -04:00 committed by Jan Ekström
parent e5551f775d
commit dd86f195a6
2 changed files with 21 additions and 7 deletions

View File

@ -5183,18 +5183,29 @@ The following video options are currently all specific to ``--vo=gpu`` and
``--interpolation-threshold=<0..1,-1>``
Threshold below which frame ratio interpolation gets disabled (default:
``0.0001``). This is calculated as ``abs(disphz/vfps - 1) < threshold``,
``0.01``). This is calculated as ``abs(disphz/vfps - 1) < threshold``,
where ``vfps`` is the speed-adjusted video FPS, and ``disphz`` the
display refresh rate. (The speed-adjusted video FPS is roughly equal to
the normal video FPS, but with slowdown and speedup applied. This matters
if you use ``--video-sync=display-resample`` to make video run synchronously
to the display FPS, or if you change the ``speed`` property.)
The default is intended to almost always enable interpolation if the
playback rate is even slightly different from the display refresh rate. But
note that if you use e.g. ``--video-sync=display-vdrop``, small deviations
in the rate can disable interpolation and introduce a discontinuity every
other minute.
The default is intended to enable interpolation in scenarios where
retiming with the ``--video-sync=display-*`` cannot adjust the speed of
the video sufficiently for smooth playback. For example if a video is
60.00 FPS and your display refresh rate is 59.94 Hz, interpolation will
never be activated, since the mismatch is within 1% of the refresh
rate. The default also handles the scenario when mpv cannot determine the
container FPS, such as during certain live streams, and may dynamically
toggle interpolation on and off. In this scenario, the default would be to
not use interpolation but rather to allow ``--video-sync=display-*`` to
retime the video to match display refresh rate. See
``--video-sync-max-video-change`` for more information about how mpv
will retime video.
Also note that if you use e.g. ``--video-sync=display-vdrop``, small
deviations in the rate can disable interpolation and introduce a
discontinuity every other minute.
Set this to ``-1`` to disable this logic.
@ -6581,6 +6592,9 @@ Miscellaneous
multiple of the display FPS, as long as the speed change does not exceed
the value set by ``--video-sync-max-video-change``.
See ``--interpolation-threshold`` for how this option affects
interpolation.
This is mostly for testing, and the option may be randomly changed in the
future without notice.

View File

@ -317,7 +317,7 @@ static const struct gl_video_opts gl_video_opts_def = {
},
.scaler_resizes_only = 1,
.scaler_lut_size = 6,
.interpolation_threshold = 0.0001,
.interpolation_threshold = 0.01,
.alpha_mode = ALPHA_BLEND_TILES,
.background = {0, 0, 0, 255},
.gamma = 1.0f,