From 7aba3a5d96b0d3b22c9e93057b6d1b4cba0e5104 Mon Sep 17 00:00:00 2001 From: wm4 Date: Fri, 30 Oct 2015 14:05:41 +0100 Subject: [PATCH] command: add mistimed-frame-count property Does what the manpage says. This is a replacement incrementing the dropped frame counter (see previous commit). --- DOCS/man/input.rst | 8 ++++++++ player/command.c | 15 ++++++++++++--- player/core.h | 2 ++ player/video.c | 4 ++++ 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);