From f1cda5fe2aaa8957e9b2e9642ba94847ba0b95fa Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Mon, 25 Apr 2022 14:38:17 +0100 Subject: [PATCH] FrameProcessor: Avoid early rounding in Presentation output dimensions. PiperOrigin-RevId: 444253425 --- .../PresentationFrameProcessor.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/PresentationFrameProcessor.java b/libraries/transformer/src/main/java/androidx/media3/transformer/PresentationFrameProcessor.java index 58e669371d..770aead1d4 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/PresentationFrameProcessor.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/PresentationFrameProcessor.java @@ -233,8 +233,9 @@ public final class PresentationFrameProcessor implements GlFrameProcessor { private final float requestedAspectRatio; private final @Layout int layout; - private int outputWidth; - private int outputHeight; + private float outputWidth; + private float outputHeight; + private @MonotonicNonNull Size outputSize; private @MonotonicNonNull Matrix transformationMatrix; private @MonotonicNonNull AdvancedFrameProcessor advancedFrameProcessor; @@ -270,10 +271,10 @@ public final class PresentationFrameProcessor implements GlFrameProcessor { @Override public Size getOutputSize() { - checkState( - outputWidth != C.LENGTH_UNSET && outputHeight != C.LENGTH_UNSET, + checkStateNotNull( + outputSize, "configureOutputSizeAndTransformationMatrix must be called before getOutputSize"); - return new Size(outputWidth, outputHeight); + return outputSize; } @Override @@ -309,9 +310,10 @@ public final class PresentationFrameProcessor implements GlFrameProcessor { // Scale width and height to desired requestedHeightPixels, preserving aspect ratio. if (requestedHeightPixels != C.LENGTH_UNSET && requestedHeightPixels != outputHeight) { - outputWidth = Math.round((float) requestedHeightPixels * outputWidth / outputHeight); + outputWidth = requestedHeightPixels * outputWidth / outputHeight; outputHeight = requestedHeightPixels; } + outputSize = new Size(Math.round(outputWidth), Math.round(outputHeight)); } @RequiresNonNull("transformationMatrix") @@ -324,34 +326,34 @@ public final class PresentationFrameProcessor implements GlFrameProcessor { transformationMatrix.postTranslate(-centerX, -centerY); transformationMatrix.postScale(1f / scaleX, 1f / scaleY); - outputWidth = Math.round(outputWidth * scaleX); - outputHeight = Math.round(outputHeight * scaleY); + outputWidth = outputWidth * scaleX; + outputHeight = outputHeight * scaleY; } @RequiresNonNull("transformationMatrix") private void applyAspectRatio() { - float inputAspectRatio = (float) outputWidth / outputHeight; + float inputAspectRatio = outputWidth / outputHeight; if (layout == LAYOUT_SCALE_TO_FIT) { if (requestedAspectRatio > inputAspectRatio) { transformationMatrix.setScale(inputAspectRatio / requestedAspectRatio, 1f); - outputWidth = Math.round(outputHeight * requestedAspectRatio); + outputWidth = outputHeight * requestedAspectRatio; } else { transformationMatrix.setScale(1f, requestedAspectRatio / inputAspectRatio); - outputHeight = Math.round(outputWidth / requestedAspectRatio); + outputHeight = outputWidth / requestedAspectRatio; } } else if (layout == LAYOUT_SCALE_TO_FIT_WITH_CROP) { if (requestedAspectRatio > inputAspectRatio) { transformationMatrix.setScale(1f, requestedAspectRatio / inputAspectRatio); - outputHeight = Math.round(outputWidth / requestedAspectRatio); + outputHeight = outputWidth / requestedAspectRatio; } else { transformationMatrix.setScale(inputAspectRatio / requestedAspectRatio, 1f); - outputWidth = Math.round(outputHeight * requestedAspectRatio); + outputWidth = outputHeight * requestedAspectRatio; } } else if (layout == LAYOUT_STRETCH_TO_FIT) { if (requestedAspectRatio > inputAspectRatio) { - outputWidth = Math.round(outputHeight * requestedAspectRatio); + outputWidth = outputHeight * requestedAspectRatio; } else { - outputHeight = Math.round(outputWidth / requestedAspectRatio); + outputHeight = outputWidth / requestedAspectRatio; } } }