diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayTextureProcessorPixelTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayTextureProcessorPixelTest.java index f8678bdfe1..8d337301b9 100644 --- a/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayTextureProcessorPixelTest.java +++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/OverlayTextureProcessorPixelTest.java @@ -150,14 +150,33 @@ public class OverlayTextureProcessorPixelTest { } @Test - public void drawFrame_scaledBitmapOverlay_blendsBitmapIntoFrame() throws Exception { + public void drawFrame_scaledBitmapOverlay_letterboxStretchesOverlay() throws Exception { String testId = "drawFrame_scaledBitmapOverlay"; Bitmap overlayBitmap = readBitmap(OVERLAY_PNG_ASSET_PATH); float[] scaleMatrix = GlUtil.create4x4IdentityMatrix(); - Matrix.scaleM(scaleMatrix, /* mOffset= */ 0, /* x= */ 3, /* y= */ 3, /* z= */ 1); OverlaySettings overlaySettings = new OverlaySettings.Builder().setMatrix(scaleMatrix).build(); BitmapOverlay staticBitmapOverlay = - BitmapOverlay.createStaticBitmapOverlay(overlayBitmap, overlaySettings); + new BitmapOverlay() { + @Override + public Bitmap getBitmap(long presentationTimeUs) { + return overlayBitmap; + } + + @Override + public void configure(Size videoSize) { + Matrix.scaleM( + scaleMatrix, + /* mOffset= */ 0, + /* x= */ videoSize.getWidth() / (float) overlayBitmap.getWidth(), + /* y= */ 1, + /* z= */ 1); + } + + @Override + public OverlaySettings getOverlaySettings(long presentationTimeUs) { + return overlaySettings; + } + }; overlayTextureProcessor = new OverlayEffect(ImmutableList.of(staticBitmapOverlay)) .toGlTextureProcessor(context, /* useHdr= */ false); diff --git a/libraries/effect/src/main/java/androidx/media3/effect/OverlayTextureProcessor.java b/libraries/effect/src/main/java/androidx/media3/effect/OverlayTextureProcessor.java index 06bda53dbb..022bd312a5 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/OverlayTextureProcessor.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/OverlayTextureProcessor.java @@ -83,7 +83,11 @@ import com.google.common.collect.ImmutableList; public Size configure(int inputWidth, int inputHeight) { videoWidth = inputWidth; videoHeight = inputHeight; - return new Size(inputWidth, inputHeight); + Size videoSize = new Size(inputWidth, inputHeight); + for (TextureOverlay overlay : overlays) { + overlay.configure(videoSize); + } + return videoSize; } @Override diff --git a/libraries/effect/src/main/java/androidx/media3/effect/TextureOverlay.java b/libraries/effect/src/main/java/androidx/media3/effect/TextureOverlay.java index 867687a29a..c21f45de55 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/TextureOverlay.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/TextureOverlay.java @@ -41,6 +41,16 @@ public abstract class TextureOverlay { */ public abstract Size getTextureSize(long presentationTimeUs); + /** + * Set up resources for the overlay given the input video’s dimensions. + * + *
This method will be called before drawing the first frame and before drawing subsequent + * frames with different input dimensions. + * + * @param videoSize The width and height of the input video, in pixels. + */ + public void configure(Size videoSize) {} + /** * Returns the {@link OverlaySettings} controlling how the overlay is displayed at the specified * timestamp. diff --git a/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/overlay_bitmap_scaled.png b/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/overlay_bitmap_scaled.png index 6cab7f796c..421b394ab0 100644 Binary files a/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/overlay_bitmap_scaled.png and b/libraries/test_data/src/test/assets/media/bitmap/sample_mp4_first_frame/electrical_colors/overlay_bitmap_scaled.png differ