diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/RgbAdjustmentPixelTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/RgbAdjustmentPixelTest.java
index e39b3ddfd9..e4bc54c8e1 100644
--- a/libraries/effect/src/androidTest/java/androidx/media3/effect/RgbAdjustmentPixelTest.java
+++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/RgbAdjustmentPixelTest.java
@@ -39,7 +39,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
/**
- * Pixel tests for {@link RgbaMatrix}.
+ * Pixel tests for {@link RgbMatrix}.
*
*
Expected images are taken from an emulator, so tests on different emulators or physical
* devices may fail. To test on other devices, please increase the {@link
@@ -63,7 +63,7 @@ public final class RgbAdjustmentPixelTest {
private @MonotonicNonNull EGLDisplay eglDisplay;
private @MonotonicNonNull EGLContext eglContext;
- private @MonotonicNonNull SingleFrameGlTextureProcessor rgbaMatrixProcessor;
+ private @MonotonicNonNull SingleFrameGlTextureProcessor rgbMatrixProcessor;
private @MonotonicNonNull EGLSurface placeholderEglSurface;
private int inputTexId;
private int outputTexId;
@@ -95,27 +95,27 @@ public final class RgbAdjustmentPixelTest {
@After
public void release() throws GlUtil.GlException, FrameProcessingException {
- if (rgbaMatrixProcessor != null) {
- rgbaMatrixProcessor.release();
+ if (rgbMatrixProcessor != null) {
+ rgbMatrixProcessor.release();
}
GlUtil.destroyEglContext(eglDisplay, eglContext);
}
- private static RgbaMatrixProcessor createRgbaMatrixProcessor(Context context, float[] rgbaMatrix)
+ private static RgbMatrixProcessor createRgbMatrixProcessor(Context context, float[] rgbMatrix)
throws FrameProcessingException {
- return ((RgbaMatrix) presentationTimeUs -> rgbaMatrix)
+ return ((RgbMatrix) presentationTimeUs -> rgbMatrix)
.toGlTextureProcessor(context, /* useHdr= */ false);
}
@Test
public void drawFrame_identityMatrix_leavesFrameUnchanged() throws Exception {
String testId = "drawFrame_identityMatrix";
- RgbaMatrix identityMatrix = new RgbAdjustment.Builder().build();
- rgbaMatrixProcessor = new RgbaMatrixProcessor(context, identityMatrix, /* useHdr= */ false);
- Pair outputSize = rgbaMatrixProcessor.configure(inputWidth, inputHeight);
+ RgbMatrix identityMatrix = new RgbAdjustment.Builder().build();
+ rgbMatrixProcessor = new RgbMatrixProcessor(context, identityMatrix, /* useHdr= */ false);
+ Pair outputSize = rgbMatrixProcessor.configure(inputWidth, inputHeight);
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ORIGINAL_PNG_ASSET_PATH);
- rgbaMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
+ rgbMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
Bitmap actualBitmap =
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
outputSize.first, outputSize.second);
@@ -131,15 +131,15 @@ public final class RgbAdjustmentPixelTest {
@Test
public void drawFrame_removeColors_producesBlackFrame() throws Exception {
String testId = "drawFrame_removeColors";
- RgbaMatrix removeColorMatrix =
+ RgbMatrix removeColorMatrix =
new RgbAdjustment.Builder().setRedScale(0).setGreenScale(0).setBlueScale(0).build();
- rgbaMatrixProcessor = new RgbaMatrixProcessor(context, removeColorMatrix, /* useHdr= */ false);
- Pair outputSize = rgbaMatrixProcessor.configure(inputWidth, inputHeight);
+ rgbMatrixProcessor = new RgbMatrixProcessor(context, removeColorMatrix, /* useHdr= */ false);
+ Pair outputSize = rgbMatrixProcessor.configure(inputWidth, inputHeight);
Bitmap expectedBitmap =
BitmapTestUtil.createArgb8888BitmapWithSolidColor(
outputSize.first, outputSize.second, Color.BLACK);
- rgbaMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
+ rgbMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
Bitmap actualBitmap =
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
outputSize.first, outputSize.second);
@@ -155,12 +155,12 @@ public final class RgbAdjustmentPixelTest {
@Test
public void drawFrame_redOnlyFilter_setsBlueAndGreenValuesToZero() throws Exception {
String testId = "drawFrame_redOnlyFilter";
- RgbaMatrix redOnlyMatrix = new RgbAdjustment.Builder().setBlueScale(0).setGreenScale(0).build();
- rgbaMatrixProcessor = new RgbaMatrixProcessor(context, redOnlyMatrix, /* useHdr= */ false);
- Pair outputSize = rgbaMatrixProcessor.configure(inputWidth, inputHeight);
+ RgbMatrix redOnlyMatrix = new RgbAdjustment.Builder().setBlueScale(0).setGreenScale(0).build();
+ rgbMatrixProcessor = new RgbMatrixProcessor(context, redOnlyMatrix, /* useHdr= */ false);
+ Pair outputSize = rgbMatrixProcessor.configure(inputWidth, inputHeight);
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ONLY_RED_CHANNEL_PNG_ASSET_PATH);
- rgbaMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
+ rgbMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
Bitmap actualBitmap =
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
outputSize.first, outputSize.second);
@@ -176,12 +176,12 @@ public final class RgbAdjustmentPixelTest {
@Test
public void drawFrame_increaseRedChannel_producesBrighterAndRedderFrame() throws Exception {
String testId = "drawFrame_increaseRedChannel";
- RgbaMatrix increaseRedMatrix = new RgbAdjustment.Builder().setRedScale(5).build();
- rgbaMatrixProcessor = new RgbaMatrixProcessor(context, increaseRedMatrix, /* useHdr= */ false);
- Pair outputSize = rgbaMatrixProcessor.configure(inputWidth, inputHeight);
+ RgbMatrix increaseRedMatrix = new RgbAdjustment.Builder().setRedScale(5).build();
+ rgbMatrixProcessor = new RgbMatrixProcessor(context, increaseRedMatrix, /* useHdr= */ false);
+ Pair outputSize = rgbMatrixProcessor.configure(inputWidth, inputHeight);
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INCREASE_RED_CHANNEL_PNG_ASSET_PATH);
- rgbaMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
+ rgbMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
Bitmap actualBitmap =
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
outputSize.first, outputSize.second);
@@ -197,14 +197,14 @@ public final class RgbAdjustmentPixelTest {
@Test
public void drawFrame_increaseBrightness_increasesAllValues() throws Exception {
String testId = "drawFrame_increaseBrightness";
- RgbaMatrix increaseBrightnessMatrix =
+ RgbMatrix increaseBrightnessMatrix =
new RgbAdjustment.Builder().setRedScale(5).setGreenScale(5).setBlueScale(5).build();
- rgbaMatrixProcessor =
- new RgbaMatrixProcessor(context, increaseBrightnessMatrix, /* useHdr = */ false);
- Pair outputSize = rgbaMatrixProcessor.configure(inputWidth, inputHeight);
+ rgbMatrixProcessor =
+ new RgbMatrixProcessor(context, increaseBrightnessMatrix, /* useHdr = */ false);
+ Pair outputSize = rgbMatrixProcessor.configure(inputWidth, inputHeight);
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INCREASE_BRIGHTNESS_PNG_ASSET_PATH);
- rgbaMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
+ rgbMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
Bitmap actualBitmap =
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
outputSize.first, outputSize.second);
@@ -227,11 +227,11 @@ public final class RgbAdjustmentPixelTest {
0.2126f, 0.2126f, 0.2126f, 0, 0.7152f, 0.7152f, 0.7152f, 0, 0.0722f, 0.0722f, 0.0722f, 0, 0,
0, 0, 1
};
- rgbaMatrixProcessor = createRgbaMatrixProcessor(/* context= */ context, grayscaleMatrix);
- Pair outputSize = rgbaMatrixProcessor.configure(inputWidth, inputHeight);
+ rgbMatrixProcessor = createRgbMatrixProcessor(/* context= */ context, grayscaleMatrix);
+ Pair outputSize = rgbMatrixProcessor.configure(inputWidth, inputHeight);
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(GRAYSCALE_PNG_ASSET_PATH);
- rgbaMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
+ rgbMatrixProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
Bitmap actualBitmap =
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
outputSize.first, outputSize.second);
diff --git a/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_es2.glsl b/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_es2.glsl
index 4b70580e26..ec9e645f84 100644
--- a/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_es2.glsl
+++ b/libraries/effect/src/main/assets/shaders/fragment_shader_transformation_es2.glsl
@@ -15,7 +15,7 @@
// ES 2 fragment shader that samples from a (non-external) texture with
// uTexSampler, copying from this texture to the current output while
-// applying a 4x4 RGBA color matrix to change the pixel colors.
+// applying a 4x4 RGB color matrix to change the pixel colors.
precision mediump float;
uniform sampler2D uTexSampler;
@@ -24,5 +24,6 @@ varying vec2 vTexSamplingCoord;
void main() {
vec4 inputColor = texture2D(uTexSampler, vTexSamplingCoord);
- gl_FragColor = uColorMatrix * inputColor;
+ gl_FragColor = uColorMatrix * vec4(inputColor.rgb, 1);
+ gl_FragColor.a = inputColor.a;
}
diff --git a/libraries/effect/src/main/java/androidx/media3/effect/RgbAdjustment.java b/libraries/effect/src/main/java/androidx/media3/effect/RgbAdjustment.java
index 3356b7ba88..e5e8769f75 100644
--- a/libraries/effect/src/main/java/androidx/media3/effect/RgbAdjustment.java
+++ b/libraries/effect/src/main/java/androidx/media3/effect/RgbAdjustment.java
@@ -24,7 +24,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue;
/** Scales the red, green, and blue color channels of a frame. */
@UnstableApi
-public final class RgbAdjustment implements RgbaMatrix {
+public final class RgbAdjustment implements RgbMatrix {
/** A builder for {@link RgbAdjustment} instances. */
public static final class Builder {
@@ -80,27 +80,23 @@ public final class RgbAdjustment implements RgbaMatrix {
/** Creates a new {@link RgbAdjustment} instance. */
public RgbAdjustment build() {
- float[] rgbaMatrix = new float[16];
- Matrix.setIdentityM(rgbaMatrix, /* smOffset= */ 0);
+ float[] rgbMatrix = new float[16];
+ Matrix.setIdentityM(rgbMatrix, /* smOffset= */ 0);
Matrix.scaleM(
- rgbaMatrix,
- /* smOffset= */ 0,
- /* x= */ redScale,
- /* y= */ greenScale,
- /* z= */ blueScale);
+ rgbMatrix, /* smOffset= */ 0, /* x= */ redScale, /* y= */ greenScale, /* z= */ blueScale);
- return new RgbAdjustment(rgbaMatrix);
+ return new RgbAdjustment(rgbMatrix);
}
}
- private final float[] rgbaMatrix;
+ private final float[] rgbMatrix;
- private RgbAdjustment(float[] rgbaMatrix) {
- this.rgbaMatrix = rgbaMatrix;
+ private RgbAdjustment(float[] rgbMatrix) {
+ this.rgbMatrix = rgbMatrix;
}
@Override
public float[] getMatrix(long presentationTimeUs) {
- return rgbaMatrix;
+ return rgbMatrix;
}
}
diff --git a/libraries/effect/src/main/java/androidx/media3/effect/RgbaMatrix.java b/libraries/effect/src/main/java/androidx/media3/effect/RgbMatrix.java
similarity index 71%
rename from libraries/effect/src/main/java/androidx/media3/effect/RgbaMatrix.java
rename to libraries/effect/src/main/java/androidx/media3/effect/RgbMatrix.java
index 7e9674e432..18a8891045 100644
--- a/libraries/effect/src/main/java/androidx/media3/effect/RgbaMatrix.java
+++ b/libraries/effect/src/main/java/androidx/media3/effect/RgbMatrix.java
@@ -21,20 +21,20 @@ import androidx.media3.common.FrameProcessingException;
import androidx.media3.common.util.UnstableApi;
/**
- * Specifies a 4x4 RGBA color transformation matrix to apply to each frame in the fragment shader.
+ * Specifies a 4x4 RGB color transformation matrix to apply to each frame in the fragment shader.
*/
@UnstableApi
-public interface RgbaMatrix extends GlEffect {
+public interface RgbMatrix extends GlEffect {
/**
- * Returns the 4x4 RGBA transformation {@linkplain android.opengl.Matrix matrix} to apply to the
+ * Returns the 4x4 RGB transformation {@linkplain android.opengl.Matrix matrix} to apply to the
* color values of each pixel in the frame with the given timestamp.
*/
float[] getMatrix(long presentationTimeUs);
@Override
- default RgbaMatrixProcessor toGlTextureProcessor(Context context, boolean useHdr)
+ default RgbMatrixProcessor toGlTextureProcessor(Context context, boolean useHdr)
throws FrameProcessingException {
- return new RgbaMatrixProcessor(context, /* rgbaMatrix= */ this, useHdr);
+ return new RgbMatrixProcessor(context, /* rgbMatrix= */ this, useHdr);
}
}
diff --git a/libraries/effect/src/main/java/androidx/media3/effect/RgbaMatrixProcessor.java b/libraries/effect/src/main/java/androidx/media3/effect/RgbMatrixProcessor.java
similarity index 81%
rename from libraries/effect/src/main/java/androidx/media3/effect/RgbaMatrixProcessor.java
rename to libraries/effect/src/main/java/androidx/media3/effect/RgbMatrixProcessor.java
index 7130ceb995..4075ea21fd 100644
--- a/libraries/effect/src/main/java/androidx/media3/effect/RgbaMatrixProcessor.java
+++ b/libraries/effect/src/main/java/androidx/media3/effect/RgbMatrixProcessor.java
@@ -25,21 +25,21 @@ import androidx.media3.common.util.GlProgram;
import androidx.media3.common.util.GlUtil;
import java.io.IOException;
-/** Applies an {@link RgbaMatrix} to each frame. */
-/* package */ final class RgbaMatrixProcessor extends SingleFrameGlTextureProcessor {
+/** Applies an {@link RgbMatrix} to each frame. */
+/* package */ final class RgbMatrixProcessor extends SingleFrameGlTextureProcessor {
private static final String VERTEX_SHADER_PATH = "shaders/vertex_shader_transformation_es2.glsl";
private static final String FRAGMENT_SHADER_PATH =
"shaders/fragment_shader_transformation_es2.glsl";
private final GlProgram glProgram;
- private final RgbaMatrix rgbaMatrix;
+ private final RgbMatrix rgbMatrix;
- // TODO(b/239431666): Support chaining multiple RgbaMatrix instances in RgbaMatrixProcessor.
- // TODO(b/239757183): Merge RgbaMatrixProcessor with MatrixTransformationProcessor.
- public RgbaMatrixProcessor(Context context, RgbaMatrix rgbaMatrix, boolean useHdr)
+ // TODO(b/239431666): Support chaining multiple RgbMatrix instances in RgbMatrixProcessor.
+ // TODO(b/239757183): Merge RgbMatrixProcessor with MatrixTransformationProcessor.
+ public RgbMatrixProcessor(Context context, RgbMatrix rgbMatrix, boolean useHdr)
throws FrameProcessingException {
super(useHdr);
- this.rgbaMatrix = rgbaMatrix;
+ this.rgbMatrix = rgbMatrix;
try {
glProgram = new GlProgram(context, VERTEX_SHADER_PATH, FRAGMENT_SHADER_PATH);
@@ -66,11 +66,11 @@ import java.io.IOException;
@Override
public void drawFrame(int inputTexId, long presentationTimeUs) throws FrameProcessingException {
- float[] rgbaMatrixArray = rgbaMatrix.getMatrix(presentationTimeUs);
+ float[] rgbMatrixArray = rgbMatrix.getMatrix(presentationTimeUs);
try {
glProgram.use();
glProgram.setSamplerTexIdUniform("uTexSampler", inputTexId, /* texUnitIndex= */ 0);
- glProgram.setFloatsUniform("uColorMatrix", rgbaMatrixArray);
+ glProgram.setFloatsUniform("uColorMatrix", rgbMatrixArray);
glProgram.bindAttributesAndUniforms();
// The four-vertex triangle strip forms a quad.