From aaec2aba3890e1b2ea8f4dc158d884bc85a59517 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 27 Oct 2015 20:56:46 +0100 Subject: player: add audio drop/duplicate mode Not very robust in the moment. --- player/audio.c | 36 ++++++++++++++++++++++++++++++++++++ player/core.h | 2 ++ player/video.c | 2 +- 3 files changed, 39 insertions(+), 1 deletion(-) (limited to 'player') diff --git a/player/audio.c b/player/audio.c index ce72e3d0f1..9207986892 100644 --- a/player/audio.c +++ b/player/audio.c @@ -551,6 +551,27 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) playsize = MPMAX(1, playsize + skip); // silence will be prepended } + int skip_duplicate = 0; // >0: skip, <0: duplicate + if (mpctx->display_sync_active && opts->video_sync == VS_DISP_ADROP && + fabs(mpctx->last_av_difference) >= opts->sync_audio_drop_size && + mpctx->audio_status == STATUS_PLAYING) + { + int samples = ceil(opts->sync_audio_drop_size * play_samplerate); + int align = af_format_sample_alignment(out_format.format); + samples = (samples + align / 2) / align * align; + + skip_duplicate = mpctx->last_av_difference >= 0 ? -samples : samples; + + // safeguard against excessively growing audio buffer sizes + if (skip_duplicate < 0 && mp_audio_buffer_seconds(mpctx->ao_buffer) > 5) { + skip_duplicate = 0; + samples = 0; + } + + if (playsize < samples) + playsize = samples; + } + int status = AD_OK; bool working = false; if (playsize > mp_audio_buffer_samples(mpctx->ao_buffer)) { @@ -598,6 +619,21 @@ void fill_audio_out_buffers(struct MPContext *mpctx, double endpts) end_sync = true; } + if (skip_duplicate) { + int max = mp_audio_buffer_samples(mpctx->ao_buffer); + if (abs(skip_duplicate) > max) + skip_duplicate = skip_duplicate >= 0 ? max : -max; + mpctx->last_av_difference += skip_duplicate / play_samplerate; + if (skip_duplicate >= 0) { + mp_audio_buffer_skip(mpctx->ao_buffer, skip_duplicate); + MP_STATS(mpctx, "drop-audio"); + } else { + mp_audio_buffer_duplicate(mpctx->ao_buffer, -skip_duplicate); + MP_STATS(mpctx, "duplicate-audio"); + } + MP_VERBOSE(mpctx, "audio skip_duplicate=%d\n", skip_duplicate); + } + if (mpctx->audio_status == STATUS_SYNCING) { if (end_sync) mpctx->audio_status = STATUS_FILLING; diff --git a/player/core.h b/player/core.h index b775e52535..b5c2077e5a 100644 --- a/player/core.h +++ b/player/core.h @@ -84,6 +84,7 @@ enum video_sync { VS_DISP_RESAMPLE, VS_DISP_RESAMPLE_VDROP, VS_DISP_RESAMPLE_NONE, + VS_DISP_ADROP, VS_DISP_VDROP, VS_DISP_NONE, VS_NONE, @@ -92,6 +93,7 @@ enum video_sync { #define VS_IS_DISP(x) ((x) == VS_DISP_RESAMPLE || \ (x) == VS_DISP_RESAMPLE_VDROP || \ (x) == VS_DISP_RESAMPLE_NONE || \ + (x) == VS_DISP_ADROP || \ (x) == VS_DISP_VDROP || \ (x) == VS_DISP_NONE) diff --git a/player/video.c b/player/video.c index 7d423cb50c..3ea5607b35 100644 --- a/player/video.c +++ b/player/video.c @@ -912,7 +912,7 @@ static void handle_display_sync_frame(struct MPContext *mpctx, bool resample = mode == VS_DISP_RESAMPLE || mode == VS_DISP_RESAMPLE_VDROP || mode == VS_DISP_RESAMPLE_NONE; bool drop = mode == VS_DISP_VDROP || mode == VS_DISP_RESAMPLE || - mode == VS_DISP_RESAMPLE_VDROP; + mode == VS_DISP_ADROP || mode == VS_DISP_RESAMPLE_VDROP; drop &= (opts->frame_dropping & 1); if (resample && using_spdif_passthrough(mpctx)) -- cgit v1.2.3