diff options
author | wm4 <wm4@nowhere> | 2015-10-27 20:56:46 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2015-10-27 20:56:46 +0100 |
commit | aaec2aba3890e1b2ea8f4dc158d884bc85a59517 (patch) | |
tree | 61d9e3464aa0777bb7e58257e24b290c4b2146bd /player | |
parent | 3b95dd47d53d4d9b5a247f2dda550b5470e62b48 (diff) | |
download | mpv-aaec2aba3890e1b2ea8f4dc158d884bc85a59517.tar.bz2 mpv-aaec2aba3890e1b2ea8f4dc158d884bc85a59517.tar.xz |
player: add audio drop/duplicate mode
Not very robust in the moment.
Diffstat (limited to 'player')
-rw-r--r-- | player/audio.c | 36 | ||||
-rw-r--r-- | player/core.h | 2 | ||||
-rw-r--r-- | player/video.c | 2 |
3 files changed, 39 insertions, 1 deletions
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)) |