Ensure supported request only updates changes fields.

The TransformationRequest passed to FallbackListener (and
createSupportedTransformationRequest) can have null for values that
are inferred from source. Within fallback, this can be height, width,
video mime type and audio mime type (HDR mode is not linked to source).
requestedFormat has these values populated from source, and
supportedFormat then finds the closest supported values to the
requested.

If any of the values in supportedFormat do not match the
requestedFormat, then this method would build upon the
TransformationRequest and update ALL possible fallback fields. This is
a problem because the fallback listener compares the original request
to the fallback one and notifies about all the fields that have
changed.

This CL changes this so that only the values that are not the same as
requested are changed in the supported request that is given to the
fallback listener.

PiperOrigin-RevId: 496908492
This commit is contained in:
samrobinson 2022-12-21 14:39:22 +00:00 committed by Tianyi Feng
parent cad713d0a3
commit 59166cce9c

View File

@ -348,19 +348,25 @@ import org.checkerframework.dataflow.qual.Pure;
Format supportedFormat,
@TransformationRequest.HdrMode int supportedHdrMode) {
// TODO(b/259570024): Consider including bitrate in the revised fallback design.
if (transformationRequest.hdrMode == supportedHdrMode
&& Util.areEqual(requestedFormat.sampleMimeType, supportedFormat.sampleMimeType)
&& (hasOutputFormatRotation
? requestedFormat.width == supportedFormat.width
: requestedFormat.height == supportedFormat.height)) {
return transformationRequest;
TransformationRequest.Builder supportedRequestBuilder = transformationRequest.buildUpon();
if (transformationRequest.hdrMode != supportedHdrMode) {
supportedRequestBuilder.setHdrMode(supportedHdrMode);
}
return transformationRequest
.buildUpon()
.setVideoMimeType(supportedFormat.sampleMimeType)
.setResolution(hasOutputFormatRotation ? requestedFormat.width : requestedFormat.height)
.setHdrMode(supportedHdrMode)
.build();
if (!Util.areEqual(requestedFormat.sampleMimeType, supportedFormat.sampleMimeType)) {
supportedRequestBuilder.setVideoMimeType(supportedFormat.sampleMimeType);
}
if (hasOutputFormatRotation) {
if (requestedFormat.width != supportedFormat.width) {
supportedRequestBuilder.setResolution(/* outputHeight= */ supportedFormat.width);
}
} else if (requestedFormat.height != supportedFormat.height) {
supportedRequestBuilder.setResolution(supportedFormat.height);
}
return supportedRequestBuilder.build();
}
private static boolean deviceNeedsNoToneMappingWorkaround() {