From 27bd1294ec384e9fb8287480297d803d0fdf43a0 Mon Sep 17 00:00:00 2001 From: krocard Date: Mon, 17 Feb 2020 14:02:25 +0000 Subject: [PATCH] AudioSink: Correct access unit count logic Previously, the input buffer accessUnit count was passed as the output of the audio processors which did not make sense as the processors can split buffers. This patch passes the access unit count through a member variable. PiperOrigin-RevId: 295572577 --- .../exoplayer2/audio/DefaultAudioSink.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index d61a6fd2f8..362b30ddbf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -258,8 +258,8 @@ public final class DefaultAudioSink implements AudioSink { private AudioProcessor[] activeAudioProcessors; private ByteBuffer[] outputBuffers; @Nullable private ByteBuffer inputBuffer; + private int inputBufferAccessUnitCount; @Nullable private ByteBuffer outputBuffer; - private int outputBufferEncodedAccessUnitCount; private byte[] preV21OutputBuffer; private int preV21OutputBufferOffset; private int drainingAudioProcessorIndex; @@ -679,16 +679,14 @@ public final class DefaultAudioSink implements AudioSink { } inputBuffer = buffer; + inputBufferAccessUnitCount = encodedAccessUnitCount; } - if (configuration.processingEnabled) { - processBuffers(presentationTimeUs, encodedAccessUnitCount); - } else { - writeBuffer(inputBuffer, presentationTimeUs, encodedAccessUnitCount); - } + processBuffers(presentationTimeUs); if (!inputBuffer.hasRemaining()) { inputBuffer = null; + inputBufferAccessUnitCount = 0; return true; } @@ -701,15 +699,14 @@ public final class DefaultAudioSink implements AudioSink { return false; } - private void processBuffers(long avSyncPresentationTimeUs, int encodedAccessUnitCount) - throws WriteException { + private void processBuffers(long avSyncPresentationTimeUs) throws WriteException { int count = activeAudioProcessors.length; int index = count; while (index >= 0) { ByteBuffer input = index > 0 ? outputBuffers[index - 1] : (inputBuffer != null ? inputBuffer : AudioProcessor.EMPTY_BUFFER); if (index == count) { - writeBuffer(input, avSyncPresentationTimeUs, encodedAccessUnitCount); + writeBuffer(input, avSyncPresentationTimeUs); } else { AudioProcessor audioProcessor = activeAudioProcessors[index]; audioProcessor.queueInput(input); @@ -733,9 +730,7 @@ public final class DefaultAudioSink implements AudioSink { } @SuppressWarnings("ReferenceEquality") - private void writeBuffer( - ByteBuffer buffer, long avSyncPresentationTimeUs, int encodedAccessUnitCount) - throws WriteException { + private void writeBuffer(ByteBuffer buffer, long avSyncPresentationTimeUs) throws WriteException { if (!buffer.hasRemaining()) { return; } @@ -743,7 +738,6 @@ public final class DefaultAudioSink implements AudioSink { Assertions.checkArgument(outputBuffer == buffer); } else { outputBuffer = buffer; - outputBufferEncodedAccessUnitCount = encodedAccessUnitCount; if (Util.SDK_INT < 21) { int bytesRemaining = buffer.remaining(); if (preV21OutputBuffer == null || preV21OutputBuffer.length < bytesRemaining) { @@ -787,10 +781,12 @@ public final class DefaultAudioSink implements AudioSink { } if (bytesWritten == bytesRemaining) { if (!configuration.isInputPcm) { - writtenEncodedFrames += framesPerEncodedSample * encodedAccessUnitCount; + // When playing non-PCM, the inputBuffer is never processed, thus the last inputBuffer + // must be the current input buffer. + Assertions.checkState(buffer == inputBuffer); + writtenEncodedFrames += framesPerEncodedSample * inputBufferAccessUnitCount; } outputBuffer = null; - outputBufferEncodedAccessUnitCount = 0; } } @@ -814,8 +810,7 @@ public final class DefaultAudioSink implements AudioSink { if (audioProcessorNeedsEndOfStream) { audioProcessor.queueEndOfStream(); } - // Audio is always PCM in audio processors, thus there is no encoded access unit count. - processBuffers(C.TIME_UNSET, /* encodedAccessUnitCount= */ 0); + processBuffers(C.TIME_UNSET); if (!audioProcessor.isEnded()) { return false; } @@ -825,7 +820,7 @@ public final class DefaultAudioSink implements AudioSink { // Finish writing any remaining output to the track. if (outputBuffer != null) { - writeBuffer(outputBuffer, C.TIME_UNSET, outputBufferEncodedAccessUnitCount); + writeBuffer(outputBuffer, C.TIME_UNSET); if (outputBuffer != null) { return false; } @@ -977,8 +972,8 @@ public final class DefaultAudioSink implements AudioSink { trimmingAudioProcessor.resetTrimmedFrameCount(); flushAudioProcessors(); inputBuffer = null; + inputBufferAccessUnitCount = 0; outputBuffer = null; - outputBufferEncodedAccessUnitCount = 0; stoppedAudioTrack = false; handledEndOfStream = false; drainingAudioProcessorIndex = C.INDEX_UNSET;