From 910b6ab88401a3efcd226cdbbfdb0936bddbb65b Mon Sep 17 00:00:00 2001 From: dancho Date: Thu, 24 Apr 2025 08:37:32 -0700 Subject: [PATCH] Do not flush c2.mtk decoders when outputting to a videoSink Flushing a c2.mtk decoder that outputs to a SurfaceTexture often fails and leaves the SurfaceTexture's BufferQueue in an unrecoverable state. Release the codec instead. PiperOrigin-RevId: 751006875 --- .../exoplayer/video/MediaCodecVideoRenderer.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java index c614ab2a4e..4cc4bcec1c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java @@ -2473,6 +2473,22 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer } } + @Override + protected boolean flushOrReleaseCodec() { + MediaCodecInfo codecInfo = getCodecInfo(); + if (videoSink != null + && codecInfo != null + && (codecInfo.name.equals("c2.mtk.avc.decoder") + || codecInfo.name.equals("c2.mtk.hevc.decoder"))) { + // Flushing a c2.mtk decoder that outputs to a SurfaceTexture often fails and leaves + // the SurfaceTexture's BufferQueue in an unrecoverable state. Release the codec instead. + // See b/362904942 for more details. + releaseCodec(); + return true; + } + return super.flushOrReleaseCodec(); + } + /** * Returns whether the device is known to do post processing by default that isn't compatible with * ExoPlayer.