Revert DefaultEncoderFactory to previous defaults

Also changed encoder factory to not set operating rate or priority if they equal `RATE_UNSET` rather than `NO_VALUE`

PiperOrigin-RevId: 725964682
This commit is contained in:
Googler 2025-02-12 02:09:56 -08:00 committed by Copybara-Service
parent 75607ac1eb
commit 1310496809
3 changed files with 100 additions and 13 deletions

View File

@ -370,18 +370,16 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
int operatingRate = supportedVideoEncoderSettings.operatingRate; int operatingRate = supportedVideoEncoderSettings.operatingRate;
int priority = supportedVideoEncoderSettings.priority; int priority = supportedVideoEncoderSettings.priority;
if (Util.SDK_INT >= 23 // Setting operating rate and priority is supported from API 23.
&& operatingRate != VideoEncoderSettings.RATE_UNSET if (Util.SDK_INT >= 23) {
&& priority != VideoEncoderSettings.RATE_UNSET) {
// Setting operating rate and priority is supported from API 23.
if (operatingRate == VideoEncoderSettings.NO_VALUE if (operatingRate == VideoEncoderSettings.NO_VALUE
&& priority == VideoEncoderSettings.NO_VALUE) { && priority == VideoEncoderSettings.NO_VALUE) {
adjustMediaFormatForEncoderPerformanceSettings(mediaFormat); adjustMediaFormatForEncoderPerformanceSettings(mediaFormat);
} else { } else {
if (operatingRate != VideoEncoderSettings.NO_VALUE) { if (operatingRate != VideoEncoderSettings.RATE_UNSET) {
mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, operatingRate); mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, operatingRate);
} }
if (priority != VideoEncoderSettings.NO_VALUE) { if (priority != VideoEncoderSettings.RATE_UNSET) {
mediaFormat.setInteger(MediaFormat.KEY_PRIORITY, priority); mediaFormat.setInteger(MediaFormat.KEY_PRIORITY, priority);
} }
} }
@ -651,7 +649,7 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
* *
* <p>The adjustment is applied in-place to {@code mediaFormat}. * <p>The adjustment is applied in-place to {@code mediaFormat}.
*/ */
static void adjustMediaFormatForEncoderPerformanceSettings(MediaFormat mediaFormat) { private static void adjustMediaFormatForEncoderPerformanceSettings(MediaFormat mediaFormat) {
if (Util.SDK_INT < 25) { if (Util.SDK_INT < 25) {
// Not setting priority and operating rate achieves better encoding performance. // Not setting priority and operating rate achieves better encoding performance.
return; return;
@ -661,11 +659,29 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory {
if (Util.SDK_INT == 26) { if (Util.SDK_INT == 26) {
mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, DEFAULT_FRAME_RATE); mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, DEFAULT_FRAME_RATE);
} else if (deviceNeedsLowerOperatingRateAvoidingOverflowWorkaround()) {
mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, 1000);
} else { } else {
mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, /* value= */ 1000); mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, Integer.MAX_VALUE);
} }
} }
private static boolean deviceNeedsLowerOperatingRateAvoidingOverflowWorkaround() {
// On these chipsets, 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, b/317297946, b/312299527].
return Util.SDK_INT >= 31
&& Util.SDK_INT <= 34
&& (Build.SOC_MODEL.equals("SM8550")
|| Build.SOC_MODEL.equals("SM7450")
|| Build.SOC_MODEL.equals("SM6450")
|| Build.SOC_MODEL.equals("SC9863A")
|| Build.SOC_MODEL.equals("T612")
|| Build.SOC_MODEL.equals("T606")
|| Build.SOC_MODEL.equals("T603"));
}
/** /**
* Applying suggested profile settings from * Applying suggested profile settings from
* https://developer.android.com/media/optimize/sharing#b-frames_and_encoding_profiles * https://developer.android.com/media/optimize/sharing#b-frames_and_encoding_profiles

View File

@ -174,8 +174,8 @@ public final class VideoEncoderSettings {
* Sets encoding operating rate and priority. The default values are {@link #NO_VALUE}, which is * Sets encoding operating rate and priority. The default values are {@link #NO_VALUE}, which is
* treated as configuring the encoder for maximum throughput. * treated as configuring the encoder for maximum throughput.
* *
* <p>To disable the configuration for operating rate and priority, use {@link #RATE_UNSET} for * <p>To disable the configuration for either operating rate or priority, use {@link
* both arguments. * #RATE_UNSET} for that argument.
* *
* @param operatingRate The {@link MediaFormat#KEY_OPERATING_RATE operating rate} in frames per * @param operatingRate The {@link MediaFormat#KEY_OPERATING_RATE operating rate} in frames per
* second. * second.
@ -185,7 +185,6 @@ public final class VideoEncoderSettings {
@CanIgnoreReturnValue @CanIgnoreReturnValue
@VisibleForTesting @VisibleForTesting
public Builder setEncoderPerformanceParameters(int operatingRate, int priority) { public Builder setEncoderPerformanceParameters(int operatingRate, int priority) {
checkArgument((operatingRate == RATE_UNSET) == (priority == RATE_UNSET));
this.operatingRate = operatingRate; this.operatingRate = operatingRate;
this.priority = priority; this.priority = priority;
return this; return this;

View File

@ -234,7 +234,7 @@ public class DefaultEncoderFactoryTest {
@Config(sdk = 29) @Config(sdk = 29)
@Test @Test
public void public void
createForVideoEncoding_withH264Encoding_configuresEncoderWithCorrectPerformanceSettings() createForVideoEncoding_withH264EncodingOnApi31_configuresEncoderWithCorrectPerformanceSettings()
throws Exception { throws Exception {
Format requestedVideoFormat = createVideoFormat(MimeTypes.VIDEO_H264, 1920, 1080, 30); Format requestedVideoFormat = createVideoFormat(MimeTypes.VIDEO_H264, 1920, 1080, 30);
Codec videoEncoder = Codec videoEncoder =
@ -248,7 +248,79 @@ public class DefaultEncoderFactoryTest {
assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_PRIORITY)).isTrue(); assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_PRIORITY)).isTrue();
assertThat(configurationMediaFormat.getInteger(MediaFormat.KEY_PRIORITY)).isEqualTo(1); assertThat(configurationMediaFormat.getInteger(MediaFormat.KEY_PRIORITY)).isEqualTo(1);
assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_OPERATING_RATE)).isTrue(); 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);
}
@Config(sdk = 31)
@Test
public void
createForVideoEncoding_withH264EncodingOnApi29AndConservativeDefault_configuresEncoderWithCorrectPerformanceSettings()
throws Exception {
Format requestedVideoFormat = createVideoFormat(MimeTypes.VIDEO_H264, 1920, 1080, 30);
Codec videoEncoder =
new DefaultEncoderFactory.Builder(context)
.setRequestedVideoEncoderSettings(
new VideoEncoderSettings.Builder()
.setEncoderPerformanceParameters(/* operatingRate= */ -1, /* priority= */ 1)
.build())
.build()
.createForVideoEncoding(requestedVideoFormat);
assertThat(videoEncoder).isInstanceOf(DefaultCodec.class);
MediaFormat configurationMediaFormat =
((DefaultCodec) videoEncoder).getConfigurationMediaFormat();
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(-1);
}
@Config(sdk = 31)
@Test
public void
createForVideoEncoding_withOperatingRateUnset_configuresEncoderWithCorrectPerformanceSettings()
throws Exception {
Format requestedVideoFormat = createVideoFormat(MimeTypes.VIDEO_H264, 1920, 1080, 30);
Codec videoEncoder =
new DefaultEncoderFactory.Builder(context)
.setRequestedVideoEncoderSettings(
new VideoEncoderSettings.Builder()
.setEncoderPerformanceParameters(
/* operatingRate= */ VideoEncoderSettings.RATE_UNSET, /* priority= */ 1)
.build())
.build()
.createForVideoEncoding(requestedVideoFormat);
assertThat(videoEncoder).isInstanceOf(DefaultCodec.class);
MediaFormat configurationMediaFormat =
((DefaultCodec) videoEncoder).getConfigurationMediaFormat();
assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_PRIORITY)).isTrue();
assertThat(configurationMediaFormat.getInteger(MediaFormat.KEY_PRIORITY)).isEqualTo(1);
assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_OPERATING_RATE)).isFalse();
}
@Config(sdk = 31)
@Test
public void
createForVideoEncoding_withOperatingRatePriorityUnset_configuresEncoderWithCorrectPerformanceSettings()
throws Exception {
Format requestedVideoFormat = createVideoFormat(MimeTypes.VIDEO_H264, 1920, 1080, 30);
Codec videoEncoder =
new DefaultEncoderFactory.Builder(context)
.setRequestedVideoEncoderSettings(
new VideoEncoderSettings.Builder()
.setEncoderPerformanceParameters(
VideoEncoderSettings.RATE_UNSET, VideoEncoderSettings.RATE_UNSET)
.build())
.build()
.createForVideoEncoding(requestedVideoFormat);
assertThat(videoEncoder).isInstanceOf(DefaultCodec.class);
MediaFormat configurationMediaFormat =
((DefaultCodec) videoEncoder).getConfigurationMediaFormat();
assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_PRIORITY)).isFalse();
assertThat(configurationMediaFormat.containsKey(MediaFormat.KEY_OPERATING_RATE)).isFalse();
} }
@Test @Test