Transformer GL: Avoid no-op ScaleToFit / Presentation FrameProcessors

Avoid no-op FrameProcessors in VideoTranscodingSamplePipeline, to avoid
creating resources for and executing GL for a no-op vertex+fragment shader.

EncoderCompatibilityFrameProcessor will still always be exercised.

PiperOrigin-RevId: 443675833
This commit is contained in:
huangdarwin 2022-04-22 16:44:23 +01:00 committed by Ian Baker
parent 59ced5325c
commit 36d190bb66

View File

@ -22,6 +22,7 @@ import android.content.Context;
import android.media.MediaCodec; import android.media.MediaCodec;
import android.util.Size; import android.util.Size;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.media3.common.C;
import androidx.media3.common.Format; import androidx.media3.common.Format;
import androidx.media3.common.util.Util; import androidx.media3.common.util.Util;
import androidx.media3.decoder.DecoderInputBuffer; import androidx.media3.decoder.DecoderInputBuffer;
@ -70,31 +71,33 @@ import org.checkerframework.dataflow.qual.Pure;
int decodedHeight = int decodedHeight =
(inputFormat.rotationDegrees % 180 == 0) ? inputFormat.height : inputFormat.width; (inputFormat.rotationDegrees % 180 == 0) ? inputFormat.height : inputFormat.width;
// TODO(b/213190310): Don't create a ScaleToFitFrameProcessor if scale and rotation are unset, ImmutableList.Builder<GlFrameProcessor> frameProcessorsListBuilder =
// and don't create a PresentationFrameProcessor if resolution is unset. new ImmutableList.Builder<GlFrameProcessor>().addAll(frameProcessors);
ScaleToFitFrameProcessor scaleToFitFrameProcessor = if (transformationRequest.scaleX != 1f
|| transformationRequest.scaleY != 1f
|| transformationRequest.rotationDegrees != 0f) {
frameProcessorsListBuilder.add(
new ScaleToFitFrameProcessor.Builder() new ScaleToFitFrameProcessor.Builder()
.setScale(transformationRequest.scaleX, transformationRequest.scaleY) .setScale(transformationRequest.scaleX, transformationRequest.scaleY)
.setRotationDegrees(transformationRequest.rotationDegrees) .setRotationDegrees(transformationRequest.rotationDegrees)
.build(); .build());
PresentationFrameProcessor presentationFrameProcessor = }
if (transformationRequest.outputHeight != C.LENGTH_UNSET) {
frameProcessorsListBuilder.add(
new PresentationFrameProcessor.Builder() new PresentationFrameProcessor.Builder()
.setResolution(transformationRequest.outputHeight) .setResolution(transformationRequest.outputHeight)
.build(); .build());
}
EncoderCompatibilityFrameProcessor encoderCompatibilityFrameProcessor = EncoderCompatibilityFrameProcessor encoderCompatibilityFrameProcessor =
new EncoderCompatibilityFrameProcessor(); new EncoderCompatibilityFrameProcessor();
frameProcessorsListBuilder.add(encoderCompatibilityFrameProcessor);
frameProcessorChain = frameProcessorChain =
FrameProcessorChain.create( FrameProcessorChain.create(
context, context,
inputFormat.pixelWidthHeightRatio, inputFormat.pixelWidthHeightRatio,
/* inputWidth= */ decodedWidth, /* inputWidth= */ decodedWidth,
/* inputHeight= */ decodedHeight, /* inputHeight= */ decodedHeight,
new ImmutableList.Builder<GlFrameProcessor>() frameProcessorsListBuilder.build(),
.addAll(frameProcessors)
.add(scaleToFitFrameProcessor)
.add(presentationFrameProcessor)
.add(encoderCompatibilityFrameProcessor)
.build(),
transformationRequest.enableHdrEditing); transformationRequest.enableHdrEditing);
Size requestedEncoderSize = frameProcessorChain.getOutputSize(); Size requestedEncoderSize = frameProcessorChain.getOutputSize();
outputRotationDegrees = encoderCompatibilityFrameProcessor.getOutputRotationDegrees(); outputRotationDegrees = encoderCompatibilityFrameProcessor.getOutputRotationDegrees();