From 2ed1deb52d2632c9d7f620be7d1d4172fa55d561 Mon Sep 17 00:00:00 2001 From: claincly Date: Wed, 26 Jan 2022 13:32:30 +0000 Subject: [PATCH] Apply suggested AVC profile depending on the API version. PiperOrigin-RevId: 424322341 --- .../transformer/DefaultCodecFactory.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodecFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodecFactory.java index 0c7c1040a6..8089f851a9 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodecFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultCodecFactory.java @@ -32,6 +32,7 @@ import androidx.media3.common.Format; import androidx.media3.common.MimeTypes; import androidx.media3.common.util.MediaFormatUtil; import androidx.media3.common.util.TraceUtil; +import androidx.media3.common.util.Util; import androidx.media3.exoplayer.mediacodec.MediaCodecUtil; import java.io.IOException; import java.util.List; @@ -123,9 +124,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; format = getVideoEncoderSupportedFormat(format, allowedMimeTypes); - MediaFormat mediaFormat = - MediaFormat.createVideoFormat( - checkNotNull(format.sampleMimeType), format.width, format.height); + String mimeType = checkNotNull(format.sampleMimeType); + MediaFormat mediaFormat = MediaFormat.createVideoFormat(mimeType, format.width, format.height); mediaFormat.setFloat(MediaFormat.KEY_FRAME_RATE, format.frameRate); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, format.averageBitrate); @@ -138,6 +138,29 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } } + // TODO(b/210593256): Remove overriding profile/level (before API 29) after switching to in-app + // muxing. + if (mimeType.equals(MimeTypes.VIDEO_H264)) { + // Applying suggested profile/level settings from + // https://developer.android.com/guide/topics/media/sharing-video#b-frames_and_encoding_profiles + if (Util.SDK_INT >= 29) { + // Use the highest supported profile and use B-frames. + mediaFormat.setInteger( + MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh); + mediaFormat.setInteger(MediaFormat.KEY_MAX_B_FRAMES, 1); + } else if (Util.SDK_INT >= 26) { + // Use the highest-supported profile, but disable the generation of B-frames. This + // accommodates some limitations in the MediaMuxer in these system versions. + mediaFormat.setInteger( + MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileHigh); + mediaFormat.setInteger(MediaFormat.KEY_LATENCY, 1); + } else { + // Use the baseline profile for safest results. + mediaFormat.setInteger( + MediaFormat.KEY_PROFILE, MediaCodecInfo.CodecProfileLevel.AVCProfileBaseline); + } + } + mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, DEFAULT_COLOR_FORMAT); mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, DEFAULT_I_FRAME_INTERVAL_SECS);