summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-10-08 23:08:20 +0200
committerwm4 <wm4@nowhere>2015-10-08 23:20:33 +0200
commitf7124be0914e2e6130c5aaddfc86b7f1d9955f92 (patch)
tree414aa0fb74f60765a503a821faac3a38249b3256 /player
parent6499224888c79eff236e97e0e63efa261d95d9b9 (diff)
downloadmpv-f7124be0914e2e6130c5aaddfc86b7f1d9955f92.tar.bz2
mpv-f7124be0914e2e6130c5aaddfc86b7f1d9955f92.tar.xz
audio: add AO deviation logging
Pretty dumb (and doesn't handle pausing or other discontinuities), but at least somewhat idiot-proof.
Diffstat (limited to 'player')
-rw-r--r--player/audio.c24
-rw-r--r--player/core.h3
2 files changed, 27 insertions, 0 deletions
diff --git a/player/audio.c b/player/audio.c
index 0b35d7018b..3a516eb04f 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -29,6 +29,7 @@
#include "common/encode.h"
#include "options/options.h"
#include "common/common.h"
+#include "osdep/timer.h"
#include "audio/mixer.h"
#include "audio/audio.h"
@@ -153,6 +154,7 @@ void reset_audio_state(struct MPContext *mpctx)
mp_audio_buffer_clear(mpctx->ao_buffer);
mpctx->audio_status = mpctx->d_audio ? STATUS_SYNCING : STATUS_EOF;
mpctx->delay = 0;
+ mpctx->audio_stat_start = 0;
}
void uninit_audio_out(struct MPContext *mpctx)
@@ -403,11 +405,29 @@ static int write_to_ao(struct MPContext *mpctx, struct mp_audio *data, int flags
if (played > 0) {
mpctx->shown_aframes += played;
mpctx->delay += played / real_samplerate;
+ mpctx->written_audio += played / (double)out_format.rate;
return played;
}
return 0;
}
+static void dump_audio_stats(struct MPContext *mpctx)
+{
+ if (!mp_msg_test(mpctx->log, MSGL_STATS))
+ return;
+ if (mpctx->audio_status != STATUS_PLAYING || !mpctx->ao)
+ return;
+
+ double delay = ao_get_delay(mpctx->ao);
+ if (!mpctx->audio_stat_start) {
+ mpctx->audio_stat_start = mp_time_us();
+ mpctx->written_audio = delay;
+ }
+ double current_audio = mpctx->written_audio - delay;
+ double current_time = (mp_time_us() - mpctx->audio_stat_start) / 1e6;
+ MP_STATS(mpctx, "value %f ao-dev", current_audio - current_time);
+}
+
// Return the number of samples that must be skipped or prepended to reach the
// target audio pts after a seek (for A/V sync or hr-seek).
// Return value (*skip):
@@ -471,6 +491,8 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts)
struct MPOpts *opts = mpctx->opts;
struct dec_audio *d_audio = mpctx->d_audio;
+ dump_audio_stats(mpctx);
+
if (mpctx->ao && ao_query_and_reset_events(mpctx->ao, AO_EVENT_RELOAD)) {
ao_reset(mpctx->ao);
uninit_audio_out(mpctx);
@@ -630,6 +652,8 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts)
assert(played >= 0 && played <= data.samples);
mp_audio_buffer_skip(mpctx->ao_buffer, played);
+ dump_audio_stats(mpctx);
+
mpctx->audio_status = STATUS_PLAYING;
if (audio_eof && !playsize) {
mpctx->audio_status = STATUS_DRAINING;
diff --git a/player/core.h b/player/core.h
index eae7d545d2..b775e52535 100644
--- a/player/core.h
+++ b/player/core.h
@@ -302,6 +302,9 @@ typedef struct MPContext {
double last_vo_pts;
// Video PTS, or audio PTS if video has ended.
double playback_pts;
+ // audio stats only
+ int64_t audio_stat_start;
+ double written_audio;
int last_chapter;