summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/input.rst8
-rw-r--r--player/command.c15
-rw-r--r--player/core.h2
-rw-r--r--player/video.c4
4 files changed, 26 insertions, 3 deletions
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst
index d1d891227b..04cf44c8ae 100644
--- a/DOCS/man/input.rst
+++ b/DOCS/man/input.rst
@@ -913,6 +913,14 @@ Property list
``vo-drop-frame-count``
Frames dropped by VO (when using ``--framedrop=vo``).
+``mistimed-frame-count``
+ Number of video frames that were not timed correctly in display-sync mode
+ for the sake of keeping A/V sync. This does not include external
+ circumstances, such as video rendering being too slow or the graphics
+ driver somehow skipping a vsync. It does not include rounding errors either
+ (which can happen especially with bad source timestamps). For example,
+ using the ``display-desync`` mode should never change this value from 0.
+
``percent-pos`` (RW)
Position in current file (0-100). The advantage over using this instead of
calculating it out of other properties is that it properly falls back to
diff --git a/player/command.c b/player/command.c
index b912a2ad1f..27912354a5 100644
--- a/player/command.c
+++ b/player/command.c
@@ -553,8 +553,6 @@ static int mp_property_total_avsync_change(void *ctx, struct m_property *prop,
return m_property_double_ro(action, arg, mpctx->total_avsync_change);
}
-
-/// Late frames
static int mp_property_drop_frame_cnt(void *ctx, struct m_property *prop,
int action, void *arg)
{
@@ -565,6 +563,16 @@ static int mp_property_drop_frame_cnt(void *ctx, struct m_property *prop,
return m_property_int_ro(action, arg, mpctx->dropped_frames_total);
}
+static int mp_property_mistimed_frame_count(void *ctx, struct m_property *prop,
+ int action, void *arg)
+{
+ MPContext *mpctx = ctx;
+ if (!mpctx->d_video || !mpctx->display_sync_active)
+ return M_PROPERTY_UNAVAILABLE;
+
+ return m_property_int_ro(action, arg, mpctx->mistimed_frames_total);
+}
+
static int mp_property_vo_drop_frame_count(void *ctx, struct m_property *prop,
int action, void *arg)
{
@@ -3383,6 +3391,7 @@ static const struct m_property mp_properties[] = {
{"avsync", mp_property_avsync},
{"total-avsync-change", mp_property_total_avsync_change},
{"drop-frame-count", mp_property_drop_frame_cnt},
+ {"mistimed-frame-count", mp_property_mistimed_frame_count},
{"vo-drop-frame-count", mp_property_vo_drop_frame_count},
{"vo-missed-frame-count", mp_property_vo_missed_frame_count},
{"percent-pos", mp_property_percent_pos},
@@ -3601,7 +3610,7 @@ static const char *const *const mp_event_property_change[] = {
"percent-pos", "time-remaining", "playtime-remaining", "playback-time",
"estimated-vf-fps", "drop-frame-count", "vo-drop-frame-count",
"total-avsync-change", "audio-speed-correction", "video-speed-correction",
- "vo-missed-frame-count"),
+ "vo-missed-frame-count", "mistimed-frame-count"),
E(MPV_EVENT_VIDEO_RECONFIG, "video-out-params", "video-params",
"video-format", "video-codec", "video-bitrate", "dwidth", "dheight",
"width", "height", "fps", "aspect", "vo-configured", "current-vo",
diff --git a/player/core.h b/player/core.h
index b5c2077e5a..fb7c1ed975 100644
--- a/player/core.h
+++ b/player/core.h
@@ -269,6 +269,8 @@ typedef struct MPContext {
// Timing error (in seconds) due to rounding on vsync boundaries
double display_sync_error;
int display_sync_disable_counter;
+ // Number of mistimed frames.
+ int mistimed_frames_total;
/* Set if audio should be timed to start with video frame after seeking,
* not set when e.g. playing cover art */
bool sync_audio_to_video;
diff --git a/player/video.c b/player/video.c
index af98c676ed..857fb017bc 100644
--- a/player/video.c
+++ b/player/video.c
@@ -211,6 +211,7 @@ void reset_video_state(struct MPContext *mpctx)
mpctx->display_sync_disable_counter = 0;
mpctx->dropped_frames_total = 0;
mpctx->dropped_frames = 0;
+ mpctx->mistimed_frames_total = 0;
mpctx->drop_message_shown = 0;
mpctx->display_sync_drift_dir = 0;
@@ -1034,6 +1035,9 @@ static void handle_display_sync_frame(struct MPContext *mpctx,
// Likewise, we know sync is off, but is going to be compensated.
time_left += drop_repeat * vsync;
+ if (drop_repeat)
+ mpctx->mistimed_frames_total += 1;
+
mpctx->total_avsync_change = 0;
update_av_diff(mpctx, time_left);