diff --git a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java index 447c258727..d7e81653d1 100644 --- a/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java +++ b/demos/transformer/src/main/java/androidx/media3/demo/transformer/TransformerActivity.java @@ -70,7 +70,7 @@ import androidx.media3.effect.Presentation; import androidx.media3.effect.RgbAdjustment; import androidx.media3.effect.RgbFilter; import androidx.media3.effect.RgbMatrix; -import androidx.media3.effect.ScaleToFitTransformation; +import androidx.media3.effect.ScaleAndRotateTransformation; import androidx.media3.effect.SimpleBitmapLoader; import androidx.media3.effect.SingleColorLut; import androidx.media3.effect.TextOverlay; @@ -547,7 +547,7 @@ public final class TransformerActivity extends AppCompatActivity { bundle.getFloat(ConfigurationActivity.ROTATE_DEGREES, /* defaultValue= */ 0); if (scaleX != 1f || scaleY != 1f || rotateDegrees != 0f) { effects.add( - new ScaleToFitTransformation.Builder() + new ScaleAndRotateTransformation.Builder() .setScale(scaleX, scaleY) .setRotationDegrees(rotateDegrees) .build()); diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java index 1880bddbbe..b793fa7979 100644 --- a/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java +++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/DefaultVideoFrameProcessorPixelTest.java @@ -199,15 +199,15 @@ public final class DefaultVideoFrameProcessorPixelTest { } @Test - public void matrixAndScaleToFitTransformation_matchesGoldenFile() throws Exception { - String testId = "matrixAndScaleToFitTransformation_matchesGoldenFile"; + public void matrixAndScaleAndRotateTransformation_matchesGoldenFile() throws Exception { + String testId = "matrixAndScaleAndRotateTransformation_matchesGoldenFile"; Matrix translateRightMatrix = new Matrix(); translateRightMatrix.postTranslate(/* dx= */ 1, /* dy= */ 0); videoFrameProcessorTestRunner = getDefaultFrameProcessorTestRunnerBuilder(testId) .setEffects( (MatrixTransformation) (long presentationTimeUs) -> translateRightMatrix, - new ScaleToFitTransformation.Builder().setRotationDegrees(45).build()) + new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()) .build(); Bitmap expectedBitmap = readBitmap(TRANSLATE_THEN_ROTATE_PNG_ASSET_PATH); @@ -239,14 +239,14 @@ public final class DefaultVideoFrameProcessorPixelTest { } @Test - public void scaleToFitAndMatrixTransformation_matchesGoldenFile() throws Exception { - String testId = "scaleToFitAndMatrixTransformation_matchesGoldenFile"; + public void scaleAndRotateAndMatrixTransformation_matchesGoldenFile() throws Exception { + String testId = "scaleAndRotateAndMatrixTransformation_matchesGoldenFile"; Matrix translateRightMatrix = new Matrix(); translateRightMatrix.postTranslate(/* dx= */ 1, /* dy= */ 0); videoFrameProcessorTestRunner = getDefaultFrameProcessorTestRunnerBuilder(testId) .setEffects( - new ScaleToFitTransformation.Builder().setRotationDegrees(45).build(), + new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build(), (MatrixTransformation) (long presentationTimeUs) -> translateRightMatrix) .build(); Bitmap expectedBitmap = readBitmap(ROTATE_THEN_TRANSLATE_PNG_ASSET_PATH); @@ -298,11 +298,11 @@ public final class DefaultVideoFrameProcessorPixelTest { } @Test - public void scaleToFitTransformation_rotate45_matchesGoldenFile() throws Exception { - String testId = "scaleToFitTransformation_rotate45_matchesGoldenFile"; + public void scaleAndRotateTransformation_rotate45_matchesGoldenFile() throws Exception { + String testId = "scaleAndRotateTransformation_rotate45_matchesGoldenFile"; videoFrameProcessorTestRunner = getDefaultFrameProcessorTestRunnerBuilder(testId) - .setEffects(new ScaleToFitTransformation.Builder().setRotationDegrees(45).build()) + .setEffects(new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()) .build(); Bitmap expectedBitmap = readBitmap(ROTATE45_SCALE_TO_FIT_PNG_ASSET_PATH); @@ -315,15 +315,15 @@ public final class DefaultVideoFrameProcessorPixelTest { } @Test - public void twoWrappedScaleToFitTransformations_matchesGoldenFile() throws Exception { - String testId = "twoWrappedScaleToFitTransformations_matchesGoldenFile"; + public void twoWrappedScaleAndRotateTransformations_matchesGoldenFile() throws Exception { + String testId = "twoWrappedScaleAndRotateTransformations_matchesGoldenFile"; videoFrameProcessorTestRunner = getDefaultFrameProcessorTestRunnerBuilder(testId) .setEffects( new GlEffectWrapper( - new ScaleToFitTransformation.Builder().setRotationDegrees(45).build()), + new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build()), new GlEffectWrapper( - new ScaleToFitTransformation.Builder() + new ScaleAndRotateTransformation.Builder() .setScale(/* scaleX= */ 2, /* scaleY= */ 1) .build())) .build(); @@ -510,8 +510,8 @@ public final class DefaultVideoFrameProcessorPixelTest { * Specifies a counter-clockwise rotation while accounting for the aspect ratio difference between * the input frame in pixel coordinates and NDC. * - *
Unlike {@link ScaleToFitTransformation}, this does not adjust the output size or scale to - * preserve input pixels. Pixels rotated out of the frame are clipped. + *
Unlike {@link ScaleAndRotateTransformation}, this does not adjust the output size or scale
+ * to preserve input pixels. Pixels rotated out of the frame are clipped.
*/
private static final class Rotation implements MatrixTransformation {
diff --git a/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixShaderProgramWrapper.java b/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixShaderProgramWrapper.java
index 95e50ac8ff..1383a54c2e 100644
--- a/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixShaderProgramWrapper.java
+++ b/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixShaderProgramWrapper.java
@@ -393,7 +393,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
new ImmutableList.Builder The background color of the output frame will be black, with alpha = 0 if applicable.
*/
@UnstableApi
-public final class ScaleToFitTransformation implements MatrixTransformation {
+public final class ScaleAndRotateTransformation implements MatrixTransformation {
- /** A builder for {@link ScaleToFitTransformation} instances. */
+ /** A builder for {@link ScaleAndRotateTransformation} instances. */
public static final class Builder {
// Optional fields.
@@ -87,8 +87,8 @@ public final class ScaleToFitTransformation implements MatrixTransformation {
return this;
}
- public ScaleToFitTransformation build() {
- return new ScaleToFitTransformation(scaleX, scaleY, rotationDegrees);
+ public ScaleAndRotateTransformation build() {
+ return new ScaleAndRotateTransformation(scaleX, scaleY, rotationDegrees);
}
}
@@ -102,7 +102,7 @@ public final class ScaleToFitTransformation implements MatrixTransformation {
* @param scaleY The multiplier by which the frame will scale vertically, along the y-axis.
* @param rotationDegrees How much to rotate the frame counterclockwise, in degrees.
*/
- private ScaleToFitTransformation(float scaleX, float scaleY, float rotationDegrees) {
+ private ScaleAndRotateTransformation(float scaleX, float scaleY, float rotationDegrees) {
transformationMatrix = new Matrix();
transformationMatrix.postScale(scaleX, scaleY);
transformationMatrix.postRotate(rotationDegrees);
diff --git a/libraries/effect/src/test/java/androidx/media3/effect/ScaleToFitTransformationTest.java b/libraries/effect/src/test/java/androidx/media3/effect/ScaleAndRotateTransformationTest.java
similarity index 60%
rename from libraries/effect/src/test/java/androidx/media3/effect/ScaleToFitTransformationTest.java
rename to libraries/effect/src/test/java/androidx/media3/effect/ScaleAndRotateTransformationTest.java
index 68fa74af15..c7253b218b 100644
--- a/libraries/effect/src/test/java/androidx/media3/effect/ScaleToFitTransformationTest.java
+++ b/libraries/effect/src/test/java/androidx/media3/effect/ScaleAndRotateTransformationTest.java
@@ -23,23 +23,23 @@ import org.junit.Test;
import org.junit.runner.RunWith;
/**
- * Unit tests for {@link ScaleToFitTransformation}.
+ * Unit tests for {@link ScaleAndRotateTransformation}.
*
* See {@code MatrixShaderProgramPixelTest} for pixel tests testing {@link MatrixShaderProgram}
* given a transformation matrix.
*/
@RunWith(AndroidJUnit4.class)
-public final class ScaleToFitTransformationTest {
+public final class ScaleAndRotateTransformationTest {
@Test
public void configure_noEdits_leavesFramesUnchanged() {
int inputWidth = 200;
int inputHeight = 150;
- ScaleToFitTransformation scaleToFitTransformation =
- new ScaleToFitTransformation.Builder().build();
+ ScaleAndRotateTransformation scaleAndRotateTransformation =
+ new ScaleAndRotateTransformation.Builder().build();
- Size outputSize = scaleToFitTransformation.configure(inputWidth, inputHeight);
- boolean isNoOp = scaleToFitTransformation.isNoOp(inputWidth, inputHeight);
+ Size outputSize = scaleAndRotateTransformation.configure(inputWidth, inputHeight);
+ boolean isNoOp = scaleAndRotateTransformation.isNoOp(inputWidth, inputHeight);
assertThat(isNoOp).isTrue();
assertThat(outputSize.getWidth()).isEqualTo(inputWidth);
@@ -50,13 +50,13 @@ public final class ScaleToFitTransformationTest {
public void configure_scaleNarrow_decreasesWidth() {
int inputWidth = 200;
int inputHeight = 150;
- ScaleToFitTransformation scaleToFitTransformation =
- new ScaleToFitTransformation.Builder()
+ ScaleAndRotateTransformation scaleAndRotateTransformation =
+ new ScaleAndRotateTransformation.Builder()
.setScale(/* scaleX= */ 0.5f, /* scaleY= */ 1f)
.build();
- Size outputSize = scaleToFitTransformation.configure(inputWidth, inputHeight);
- boolean isNoOp = scaleToFitTransformation.isNoOp(inputWidth, inputHeight);
+ Size outputSize = scaleAndRotateTransformation.configure(inputWidth, inputHeight);
+ boolean isNoOp = scaleAndRotateTransformation.isNoOp(inputWidth, inputHeight);
assertThat(isNoOp).isFalse();
assertThat(outputSize.getWidth()).isEqualTo(Math.round(inputWidth * 0.5f));
@@ -67,11 +67,13 @@ public final class ScaleToFitTransformationTest {
public void configure_scaleWide_increasesWidth() {
int inputWidth = 200;
int inputHeight = 150;
- ScaleToFitTransformation scaleToFitTransformation =
- new ScaleToFitTransformation.Builder().setScale(/* scaleX= */ 2f, /* scaleY= */ 1f).build();
+ ScaleAndRotateTransformation scaleAndRotateTransformation =
+ new ScaleAndRotateTransformation.Builder()
+ .setScale(/* scaleX= */ 2f, /* scaleY= */ 1f)
+ .build();
- Size outputSize = scaleToFitTransformation.configure(inputWidth, inputHeight);
- boolean isNoOp = scaleToFitTransformation.isNoOp(inputWidth, inputHeight);
+ Size outputSize = scaleAndRotateTransformation.configure(inputWidth, inputHeight);
+ boolean isNoOp = scaleAndRotateTransformation.isNoOp(inputWidth, inputHeight);
assertThat(isNoOp).isFalse();
assertThat(outputSize.getWidth()).isEqualTo(inputWidth * 2);
@@ -82,11 +84,13 @@ public final class ScaleToFitTransformationTest {
public void configure_scaleTall_increasesHeight() {
int inputWidth = 200;
int inputHeight = 150;
- ScaleToFitTransformation scaleToFitTransformation =
- new ScaleToFitTransformation.Builder().setScale(/* scaleX= */ 1f, /* scaleY= */ 2f).build();
+ ScaleAndRotateTransformation scaleAndRotateTransformation =
+ new ScaleAndRotateTransformation.Builder()
+ .setScale(/* scaleX= */ 1f, /* scaleY= */ 2f)
+ .build();
- Size outputSize = scaleToFitTransformation.configure(inputWidth, inputHeight);
- boolean isNoOp = scaleToFitTransformation.isNoOp(inputWidth, inputHeight);
+ Size outputSize = scaleAndRotateTransformation.configure(inputWidth, inputHeight);
+ boolean isNoOp = scaleAndRotateTransformation.isNoOp(inputWidth, inputHeight);
assertThat(isNoOp).isFalse();
assertThat(outputSize.getWidth()).isEqualTo(inputWidth);
@@ -97,11 +101,11 @@ public final class ScaleToFitTransformationTest {
public void configure_rotate90_swapsDimensions() {
int inputWidth = 200;
int inputHeight = 150;
- ScaleToFitTransformation scaleToFitTransformation =
- new ScaleToFitTransformation.Builder().setRotationDegrees(90).build();
+ ScaleAndRotateTransformation scaleAndRotateTransformation =
+ new ScaleAndRotateTransformation.Builder().setRotationDegrees(90).build();
- Size outputSize = scaleToFitTransformation.configure(inputWidth, inputHeight);
- boolean isNoOp = scaleToFitTransformation.isNoOp(inputWidth, inputHeight);
+ Size outputSize = scaleAndRotateTransformation.configure(inputWidth, inputHeight);
+ boolean isNoOp = scaleAndRotateTransformation.isNoOp(inputWidth, inputHeight);
assertThat(isNoOp).isFalse();
assertThat(outputSize.getWidth()).isEqualTo(inputHeight);
@@ -112,12 +116,12 @@ public final class ScaleToFitTransformationTest {
public void configure_rotate45_changesDimensions() {
int inputWidth = 200;
int inputHeight = 150;
- ScaleToFitTransformation scaleToFitTransformation =
- new ScaleToFitTransformation.Builder().setRotationDegrees(45).build();
+ ScaleAndRotateTransformation scaleAndRotateTransformation =
+ new ScaleAndRotateTransformation.Builder().setRotationDegrees(45).build();
long expectedOutputWidthHeight = 247;
- Size outputSize = scaleToFitTransformation.configure(inputWidth, inputHeight);
- boolean isNoOp = scaleToFitTransformation.isNoOp(inputWidth, inputHeight);
+ Size outputSize = scaleAndRotateTransformation.configure(inputWidth, inputHeight);
+ boolean isNoOp = scaleAndRotateTransformation.isNoOp(inputWidth, inputHeight);
assertThat(isNoOp).isFalse();
assertThat(outputSize.getWidth()).isEqualTo(expectedOutputWidthHeight);
diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
index 173e2f76ff..8604ab3f30 100644
--- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
+++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/video/MediaCodecVideoRenderer.java
@@ -2288,16 +2288,17 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
private static final class VideoFrameProcessorAccessor {
- private static @MonotonicNonNull Constructor> scaleToFitTransformationBuilderConstructor;
+ private static @MonotonicNonNull Constructor>
+ scaleAndRotateTransformationBuilderConstructor;
private static @MonotonicNonNull Method setRotationMethod;
- private static @MonotonicNonNull Method buildScaleToFitTransformationMethod;
+ private static @MonotonicNonNull Method buildScaleAndRotateTransformationMethod;
private static @MonotonicNonNull Constructor> videoFrameProcessorFactoryConstructor;
public static Effect createRotationEffect(float rotationDegrees) throws Exception {
prepare();
- Object builder = scaleToFitTransformationBuilderConstructor.newInstance();
+ Object builder = scaleAndRotateTransformationBuilderConstructor.newInstance();
setRotationMethod.invoke(builder, rotationDegrees);
- return (Effect) checkNotNull(buildScaleToFitTransformationMethod.invoke(builder));
+ return (Effect) checkNotNull(buildScaleAndRotateTransformationMethod.invoke(builder));
}
public static VideoFrameProcessor.Factory getFrameProcessorFactory() throws Exception {
@@ -2306,23 +2307,23 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
}
@EnsuresNonNull({
- "ScaleToFitEffectBuilder",
+ "ScaleAndRotateEffectBuilder",
"SetRotationMethod",
"SetRotationMethod",
"VideoFrameProcessorFactoryClass"
})
private static void prepare() throws Exception {
- if (scaleToFitTransformationBuilderConstructor == null
+ if (scaleAndRotateTransformationBuilderConstructor == null
|| setRotationMethod == null
- || buildScaleToFitTransformationMethod == null) {
- Class> scaleToFitTransformationBuilderClass =
- Class.forName("androidx.media3.effect.ScaleToFitTransformation$Builder");
- scaleToFitTransformationBuilderConstructor =
- scaleToFitTransformationBuilderClass.getConstructor();
+ || buildScaleAndRotateTransformationMethod == null) {
+ Class> scaleAndRotateTransformationBuilderClass =
+ Class.forName("androidx.media3.effect.ScaleAndRotateTransformation$Builder");
+ scaleAndRotateTransformationBuilderConstructor =
+ scaleAndRotateTransformationBuilderClass.getConstructor();
setRotationMethod =
- scaleToFitTransformationBuilderClass.getMethod("setRotationDegrees", float.class);
- buildScaleToFitTransformationMethod =
- scaleToFitTransformationBuilderClass.getMethod("build");
+ scaleAndRotateTransformationBuilderClass.getMethod("setRotationDegrees", float.class);
+ buildScaleAndRotateTransformationMethod =
+ scaleAndRotateTransformationBuilderClass.getMethod("build");
}
if (videoFrameProcessorFactoryConstructor == null) {
videoFrameProcessorFactoryConstructor =
diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ExportTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ExportTest.java
index c53e965b43..79414fa399 100644
--- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ExportTest.java
+++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/mh/ExportTest.java
@@ -30,7 +30,7 @@ import android.net.Uri;
import androidx.media3.common.Effect;
import androidx.media3.common.MediaItem;
import androidx.media3.common.util.Util;
-import androidx.media3.effect.ScaleToFitTransformation;
+import androidx.media3.effect.ScaleAndRotateTransformation;
import androidx.media3.transformer.AndroidTestUtil;
import androidx.media3.transformer.AndroidTestUtil.ForceEncodeEncoderFactory;
import androidx.media3.transformer.DefaultEncoderFactory;
@@ -244,7 +244,7 @@ public class ExportTest {
MediaItem mediaItem =
MediaItem.fromUri(Uri.parse(MP4_ASSET_WITH_INCREASING_TIMESTAMPS_URI_STRING));
ImmutableList