summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-10-27 20:56:46 +0100
committerwm4 <wm4@nowhere>2015-10-27 20:56:46 +0100
commitaaec2aba3890e1b2ea8f4dc158d884bc85a59517 (patch)
tree61d9e3464aa0777bb7e58257e24b290c4b2146bd /player
parent3b95dd47d53d4d9b5a247f2dda550b5470e62b48 (diff)
downloadmpv-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.c36
-rw-r--r--player/core.h2
-rw-r--r--player/video.c2
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))