From 3c78dc22f6df82a3169bd558d5fe165ff468144e Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 10 Apr 2018 23:41:20 -0700 Subject: [PATCH] Handle non-empty EoS buffers, for audio This fixes gapless playback of streams with encoder padding on devices where the decoder could set the end of stream flag on a non-empty final buffer. Issue: #3449 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=192407924 --- RELEASENOTES.md | 2 ++ .../exoplayer2/mediacodec/MediaCodecRenderer.java | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a6df395d01..1f366a0c68 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -41,6 +41,8 @@ * Fix an issue where playback of TrueHD streams would get stuck after seeking due to not finding a syncframe ((#3845)[https://github.com/google/ExoPlayer/issues/3845]). + * Handle non-empty end-of-stream buffers, to fix gapless playback of streams + with encoder padding when the decoder returns a non-empty final buffer. * Caching: * Add release method to Cache interface. * Prevent multiple instances of SimpleCache in the same folder. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index dce3f72302..2f95d15f12 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -1027,7 +1027,8 @@ public abstract class MediaCodecRenderer extends BaseRenderer { shouldSkipAdaptationWorkaroundOutputBuffer = false; codec.releaseOutputBuffer(outputIndex, false); return true; - } else if ((outputBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { + } else if (outputBufferInfo.size == 0 + && (outputBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { // The dequeued buffer indicates the end of the stream. Process it immediately. processEndOfStream(); return false; @@ -1094,8 +1095,12 @@ public abstract class MediaCodecRenderer extends BaseRenderer { if (processedOutputBuffer) { onProcessedOutputBuffer(outputBufferInfo.presentationTimeUs); + boolean isEndOfStream = (outputBufferInfo.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0; resetOutputBuffer(); - return true; + if (!isEndOfStream) { + return true; + } + processEndOfStream(); } return false;