diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 908f7ea67e..994216172f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -47,6 +47,12 @@ * Remove `CastPlayer` specific playlist manipulation methods. Use `setMediaItems`, `addMediaItems`, `removeMediaItem` and `moveMediaItem` instead. +* Video: + * Fix bug that could cause `CodecException: Error 0xffffffff` to be thrown + from `MediaCodec.native_setSurface` in use cases that involve both + swapping the output `Surface` and a mixture of secure and non-secure + content being played + ([#8776](https://github.com/google/ExoPlayer/issues/8776)). * Ad playback: * Support changing ad break positions in the player logic ([#5067](https://github.com/google/ExoPlayer/issues/5067). @@ -66,7 +72,6 @@ * Keep subtitle language features embedded (e.g. rubies & tate-chu-yoko) in `Cue.text` even when `SubtitleView#setApplyEmbeddedStyles()` is false. -* UI * Fix `NullPointerException` in `StyledPlayerView` that could occur after calling `StyledPlayerView.setPlayer(null)` ([#8985](https://github.com/google/ExoPlayer/issues/8985)). 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 510e269e85..e1eb1da0ba 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 @@ -124,7 +124,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { private boolean codecHandlesHdr10PlusOutOfBandMetadata; @Nullable private Surface surface; - @Nullable private Surface dummySurface; + @Nullable private DummySurface dummySurface; private boolean haveReportedFirstFrameRenderedForCurrentSurface; @C.VideoScalingMode private int scalingMode; private boolean renderedFirstFrameAfterReset; @@ -486,6 +486,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { } } + @TargetApi(17) // Needed for dummySurface usage. dummySurface is always null on API level 16. @Override protected void onReset() { try { @@ -596,12 +597,18 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { return tunneling && Util.SDK_INT < 23; } + @TargetApi(17) // Needed for dummySurface usage. dummySurface is always null on API level 16. @Override protected MediaCodecAdapter.Configuration getMediaCodecConfiguration( MediaCodecInfo codecInfo, Format format, @Nullable MediaCrypto crypto, float codecOperatingRate) { + if (dummySurface != null && dummySurface.secure != codecInfo.secure) { + // We can't re-use the current DummySurface instance with the new decoder. + dummySurface.release(); + dummySurface = null; + } String codecMimeType = codecInfo.codecMimeType; codecMaxValues = getCodecMaxValues(codecInfo, format, getStreamFormats()); MediaFormat mediaFormat =