From ffc6a0d5f74d58e77ecb649174fbba6e4e21fad5 Mon Sep 17 00:00:00 2001 From: samrobinson Date: Mon, 23 Nov 2020 16:35:34 +0000 Subject: [PATCH] Add Format field to AudioSink.ConfigurationException #exofixit PiperOrigin-RevId: 343857564 --- .../android/exoplayer2/audio/AudioSink.java | 18 +++++++++--------- .../exoplayer2/audio/DecoderAudioRenderer.java | 4 +++- .../exoplayer2/audio/DefaultAudioSink.java | 10 ++++++---- .../audio/MediaCodecAudioRenderer.java | 2 +- .../exoplayer2/audio/DefaultAudioSinkTest.java | 13 +++++++++++++ .../audio/MediaCodecAudioRendererTest.java | 2 +- 6 files changed, 33 insertions(+), 16 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java index c3351ffbad..2b805399f2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/AudioSink.java @@ -144,20 +144,20 @@ public interface AudioSink { */ final class ConfigurationException extends Exception { - /** - * Creates a new configuration exception with the specified {@code cause} and no message. - */ - public ConfigurationException(Throwable cause) { + /** Input {@link Format} of the sink when the configuration failure occurs. */ + public final Format format; + + /** Creates a new configuration exception with the specified {@code cause} and no message. */ + public ConfigurationException(Throwable cause, Format format) { super(cause); + this.format = format; } - /** - * Creates a new configuration exception with the specified {@code message} and no cause. - */ - public ConfigurationException(String message) { + /** Creates a new configuration exception with the specified {@code message} and no cause. */ + public ConfigurationException(String message, Format format) { super(message); + this.format = format; } - } /** Thrown when a failure occurs initializing the sink. */ diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java index 7ecf58f0b2..d04c7d88a9 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DecoderAudioRenderer.java @@ -300,8 +300,10 @@ public abstract class DecoderAudioRenderer< while (drainOutputBuffer()) {} while (feedInputBuffer()) {} TraceUtil.endSection(); - } catch (DecoderException | AudioSink.ConfigurationException e) { + } catch (DecoderException e) { throw createRendererException(e, inputFormat); + } catch (AudioSink.ConfigurationException e) { + throw createRendererException(e, e.format); } catch (AudioSink.InitializationException e) { throw createRendererException(e, inputFormat, e.isRecoverable); } catch (AudioSink.WriteException e) { 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 824129da65..9e77f490a9 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 @@ -535,7 +535,7 @@ public final class DefaultAudioSink implements AudioSink { outputFormat = nextFormat; } } catch (UnhandledAudioFormatException e) { - throw new ConfigurationException(e); + throw new ConfigurationException(e, inputFormat); } } @@ -562,7 +562,8 @@ public final class DefaultAudioSink implements AudioSink { Pair encodingAndChannelConfig = getEncodingAndChannelConfigForPassthrough(inputFormat, audioCapabilities); if (encodingAndChannelConfig == null) { - throw new ConfigurationException("Unable to configure passthrough for: " + inputFormat); + throw new ConfigurationException( + "Unable to configure passthrough for: " + inputFormat, inputFormat); } outputEncoding = encodingAndChannelConfig.first; outputChannelConfig = encodingAndChannelConfig.second; @@ -571,11 +572,12 @@ public final class DefaultAudioSink implements AudioSink { if (outputEncoding == C.ENCODING_INVALID) { throw new ConfigurationException( - "Invalid output encoding (mode=" + outputMode + ") for: " + inputFormat); + "Invalid output encoding (mode=" + outputMode + ") for: " + inputFormat, inputFormat); } if (outputChannelConfig == AudioFormat.CHANNEL_INVALID) { throw new ConfigurationException( - "Invalid output channel config (mode=" + outputMode + ") for: " + inputFormat); + "Invalid output channel config (mode=" + outputMode + ") for: " + inputFormat, + inputFormat); } offloadDisabledUntilNextConfiguration = false; 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 5825af56a6..752191300d 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 @@ -436,7 +436,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media try { audioSink.configure(audioSinkInputFormat, /* specifiedBufferSize= */ 0, channelMap); } catch (AudioSink.ConfigurationException e) { - throw createRendererException(e, format); + throw createRendererException(e, e.format); } } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/DefaultAudioSinkTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/DefaultAudioSinkTest.java index 2f86988d42..7b9e639cd6 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/DefaultAudioSinkTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/DefaultAudioSinkTest.java @@ -30,6 +30,7 @@ import com.google.android.exoplayer2.util.MimeTypes; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -307,6 +308,18 @@ public final class DefaultAudioSinkTest { .isEqualTo(CURRENT_POSITION_NOT_SET); } + @Test + public void configure_throwsConfigurationException_withInvalidInput() { + Format format = new Format.Builder().setSampleMimeType(MimeTypes.AUDIO_AAC).build(); + AudioSink.ConfigurationException thrown = + Assert.assertThrows( + AudioSink.ConfigurationException.class, + () -> + defaultAudioSink.configure( + format, /* specifiedBufferSize= */ 0, /* outputChannels= */ null)); + assertThat(thrown.format).isEqualTo(format); + } + private void configureDefaultAudioSink(int channelCount) throws AudioSink.ConfigurationException { configureDefaultAudioSink(channelCount, /* trimStartFrames= */ 0, /* trimEndFrames= */ 0); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java b/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java index d3423485fb..c8db4ebc5e 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/audio/MediaCodecAudioRendererTest.java @@ -236,7 +236,7 @@ public class MediaCodecAudioRendererTest { if (!format.equals(AUDIO_AAC)) { setPendingPlaybackException( ExoPlaybackException.createForRenderer( - new AudioSink.ConfigurationException("Test"), + new AudioSink.ConfigurationException("Test", format), "rendererName", /* rendererIndex= */ 0, format,