From 34327bec5c9ed6855b7994e2f793a3a0573bfaa7 Mon Sep 17 00:00:00 2001 From: krocard Date: Wed, 6 May 2020 14:54:33 +0100 Subject: [PATCH] Propagate the correct gapless values in passthrough Previously the input format values were used, but it could be incorrect if two format change were occurring in quick successions. PiperOrigin-RevId: 310142675 --- .../audio/MediaCodecAudioRenderer.java | 50 ++++++++++--------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java index cb87482e5a..aa059687af 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/MediaCodecAudioRenderer.java @@ -411,24 +411,44 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media } int channelCount = mediaFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT); int sampleRate = mediaFormat.getInteger(MediaFormat.KEY_SAMPLE_RATE); - int[] channelMap; + @Nullable int[] channelMap = null; if (codecNeedsDiscardChannelsWorkaround && channelCount == 6 && inputFormat.channelCount < 6) { channelMap = new int[inputFormat.channelCount]; for (int i = 0; i < inputFormat.channelCount; i++) { channelMap[i] = i; } - } else { - channelMap = null; } - configureAudioSink(encoding, channelCount, sampleRate, channelMap); + try { + audioSink.configure( + encoding, + channelCount, + sampleRate, + /* specifiedBufferSize= */ 0, + channelMap, + inputFormat.encoderDelay, + inputFormat.encoderPadding); + } catch (AudioSink.ConfigurationException e) { + // TODO(internal: b/145658993) Use outputFormat instead. + throw createRendererException(e, inputFormat); + } } @Override protected void onOutputPassthroughFormatChanged(Format outputFormat) throws ExoPlaybackException { @C.Encoding int encoding = getPassthroughEncoding(outputFormat.channelCount, outputFormat.sampleMimeType); - configureAudioSink( - encoding, outputFormat.channelCount, outputFormat.sampleRate, /* channelMap= */ null); + try { + audioSink.configure( + encoding, + outputFormat.channelCount, + outputFormat.sampleRate, + /* specifiedBufferSize= */ 0, + /* outputChannels= */ null, + outputFormat.encoderDelay, + outputFormat.encoderPadding); + } catch (AudioSink.ConfigurationException e) { + throw createRendererException(e, outputFormat); + } } /** @@ -766,24 +786,6 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media return mediaFormat; } - private void configureAudioSink( - int encoding, int channelCount, int sampleRate, @Nullable int[] channelMap) - throws ExoPlaybackException { - try { - audioSink.configure( - encoding, - channelCount, - sampleRate, - /* specifiedBufferSize= */ 0, - channelMap, - inputFormat.encoderDelay, - inputFormat.encoderPadding); - } catch (AudioSink.ConfigurationException e) { - // TODO(internal: b/145658993) Use outputFormat instead. - throw createRendererException(e, inputFormat); - } - } - private void updateCurrentPosition() { long newCurrentPositionUs = audioSink.getCurrentPositionUs(isEnded()); if (newCurrentPositionUs != AudioSink.CURRENT_POSITION_NOT_SET) {