From f1cf3d98d8c6f5324c2f27f6b7b775255c8b99ce Mon Sep 17 00:00:00 2001 From: samrobinson Date: Thu, 26 Nov 2020 14:20:22 +0000 Subject: [PATCH] Add Format field to AudioSink.WriteException. #exofixit PiperOrigin-RevId: 344414313 --- .../google/android/exoplayer2/audio/AudioSink.java | 13 +++++++++++-- .../exoplayer2/audio/DecoderAudioRenderer.java | 6 +++--- .../android/exoplayer2/audio/DefaultAudioSink.java | 2 +- .../exoplayer2/audio/MediaCodecAudioRenderer.java | 4 +--- .../audio/MediaCodecAudioRendererTest.java | 4 +++- 5 files changed, 19 insertions(+), 10 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 c747fd06f7..1cbfde0bca 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 @@ -214,12 +214,21 @@ public interface AudioSink { public final int errorCode; /** If the exception can be recovered by recreating the sink. */ public final boolean isRecoverable; + /** The input {@link Format} of the sink when the error occurs. */ + public final Format format; - /** @param errorCode The error value returned from the sink implementation. */ - public WriteException(int errorCode, boolean isRecoverable) { + /** + * Creates an instance. + * + * @param errorCode The error value returned from the sink implementation. + * @param format The input format of the sink when the error occurs. + * @param isRecoverable Whether the exception can be recovered by recreating the sink. + */ + public WriteException(int errorCode, Format format, boolean isRecoverable) { super("AudioTrack write failed: " + errorCode); this.isRecoverable = isRecoverable; this.errorCode = errorCode; + this.format = format; } } 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 ea523714d9..dbf585c2b2 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 @@ -261,7 +261,7 @@ public abstract class DecoderAudioRenderer< try { audioSink.playToEndOfStream(); } catch (AudioSink.WriteException e) { - throw createRendererException(e, inputFormat, e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } return; } @@ -307,7 +307,7 @@ public abstract class DecoderAudioRenderer< } catch (AudioSink.InitializationException e) { throw createRendererException(e, e.format, e.isRecoverable); } catch (AudioSink.WriteException e) { - throw createRendererException(e, inputFormat, e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } decoderCounters.ensureUpdated(); } @@ -395,7 +395,7 @@ public abstract class DecoderAudioRenderer< try { processEndOfStream(); } catch (AudioSink.WriteException e) { - throw createRendererException(e, getOutputFormat(decoder), e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } } return false; 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 fd9d5fd943..145c92e94d 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 @@ -952,7 +952,7 @@ public final class DefaultAudioSink implements AudioSink { if (isRecoverable) { maybeDisableOffload(); } - WriteException e = new WriteException(error, isRecoverable); + WriteException e = new WriteException(error, configuration.inputFormat, isRecoverable); if (listener != null) { listener.onAudioSinkError(e); } 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 f9701f6b8e..eb3010b4ea 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 @@ -629,9 +629,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media try { audioSink.playToEndOfStream(); } catch (AudioSink.WriteException e) { - @Nullable Format outputFormat = getOutputFormat(); - throw createRendererException( - e, outputFormat != null ? outputFormat : getInputFormat(), e.isRecoverable); + throw createRendererException(e, e.format, e.isRecoverable); } } 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 c8db4ebc5e..f90562e2ab 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 @@ -310,7 +310,9 @@ public class MediaCodecAudioRendererTest { verify(audioSink, atLeastOnce()).setListener(listenerCaptor.capture()); AudioSink.Listener audioSinkListener = listenerCaptor.getValue(); - Exception error = new AudioSink.WriteException(/* errorCode= */ 1, /* isRecoverable= */ true); + Exception error = + new AudioSink.WriteException( + /* errorCode= */ 1, new Format.Builder().build(), /* isRecoverable= */ true); audioSinkListener.onAudioSinkError(error); shadowOf(Looper.getMainLooper()).idle();