diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java index b1cb3daac6..ef093a2815 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecRenderer.java @@ -978,13 +978,27 @@ public abstract class MediaCodecRenderer extends BaseRenderer { DecoderInitializationException.NO_SUITABLE_DECODER_ERROR); } + MediaCodecInfo preferredCodecInfo = availableCodecInfos.peekFirst(); while (codec == null) { MediaCodecInfo codecInfo = availableCodecInfos.peekFirst(); if (!shouldInitCodec(codecInfo)) { return; } try { - initCodec(codecInfo, crypto); + try { + initCodec(codecInfo, crypto); + } catch (Exception e) { + if (codecInfo == preferredCodecInfo) { + // If creating the preferred decoder failed then sleep briefly before retrying. + // Workaround for [internal b/191966399]. + // See also https://github.com/google/ExoPlayer/issues/8696. + Log.w(TAG, "Preferred decoder instantiation failed. Sleeping for 50ms then retrying."); + Thread.sleep(/* millis= */ 50); + initCodec(codecInfo, crypto); + } else { + throw e; + } + } } catch (Exception e) { Log.w(TAG, "Failed to initialize decoder: " + codecInfo, e); // This codec failed to initialize, so fall back to the next codec in the list (if any). We @@ -1062,13 +1076,17 @@ public abstract class MediaCodecRenderer extends BaseRenderer { codecOperatingRate = CODEC_OPERATING_RATE_UNSET; } codecInitializingTimestamp = SystemClock.elapsedRealtime(); - TraceUtil.beginSection("createCodec:" + codecName); MediaCodecAdapter.Configuration configuration = getMediaCodecConfiguration(codecInfo, inputFormat, crypto, codecOperatingRate); if (Util.SDK_INT >= 31) { Api31.setLogSessionIdToMediaCodecFormat(configuration, getPlayerId()); } - codec = codecAdapterFactory.createAdapter(configuration); + try { + TraceUtil.beginSection("createCodec:" + codecName); + codec = codecAdapterFactory.createAdapter(configuration); + } finally { + TraceUtil.endSection(); + } codecInitializedTimestamp = SystemClock.elapsedRealtime(); this.codecInfo = codecInfo;