From 7830eb7ae52871c4c593ca0f19db50ba2f0bbe87 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 17 Feb 2021 12:57:36 +0000 Subject: [PATCH] Ensure non-fatal errors are logged to logcat. We already report these errors through callbacks to interested listeners. However, to ease debugging with bugreports and local error detection, it's helpful to also log these non-fatal execptions to logcat. Otherwise nothing in logcat indicates that the player recovered from an exception. Issue: #6384 PiperOrigin-RevId: 357923899 --- .../java/com/google/android/exoplayer2/audio/AudioSink.java | 5 +++++ .../android/exoplayer2/audio/DecoderAudioRenderer.java | 6 ++++++ .../android/exoplayer2/audio/MediaCodecAudioRenderer.java | 3 +++ .../google/android/exoplayer2/drm/DefaultDrmSession.java | 2 +- .../android/exoplayer2/drm/DefaultDrmSessionManager.java | 1 + .../java/com/google/android/exoplayer2/upstream/Loader.java | 6 +++--- .../android/exoplayer2/video/DecoderVideoRenderer.java | 5 +++++ .../android/exoplayer2/video/MediaCodecVideoRenderer.java | 1 + 8 files changed, 25 insertions(+), 4 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 e761924586..f2aa0d6d52 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 @@ -242,6 +242,11 @@ public interface AudioSink { */ public UnexpectedDiscontinuityException( long actualPresentationTimeUs, long expectedPresentationTimeUs) { + super( + "Unexpected audio track timestamp discontinuity: expected " + + expectedPresentationTimeUs + + ", got " + + actualPresentationTimeUs); this.actualPresentationTimeUs = actualPresentationTimeUs; this.expectedPresentationTimeUs = expectedPresentationTimeUs; } 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 f69ffcbb90..0f4ccbd56a 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 @@ -47,6 +47,7 @@ import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MediaClock; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.TraceUtil; @@ -82,6 +83,8 @@ public abstract class DecoderAudioRenderer< Decoder> extends BaseRenderer implements MediaClock { + private static final String TAG = "DecoderAudioRenderer"; + @Documented @Retention(RetentionPolicy.SOURCE) @IntDef({ @@ -300,6 +303,7 @@ public abstract class DecoderAudioRenderer< while (feedInputBuffer()) {} TraceUtil.endSection(); } catch (DecoderException e) { + Log.e(TAG, "Audio codec error", e); eventDispatcher.audioCodecError(e); throw createRendererException(e, inputFormat); } catch (AudioSink.ConfigurationException e) { @@ -620,6 +624,7 @@ public abstract class DecoderAudioRenderer< codecInitializedTimestamp - codecInitializingTimestamp); decoderCounters.decoderInitCount++; } catch (DecoderException e) { + Log.e(TAG, "Audio codec error", e); eventDispatcher.audioCodecError(e); throw createRendererException(e, inputFormat); } catch (OutOfMemoryError e) { @@ -739,6 +744,7 @@ public abstract class DecoderAudioRenderer< @Override public void onAudioSinkError(Exception audioSinkError) { + Log.e(TAG, "Audio sink error", audioSinkError); eventDispatcher.audioSinkError(audioSinkError); } } 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 82b65a1e0d..7d0f2585c1 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 @@ -49,6 +49,7 @@ import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecSelector; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil.DecoderQueryException; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MediaClock; import com.google.android.exoplayer2.util.MediaFormatUtil; import com.google.android.exoplayer2.util.MimeTypes; @@ -416,6 +417,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media @Override protected void onCodecError(Exception codecError) { + Log.e(TAG, "Audio codec error", codecError); eventDispatcher.audioCodecError(codecError); } @@ -853,6 +855,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media @Override public void onAudioSinkError(Exception audioSinkError) { + Log.e(TAG, "Audio sink error", audioSinkError); eventDispatcher.audioSinkError(audioSinkError); } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java index f7d7a097a0..037ce49171 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSession.java @@ -446,7 +446,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; mediaDrm.restoreKeys(sessionId, offlineLicenseKeySetId); return true; } catch (Exception e) { - Log.e(TAG, "Error trying to restore keys.", e); onError(e); } return false; @@ -522,6 +521,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; private void onError(final Exception e) { lastException = new DrmSessionException(e); + Log.e(TAG, "DRM session error", e); dispatchEvent(eventDispatcher -> eventDispatcher.drmSessionManagerError(e)); if (state != STATE_OPENED_WITH_KEYS) { state = STATE_ERROR; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java index d24d5ce847..10d6accc51 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/drm/DefaultDrmSessionManager.java @@ -489,6 +489,7 @@ public class DefaultDrmSessionManager implements DrmSessionManager { schemeDatas = getSchemeDatas(Assertions.checkNotNull(format.drmInitData), uuid, false); if (schemeDatas.isEmpty()) { final MissingSchemeDataException error = new MissingSchemeDataException(uuid); + Log.e(TAG, "DRM error", error); if (eventDispatcher != null) { eventDispatcher.drmSessionManagerError(error); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/Loader.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/Loader.java index e9509f4218..f2595765c5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/Loader.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/Loader.java @@ -435,24 +435,24 @@ public final class Loader implements LoaderErrorThrower { } } catch (Exception e) { // This should never happen, but handle it anyway. - Log.e(TAG, "Unexpected exception loading stream", e); if (!released) { + Log.e(TAG, "Unexpected exception loading stream", e); obtainMessage(MSG_IO_EXCEPTION, new UnexpectedLoaderException(e)).sendToTarget(); } } catch (OutOfMemoryError e) { // This can occur if a stream is malformed in a way that causes an extractor to think it // needs to allocate a large amount of memory. We don't want the process to die in this // case, but we do want the playback to fail. - Log.e(TAG, "OutOfMemory error loading stream", e); if (!released) { + Log.e(TAG, "OutOfMemory error loading stream", e); obtainMessage(MSG_IO_EXCEPTION, new UnexpectedLoaderException(e)).sendToTarget(); } } catch (Error e) { // We'd hope that the platform would shut down the process if an Error is thrown here, but // the executor may catch the error (b/20616433). Throw it here, but also pass and throw it // from the handler thread so the process dies even if the executor behaves in this way. - Log.e(TAG, "Unexpected error loading stream", e); if (!released) { + Log.e(TAG, "Unexpected error loading stream", e); obtainMessage(MSG_FATAL_ERROR, e).sendToTarget(); } throw e; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java index 311f2747fe..894dd6bf4c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/DecoderVideoRenderer.java @@ -43,6 +43,7 @@ import com.google.android.exoplayer2.drm.DrmSession.DrmSessionException; import com.google.android.exoplayer2.drm.ExoMediaCrypto; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.TimedValueQueue; import com.google.android.exoplayer2.util.TraceUtil; import com.google.android.exoplayer2.video.VideoRendererEventListener.EventDispatcher; @@ -69,6 +70,8 @@ import java.lang.annotation.RetentionPolicy; */ public abstract class DecoderVideoRenderer extends BaseRenderer { + private static final String TAG = "DecoderVideoRenderer"; + /** Decoder reinitialization states. */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -206,6 +209,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { while (feedInputBuffer()) {} TraceUtil.endSection(); } catch (DecoderException e) { + Log.e(TAG, "Video codec error", e); eventDispatcher.videoCodecError(e); throw createRendererException(e, inputFormat); } @@ -709,6 +713,7 @@ public abstract class DecoderVideoRenderer extends BaseRenderer { decoderInitializedTimestamp - decoderInitializingTimestamp); decoderCounters.decoderInitCount++; } catch (DecoderException e) { + Log.e(TAG, "Video codec error", e); eventDispatcher.videoCodecError(e); throw createRendererException(e, inputFormat); } catch (OutOfMemoryError e) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 561055d6a2..9d544008cc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -692,6 +692,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { @Override protected void onCodecError(Exception codecError) { + Log.e(TAG, "Video codec error", codecError); eventDispatcher.videoCodecError(codecError); }