Skip to content

Commit

Permalink
Implement device based encoder bitrate mapping.
Browse files Browse the repository at this point in the history
This feature is disabled by default for now.

PiperOrigin-RevId: 458932471
  • Loading branch information
Samrobbo authored and rohitjoins committed Jul 7, 2022
1 parent 486c350 commit d5b02e7
Show file tree
Hide file tree
Showing 3 changed files with 1,926 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public static final class Builder {
@Nullable private EncoderSelector encoderSelector;
@Nullable private VideoEncoderSettings requestedVideoEncoderSettings;
private boolean enableFallback;
private boolean automaticQualityAdjustment;

/** Creates a new {@link Builder}. */
public Builder(Context context) {
Expand All @@ -74,10 +75,18 @@ public Builder setVideoEncoderSelector(EncoderSelector encoderSelector) {
/**
* Sets the requested {@link VideoEncoderSettings}.
*
* <p>Values in {@code requestedVideoEncoderSettings} could be adjusted to improve encoding
* quality and/or reduce failures. Specifically, {@link VideoEncoderSettings#profile} and {@link
* VideoEncoderSettings#level} are ignored for {@link MimeTypes#VIDEO_H264}. Consider
* implementing {@link Codec.EncoderFactory} if such adjustments are unwanted.
* <p>Values in {@code requestedVideoEncoderSettings} may be ignored to improve encoding quality
* and/or reduce failures.
*
* <ul>
* <li>{@link VideoEncoderSettings#bitrate} is ignored if {@link
* Builder#setAutomaticQualityAdjustment(boolean)} is enabled and {@link
* VideoEncoderSettings#bitrateMode} is VBR.
* <li>{@link VideoEncoderSettings#profile} and {@link VideoEncoderSettings#level} are ignored
* for {@link MimeTypes#VIDEO_H264}
* </ul>
*
* <p>Consider implementing {@link Codec.EncoderFactory} if such adjustments are unwanted.
*
* <p>{@code requestedVideoEncoderSettings} should be handled with care because there is no
* fallback support for it. For example, using incompatible {@link VideoEncoderSettings#profile}
Expand Down Expand Up @@ -108,8 +117,19 @@ public Builder setEnableFallback(boolean enableFallback) {
return this;
}

/**
* Sets whether to use automatic quality adjustment.
*
* <p>With this enabled, encoders are configured to output high quality video.
*
* <p>Default value is {@code false}.
*/
public Builder setAutomaticQualityAdjustment(boolean automaticQualityAdjustment) {
this.automaticQualityAdjustment = automaticQualityAdjustment;
return this;
}

/** Creates an instance of {@link DefaultEncoderFactory}, using defaults if values are unset. */
@SuppressWarnings("deprecation")
public DefaultEncoderFactory build() {
if (encoderSelector == null) {
encoderSelector = EncoderSelector.DEFAULT;
Expand All @@ -118,14 +138,19 @@ public DefaultEncoderFactory build() {
requestedVideoEncoderSettings = VideoEncoderSettings.DEFAULT;
}
return new DefaultEncoderFactory(
context, encoderSelector, requestedVideoEncoderSettings, enableFallback);
context,
encoderSelector,
requestedVideoEncoderSettings,
enableFallback,
automaticQualityAdjustment);
}
}

private final Context context;
private final EncoderSelector videoEncoderSelector;
private final VideoEncoderSettings requestedVideoEncoderSettings;
private final boolean enableFallback;
private final boolean automaticQualityAdjustment;

/**
* @deprecated Use {@link Builder} instead.
Expand Down Expand Up @@ -155,10 +180,25 @@ public DefaultEncoderFactory(
EncoderSelector videoEncoderSelector,
VideoEncoderSettings requestedVideoEncoderSettings,
boolean enableFallback) {
this(
context,
videoEncoderSelector,
requestedVideoEncoderSettings,
enableFallback,
/* automaticQualityAdjustment= */ false);
}

private DefaultEncoderFactory(
Context context,
EncoderSelector videoEncoderSelector,
VideoEncoderSettings requestedVideoEncoderSettings,
boolean enableFallback,
boolean automaticQualityAdjustment) {
this.context = context;
this.videoEncoderSelector = videoEncoderSelector;
this.requestedVideoEncoderSettings = requestedVideoEncoderSettings;
this.enableFallback = enableFallback;
this.automaticQualityAdjustment = automaticQualityAdjustment;
}

@Override
Expand Down Expand Up @@ -232,12 +272,20 @@ public Codec createForVideoEncoding(Format format, List<String> allowedMimeTypes
String mimeType = checkNotNull(format.sampleMimeType);
MediaFormat mediaFormat = MediaFormat.createVideoFormat(mimeType, format.width, format.height);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, round(format.frameRate));
mediaFormat.setInteger(
MediaFormat.KEY_BIT_RATE,
supportedVideoEncoderSettings.bitrate != VideoEncoderSettings.NO_VALUE
? supportedVideoEncoderSettings.bitrate
: getSuggestedBitrate(format.width, format.height, format.frameRate));

int bitrate;
if (automaticQualityAdjustment) {
bitrate =
new DeviceMappedEncoderBitrateProvider()
.getBitrate(
encoderInfo.getName(), format.width, format.height, round(format.frameRate));
} else if (supportedVideoEncoderSettings.bitrate != VideoEncoderSettings.NO_VALUE) {
bitrate = supportedVideoEncoderSettings.bitrate;
} else {
bitrate = getSuggestedBitrate(format.width, format.height, format.frameRate);
}

mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate);
mediaFormat.setInteger(MediaFormat.KEY_BITRATE_MODE, supportedVideoEncoderSettings.bitrateMode);

if (supportedVideoEncoderSettings.profile != VideoEncoderSettings.NO_VALUE
Expand Down
Loading

0 comments on commit d5b02e7

Please sign in to comment.