diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java index 4e21df41783..adbc7381208 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java @@ -29,6 +29,7 @@ import android.content.Context; import android.media.MediaCodecInfo; import android.media.MediaFormat; +import android.os.Build; import android.util.Pair; import android.util.Size; import androidx.annotation.Nullable; @@ -518,16 +519,21 @@ private static void adjustMediaFormatForEncoderPerformanceSettings(MediaFormat m if (Util.SDK_INT == 26) { mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, DEFAULT_FRAME_RATE); - } else if (Util.SDK_INT <= 34) { - // On some devices setting Integer.MAX_VALUE will cause the encoder to throw at configuration - // time. Setting the operating to 1000 avoids being close to an integer overflow limit while - // being higher than a maximum feasible operating rate. See [internal b/311206113]. + } else if (deviceNeedsLowerOperatingRateAvoidingOverflowWorkaround()) { mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, 1000); } else { mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, Integer.MAX_VALUE); } } + private static boolean deviceNeedsLowerOperatingRateAvoidingOverflowWorkaround() { + // On this chipset, setting an operating rate close to Integer.MAX_VALUE will cause the encoder + // to throw at configuration time. Setting the operating rate to 1000 avoids being close to an + // integer overflow limit while being higher than a maximum feasible operating rate. See + // [internal b/311206113]. + return Util.SDK_INT >= 31 && Util.SDK_INT <= 34 && Build.SOC_MODEL.equals("SM8550"); + } + /** * Applying suggested profile/level settings from * https://developer.android.com/guide/topics/media/sharing-video#b-frames_and_encoding_profiles diff --git a/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java b/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java index e50344aaadf..733bea1da09 100644 --- a/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java +++ b/libraries/transformer/src/test/java/androidx/media3/transformer/DefaultEncoderFactoryTest.java @@ -231,7 +231,8 @@ public void createForVideoEncoding_withFallbackOnAndUnsupportedResolution_config assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_PRIORITY)).isTrue(); assertThat(configurationMediaFormat.getInteger(MediaFormat.KEY_PRIORITY)).isEqualTo(1); assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_OPERATING_RATE)).isTrue(); - assertThat(configurationMediaFormat.getInteger(MediaFormat.KEY_OPERATING_RATE)).isEqualTo(1000); + assertThat(configurationMediaFormat.getInteger(MediaFormat.KEY_OPERATING_RATE)) + .isEqualTo(Integer.MAX_VALUE); } @Test