From fd3d8e1782bc74c23b545c3f24c25924d188f822 Mon Sep 17 00:00:00 2001 From: claincly Date: Wed, 18 Sep 2024 03:37:30 -0700 Subject: [PATCH] Add RATE_UNSET option to encoder performance setting This is to allow not setting the MediaFormat OPERATING_RATE and PRIORITY altogether. The current behvaiour, if left the value `UNSET`, it'll apply the our optimizations, but apps might want to disable this optimization. PiperOrigin-RevId: 675923909 --- .../transformer/DefaultEncoderFactory.java | 19 +++++++++++-------- .../transformer/VideoEncoderSettings.java | 10 ++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) 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 e349cb1d8a..587ed3a1be 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultEncoderFactory.java @@ -351,18 +351,21 @@ public final class DefaultEncoderFactory implements Codec.EncoderFactory { : (int) floor(iFrameIntervalSeconds)); } - if (Util.SDK_INT >= 23) { + int operatingRate = supportedVideoEncoderSettings.operatingRate; + int priority = supportedVideoEncoderSettings.priority; + if (Util.SDK_INT >= 23 + && operatingRate != VideoEncoderSettings.RATE_UNSET + && priority != VideoEncoderSettings.RATE_UNSET) { // Setting operating rate and priority is supported from API 23. - if (supportedVideoEncoderSettings.operatingRate == VideoEncoderSettings.NO_VALUE - && supportedVideoEncoderSettings.priority == VideoEncoderSettings.NO_VALUE) { + if (operatingRate == VideoEncoderSettings.NO_VALUE + && priority == VideoEncoderSettings.NO_VALUE) { adjustMediaFormatForEncoderPerformanceSettings(mediaFormat); } else { - if (supportedVideoEncoderSettings.operatingRate != VideoEncoderSettings.NO_VALUE) { - mediaFormat.setInteger( - MediaFormat.KEY_OPERATING_RATE, supportedVideoEncoderSettings.operatingRate); + if (operatingRate != VideoEncoderSettings.NO_VALUE) { + mediaFormat.setInteger(MediaFormat.KEY_OPERATING_RATE, operatingRate); } - if (supportedVideoEncoderSettings.priority != VideoEncoderSettings.NO_VALUE) { - mediaFormat.setInteger(MediaFormat.KEY_PRIORITY, supportedVideoEncoderSettings.priority); + if (priority != VideoEncoderSettings.NO_VALUE) { + mediaFormat.setInteger(MediaFormat.KEY_PRIORITY, priority); } } } diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java index e769fe29e0..932f93133f 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/VideoEncoderSettings.java @@ -43,6 +43,12 @@ public final class VideoEncoderSettings { /** A value for various fields to indicate that the field's value is unknown or not applicable. */ public static final int NO_VALUE = Format.NO_VALUE; + /** + * A value for {@link Builder#setEncoderPerformanceParameters(int, int)} to disable setting + * performance parameters. + */ + public static final int RATE_UNSET = NO_VALUE - 1; + /** The default I-frame interval in seconds. */ public static final float DEFAULT_I_FRAME_INTERVAL_SECONDS = 1.0f; @@ -168,6 +174,9 @@ public final class VideoEncoderSettings { * Sets encoding operating rate and priority. The default values are {@link #NO_VALUE}, which is * treated as configuring the encoder for maximum throughput. * + *

To disable the configuration for operating rate and priority, use {@link #RATE_UNSET} for + * both arguments. + * * @param operatingRate The {@link MediaFormat#KEY_OPERATING_RATE operating rate} in frames per * second. * @param priority The {@link MediaFormat#KEY_PRIORITY priority}. @@ -176,6 +185,7 @@ public final class VideoEncoderSettings { @CanIgnoreReturnValue @VisibleForTesting public Builder setEncoderPerformanceParameters(int operatingRate, int priority) { + checkArgument((operatingRate == RATE_UNSET) == (priority == RATE_UNSET)); this.operatingRate = operatingRate; this.priority = priority; return this;