mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
Rename MatrixTransformationProcessor to MatrixTextureProcessor.
PiperOrigin-RevId: 473283967
This commit is contained in:
parent
d188babd2d
commit
5c78444bf8
10 changed files with 119 additions and 142 deletions
|
|
@ -36,7 +36,7 @@ import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pixel test for texture processing via {@link MatrixTransformationProcessor}.
|
* Pixel test for texture processing via {@link MatrixTextureProcessor}.
|
||||||
*
|
*
|
||||||
* <p>Expected images are taken from an emulator, so tests on different emulators or physical
|
* <p>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
|
* devices may fail. To test on other devices, please increase the {@link
|
||||||
|
|
@ -44,7 +44,7 @@ import org.junit.runner.RunWith;
|
||||||
* as recommended in {@link GlEffectsFrameProcessorPixelTest}.
|
* as recommended in {@link GlEffectsFrameProcessorPixelTest}.
|
||||||
*/
|
*/
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class MatrixTransformationProcessorPixelTest {
|
public final class MatrixTextureProcessorPixelTest {
|
||||||
public static final String ORIGINAL_PNG_ASSET_PATH =
|
public static final String ORIGINAL_PNG_ASSET_PATH =
|
||||||
"media/bitmap/sample_mp4_first_frame/original.png";
|
"media/bitmap/sample_mp4_first_frame/original.png";
|
||||||
public static final String TRANSLATE_RIGHT_PNG_ASSET_PATH =
|
public static final String TRANSLATE_RIGHT_PNG_ASSET_PATH =
|
||||||
|
|
@ -58,7 +58,7 @@ public final class MatrixTransformationProcessorPixelTest {
|
||||||
|
|
||||||
private @MonotonicNonNull EGLDisplay eglDisplay;
|
private @MonotonicNonNull EGLDisplay eglDisplay;
|
||||||
private @MonotonicNonNull EGLContext eglContext;
|
private @MonotonicNonNull EGLContext eglContext;
|
||||||
private @MonotonicNonNull SingleFrameGlTextureProcessor matrixTransformationFrameProcessor;
|
private @MonotonicNonNull SingleFrameGlTextureProcessor matrixTextureProcessor;
|
||||||
private int inputTexId;
|
private int inputTexId;
|
||||||
private int outputTexId;
|
private int outputTexId;
|
||||||
private int width;
|
private int width;
|
||||||
|
|
@ -82,8 +82,8 @@ public final class MatrixTransformationProcessorPixelTest {
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void release() throws GlUtil.GlException, FrameProcessingException {
|
public void release() throws GlUtil.GlException, FrameProcessingException {
|
||||||
if (matrixTransformationFrameProcessor != null) {
|
if (matrixTextureProcessor != null) {
|
||||||
matrixTransformationFrameProcessor.release();
|
matrixTextureProcessor.release();
|
||||||
}
|
}
|
||||||
if (eglContext != null && eglDisplay != null) {
|
if (eglContext != null && eglDisplay != null) {
|
||||||
GlUtil.destroyEglContext(eglDisplay, eglContext);
|
GlUtil.destroyEglContext(eglDisplay, eglContext);
|
||||||
|
|
@ -95,12 +95,12 @@ public final class MatrixTransformationProcessorPixelTest {
|
||||||
String testId = "drawFrame_noEdits";
|
String testId = "drawFrame_noEdits";
|
||||||
Matrix identityMatrix = new Matrix();
|
Matrix identityMatrix = new Matrix();
|
||||||
MatrixTransformation noEditsTransformation = (long presentationTimeUs) -> identityMatrix;
|
MatrixTransformation noEditsTransformation = (long presentationTimeUs) -> identityMatrix;
|
||||||
matrixTransformationFrameProcessor =
|
matrixTextureProcessor =
|
||||||
noEditsTransformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
noEditsTransformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
matrixTransformationFrameProcessor.configure(width, height);
|
matrixTextureProcessor.configure(width, height);
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationFrameProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
||||||
|
|
||||||
|
|
@ -120,12 +120,12 @@ public final class MatrixTransformationProcessorPixelTest {
|
||||||
translateRightMatrix.postTranslate(/* dx= */ 1, /* dy= */ 0);
|
translateRightMatrix.postTranslate(/* dx= */ 1, /* dy= */ 0);
|
||||||
MatrixTransformation translateRightTransformation =
|
MatrixTransformation translateRightTransformation =
|
||||||
(long presentationTimeUs) -> translateRightMatrix;
|
(long presentationTimeUs) -> translateRightMatrix;
|
||||||
matrixTransformationFrameProcessor =
|
matrixTextureProcessor =
|
||||||
translateRightTransformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
translateRightTransformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
matrixTransformationFrameProcessor.configure(width, height);
|
matrixTextureProcessor.configure(width, height);
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(TRANSLATE_RIGHT_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(TRANSLATE_RIGHT_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationFrameProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
||||||
|
|
||||||
|
|
@ -144,12 +144,12 @@ public final class MatrixTransformationProcessorPixelTest {
|
||||||
Matrix scaleNarrowMatrix = new Matrix();
|
Matrix scaleNarrowMatrix = new Matrix();
|
||||||
scaleNarrowMatrix.postScale(.5f, 1.2f);
|
scaleNarrowMatrix.postScale(.5f, 1.2f);
|
||||||
MatrixTransformation scaleNarrowTransformation = (long presentationTimeUs) -> scaleNarrowMatrix;
|
MatrixTransformation scaleNarrowTransformation = (long presentationTimeUs) -> scaleNarrowMatrix;
|
||||||
matrixTransformationFrameProcessor =
|
matrixTextureProcessor =
|
||||||
scaleNarrowTransformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
scaleNarrowTransformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
matrixTransformationFrameProcessor.configure(width, height);
|
matrixTextureProcessor.configure(width, height);
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(SCALE_NARROW_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(SCALE_NARROW_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationFrameProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
||||||
|
|
||||||
|
|
@ -168,12 +168,12 @@ public final class MatrixTransformationProcessorPixelTest {
|
||||||
Matrix rotate90Matrix = new Matrix();
|
Matrix rotate90Matrix = new Matrix();
|
||||||
rotate90Matrix.postRotate(/* degrees= */ 90);
|
rotate90Matrix.postRotate(/* degrees= */ 90);
|
||||||
MatrixTransformation rotate90Transformation = (long presentationTimeUs) -> rotate90Matrix;
|
MatrixTransformation rotate90Transformation = (long presentationTimeUs) -> rotate90Matrix;
|
||||||
matrixTransformationFrameProcessor =
|
matrixTextureProcessor =
|
||||||
rotate90Transformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
rotate90Transformation.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
matrixTransformationFrameProcessor.configure(width, height);
|
matrixTextureProcessor.configure(width, height);
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ROTATE_90_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ROTATE_90_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationFrameProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(width, height);
|
||||||
|
|
||||||
|
|
@ -62,7 +62,7 @@ public final class RgbAdjustmentPixelTest {
|
||||||
|
|
||||||
private @MonotonicNonNull EGLDisplay eglDisplay;
|
private @MonotonicNonNull EGLDisplay eglDisplay;
|
||||||
private @MonotonicNonNull EGLContext eglContext;
|
private @MonotonicNonNull EGLContext eglContext;
|
||||||
private @MonotonicNonNull SingleFrameGlTextureProcessor matrixTransformationProcessor;
|
private @MonotonicNonNull SingleFrameGlTextureProcessor matrixTextureProcessor;
|
||||||
private @MonotonicNonNull EGLSurface placeholderEglSurface;
|
private @MonotonicNonNull EGLSurface placeholderEglSurface;
|
||||||
private int inputTexId;
|
private int inputTexId;
|
||||||
private int outputTexId;
|
private int outputTexId;
|
||||||
|
|
@ -94,8 +94,8 @@ public final class RgbAdjustmentPixelTest {
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void release() throws GlUtil.GlException, FrameProcessingException {
|
public void release() throws GlUtil.GlException, FrameProcessingException {
|
||||||
if (matrixTransformationProcessor != null) {
|
if (matrixTextureProcessor != null) {
|
||||||
matrixTransformationProcessor.release();
|
matrixTextureProcessor.release();
|
||||||
}
|
}
|
||||||
GlUtil.destroyEglContext(eglDisplay, eglContext);
|
GlUtil.destroyEglContext(eglDisplay, eglContext);
|
||||||
}
|
}
|
||||||
|
|
@ -104,13 +104,11 @@ public final class RgbAdjustmentPixelTest {
|
||||||
public void drawFrame_identityMatrix_leavesFrameUnchanged() throws Exception {
|
public void drawFrame_identityMatrix_leavesFrameUnchanged() throws Exception {
|
||||||
String testId = "drawFrame_identityMatrix";
|
String testId = "drawFrame_identityMatrix";
|
||||||
RgbMatrix identityMatrix = new RgbAdjustment.Builder().build();
|
RgbMatrix identityMatrix = new RgbAdjustment.Builder().build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor = identityMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
identityMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
Pair<Integer, Integer> outputSize =
|
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -128,15 +126,13 @@ public final class RgbAdjustmentPixelTest {
|
||||||
String testId = "drawFrame_removeColors";
|
String testId = "drawFrame_removeColors";
|
||||||
RgbMatrix removeColorMatrix =
|
RgbMatrix removeColorMatrix =
|
||||||
new RgbAdjustment.Builder().setRedScale(0).setGreenScale(0).setBlueScale(0).build();
|
new RgbAdjustment.Builder().setRedScale(0).setGreenScale(0).setBlueScale(0).build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor = removeColorMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
removeColorMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
Pair<Integer, Integer> outputSize =
|
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap =
|
Bitmap expectedBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapWithSolidColor(
|
BitmapTestUtil.createArgb8888BitmapWithSolidColor(
|
||||||
outputSize.first, outputSize.second, Color.BLACK);
|
outputSize.first, outputSize.second, Color.BLACK);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -153,13 +149,11 @@ public final class RgbAdjustmentPixelTest {
|
||||||
public void drawFrame_redOnlyFilter_removeBlueAndGreenValues() throws Exception {
|
public void drawFrame_redOnlyFilter_removeBlueAndGreenValues() throws Exception {
|
||||||
String testId = "drawFrame_redOnlyFilter";
|
String testId = "drawFrame_redOnlyFilter";
|
||||||
RgbMatrix redOnlyMatrix = new RgbAdjustment.Builder().setBlueScale(0).setGreenScale(0).build();
|
RgbMatrix redOnlyMatrix = new RgbAdjustment.Builder().setBlueScale(0).setGreenScale(0).build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor = redOnlyMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
redOnlyMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
Pair<Integer, Integer> outputSize =
|
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ONLY_RED_CHANNEL_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ONLY_RED_CHANNEL_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -176,13 +170,11 @@ public final class RgbAdjustmentPixelTest {
|
||||||
public void drawFrame_increaseRedChannel_producesBrighterAndRedderFrame() throws Exception {
|
public void drawFrame_increaseRedChannel_producesBrighterAndRedderFrame() throws Exception {
|
||||||
String testId = "drawFrame_increaseRedChannel";
|
String testId = "drawFrame_increaseRedChannel";
|
||||||
RgbMatrix increaseRedMatrix = new RgbAdjustment.Builder().setRedScale(5).build();
|
RgbMatrix increaseRedMatrix = new RgbAdjustment.Builder().setRedScale(5).build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor = increaseRedMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
increaseRedMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
Pair<Integer, Integer> outputSize =
|
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INCREASE_RED_CHANNEL_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INCREASE_RED_CHANNEL_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -200,13 +192,12 @@ public final class RgbAdjustmentPixelTest {
|
||||||
String testId = "drawFrame_increaseBrightness";
|
String testId = "drawFrame_increaseBrightness";
|
||||||
RgbMatrix increaseBrightnessMatrix =
|
RgbMatrix increaseBrightnessMatrix =
|
||||||
new RgbAdjustment.Builder().setRedScale(5).setGreenScale(5).setBlueScale(5).build();
|
new RgbAdjustment.Builder().setRedScale(5).setGreenScale(5).setBlueScale(5).build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
increaseBrightnessMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
increaseBrightnessMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
Pair<Integer, Integer> outputSize =
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INCREASE_BRIGHTNESS_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INCREASE_BRIGHTNESS_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -225,19 +216,18 @@ public final class RgbAdjustmentPixelTest {
|
||||||
RgbMatrix noRed = new RgbAdjustment.Builder().setRedScale(0).build();
|
RgbMatrix noRed = new RgbAdjustment.Builder().setRedScale(0).build();
|
||||||
RgbMatrix noGreen = new RgbAdjustment.Builder().setGreenScale(0).build();
|
RgbMatrix noGreen = new RgbAdjustment.Builder().setGreenScale(0).build();
|
||||||
RgbMatrix noBlue = new RgbAdjustment.Builder().setBlueScale(0).build();
|
RgbMatrix noBlue = new RgbAdjustment.Builder().setBlueScale(0).build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
MatrixTransformationProcessor.create(
|
MatrixTextureProcessor.create(
|
||||||
context,
|
context,
|
||||||
/* matrixTransformations= */ ImmutableList.of(),
|
/* matrixTransformations= */ ImmutableList.of(),
|
||||||
/* rgbMatrices= */ ImmutableList.of(noRed, noGreen, noBlue),
|
/* rgbMatrices= */ ImmutableList.of(noRed, noGreen, noBlue),
|
||||||
/* useHdr= */ false);
|
/* useHdr= */ false);
|
||||||
Pair<Integer, Integer> outputSize =
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap =
|
Bitmap expectedBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapWithSolidColor(
|
BitmapTestUtil.createArgb8888BitmapWithSolidColor(
|
||||||
outputSize.first, outputSize.second, Color.BLACK);
|
outputSize.first, outputSize.second, Color.BLACK);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -255,17 +245,16 @@ public final class RgbAdjustmentPixelTest {
|
||||||
String testId = "drawFrame_removeBlueAndGreenValuesInAChain";
|
String testId = "drawFrame_removeBlueAndGreenValuesInAChain";
|
||||||
RgbMatrix noGreen = new RgbAdjustment.Builder().setGreenScale(0).build();
|
RgbMatrix noGreen = new RgbAdjustment.Builder().setGreenScale(0).build();
|
||||||
RgbMatrix noBlue = new RgbAdjustment.Builder().setBlueScale(0).build();
|
RgbMatrix noBlue = new RgbAdjustment.Builder().setBlueScale(0).build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
MatrixTransformationProcessor.create(
|
MatrixTextureProcessor.create(
|
||||||
context,
|
context,
|
||||||
/* matrixTransformations= */ ImmutableList.of(),
|
/* matrixTransformations= */ ImmutableList.of(),
|
||||||
/* rgbMatrices= */ ImmutableList.of(noGreen, noBlue),
|
/* rgbMatrices= */ ImmutableList.of(noGreen, noBlue),
|
||||||
/* useHdr= */ false);
|
/* useHdr= */ false);
|
||||||
Pair<Integer, Integer> outputSize =
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ONLY_RED_CHANNEL_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ONLY_RED_CHANNEL_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -285,17 +274,16 @@ public final class RgbAdjustmentPixelTest {
|
||||||
RgbMatrix scaleRedMatrix = new RgbAdjustment.Builder().setRedScale(redScale).build();
|
RgbMatrix scaleRedMatrix = new RgbAdjustment.Builder().setRedScale(redScale).build();
|
||||||
RgbMatrix scaleRedByInverseMatrix =
|
RgbMatrix scaleRedByInverseMatrix =
|
||||||
new RgbAdjustment.Builder().setRedScale(1 / redScale).build();
|
new RgbAdjustment.Builder().setRedScale(1 / redScale).build();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
MatrixTransformationProcessor.create(
|
MatrixTextureProcessor.create(
|
||||||
context,
|
context,
|
||||||
/* matrixTransformations= */ ImmutableList.of(),
|
/* matrixTransformations= */ ImmutableList.of(),
|
||||||
/* rgbMatrices= */ ImmutableList.of(scaleRedMatrix, scaleRedByInverseMatrix),
|
/* rgbMatrices= */ ImmutableList.of(scaleRedMatrix, scaleRedByInverseMatrix),
|
||||||
/* useHdr= */ false);
|
/* useHdr= */ false);
|
||||||
Pair<Integer, Integer> outputSize =
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(ORIGINAL_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ public final class RgbFilterPixelTest {
|
||||||
|
|
||||||
private @MonotonicNonNull EGLDisplay eglDisplay;
|
private @MonotonicNonNull EGLDisplay eglDisplay;
|
||||||
private @MonotonicNonNull EGLContext eglContext;
|
private @MonotonicNonNull EGLContext eglContext;
|
||||||
private @MonotonicNonNull SingleFrameGlTextureProcessor matrixTransformationProcessor;
|
private @MonotonicNonNull SingleFrameGlTextureProcessor matrixTextureProcessor;
|
||||||
private @MonotonicNonNull EGLSurface placeholderEglSurface;
|
private @MonotonicNonNull EGLSurface placeholderEglSurface;
|
||||||
private int inputTexId;
|
private int inputTexId;
|
||||||
private int outputTexId;
|
private int outputTexId;
|
||||||
|
|
@ -90,8 +90,8 @@ public final class RgbFilterPixelTest {
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void release() throws GlUtil.GlException, FrameProcessingException {
|
public void release() throws GlUtil.GlException, FrameProcessingException {
|
||||||
if (matrixTransformationProcessor != null) {
|
if (matrixTextureProcessor != null) {
|
||||||
matrixTransformationProcessor.release();
|
matrixTextureProcessor.release();
|
||||||
}
|
}
|
||||||
GlUtil.destroyEglContext(eglDisplay, eglContext);
|
GlUtil.destroyEglContext(eglDisplay, eglContext);
|
||||||
}
|
}
|
||||||
|
|
@ -100,13 +100,11 @@ public final class RgbFilterPixelTest {
|
||||||
public void drawFrame_grayscale_producesGrayscaleImage() throws Exception {
|
public void drawFrame_grayscale_producesGrayscaleImage() throws Exception {
|
||||||
String testId = "drawFrame_grayscale";
|
String testId = "drawFrame_grayscale";
|
||||||
RgbMatrix grayscaleMatrix = RgbFilter.createGrayscaleFilter();
|
RgbMatrix grayscaleMatrix = RgbFilter.createGrayscaleFilter();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor = grayscaleMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
grayscaleMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
Pair<Integer, Integer> outputSize =
|
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(GRAYSCALE_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(GRAYSCALE_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
@ -123,13 +121,11 @@ public final class RgbFilterPixelTest {
|
||||||
public void drawFrame_inverted_producesInvertedFrame() throws Exception {
|
public void drawFrame_inverted_producesInvertedFrame() throws Exception {
|
||||||
String testId = "drawFrame_inverted";
|
String testId = "drawFrame_inverted";
|
||||||
RgbMatrix invertedMatrix = RgbFilter.createInvertedFilter();
|
RgbMatrix invertedMatrix = RgbFilter.createInvertedFilter();
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor = invertedMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
||||||
invertedMatrix.toGlTextureProcessor(context, /* useHdr= */ false);
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
Pair<Integer, Integer> outputSize =
|
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INVERT_PNG_ASSET_PATH);
|
Bitmap expectedBitmap = BitmapTestUtil.readBitmap(INVERT_PNG_ASSET_PATH);
|
||||||
|
|
||||||
matrixTransformationProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
matrixTextureProcessor.drawFrame(inputTexId, /* presentationTimeUs= */ 0);
|
||||||
Bitmap actualBitmap =
|
Bitmap actualBitmap =
|
||||||
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
BitmapTestUtil.createArgb8888BitmapFromCurrentGlFramebuffer(
|
||||||
outputSize.first, outputSize.second);
|
outputSize.first, outputSize.second);
|
||||||
|
|
|
||||||
|
|
@ -52,15 +52,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
* Wrapper around a {@link GlTextureProcessor} that writes to the provided output surface and
|
* Wrapper around a {@link GlTextureProcessor} that writes to the provided output surface and
|
||||||
* optional debug surface view.
|
* optional debug surface view.
|
||||||
*
|
*
|
||||||
* <p>The wrapped {@link GlTextureProcessor} applies the {@link GlMatrixTransformation} instances
|
* <p>The wrapped {@link GlTextureProcessor} applies the {@link GlMatrixTransformation} and {@link
|
||||||
* passed to the constructor, followed by any transformations needed to convert the frames to the
|
* RgbMatrix} instances passed to the constructor, followed by any transformations needed to convert
|
||||||
* dimensions specified by the provided {@link SurfaceInfo}.
|
* the frames to the dimensions specified by the provided {@link SurfaceInfo}.
|
||||||
*
|
*
|
||||||
* <p>This wrapper is used for the final {@link GlTextureProcessor} instance in the chain of {@link
|
* <p>This wrapper is used for the final {@link GlTextureProcessor} instance in the chain of {@link
|
||||||
* GlTextureProcessor} instances used by {@link FrameProcessor}.
|
* GlTextureProcessor} instances used by {@link FrameProcessor}.
|
||||||
*/
|
*/
|
||||||
/* package */ final class FinalMatrixTransformationProcessorWrapper
|
/* package */ final class FinalMatrixTextureProcessorWrapper implements ExternalTextureProcessor {
|
||||||
implements ExternalTextureProcessor {
|
|
||||||
|
|
||||||
private static final String TAG = "FinalProcessorWrapper";
|
private static final String TAG = "FinalProcessorWrapper";
|
||||||
|
|
||||||
|
|
@ -80,7 +79,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
|
|
||||||
private int inputWidth;
|
private int inputWidth;
|
||||||
private int inputHeight;
|
private int inputHeight;
|
||||||
@Nullable private MatrixTransformationProcessor matrixTransformationProcessor;
|
@Nullable private MatrixTextureProcessor matrixTextureProcessor;
|
||||||
@Nullable private SurfaceViewWrapper debugSurfaceViewWrapper;
|
@Nullable private SurfaceViewWrapper debugSurfaceViewWrapper;
|
||||||
private InputListener inputListener;
|
private InputListener inputListener;
|
||||||
private @MonotonicNonNull Pair<Integer, Integer> outputSizeBeforeSurfaceTransformation;
|
private @MonotonicNonNull Pair<Integer, Integer> outputSizeBeforeSurfaceTransformation;
|
||||||
|
|
@ -96,7 +95,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
@Nullable
|
@Nullable
|
||||||
private EGLSurface outputEglSurface;
|
private EGLSurface outputEglSurface;
|
||||||
|
|
||||||
public FinalMatrixTransformationProcessorWrapper(
|
public FinalMatrixTextureProcessorWrapper(
|
||||||
Context context,
|
Context context,
|
||||||
EGLDisplay eglDisplay,
|
EGLDisplay eglDisplay,
|
||||||
EGLContext eglContext,
|
EGLContext eglContext,
|
||||||
|
|
@ -192,8 +191,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
@Override
|
@Override
|
||||||
@WorkerThread
|
@WorkerThread
|
||||||
public void release() throws FrameProcessingException {
|
public void release() throws FrameProcessingException {
|
||||||
if (matrixTransformationProcessor != null) {
|
if (matrixTextureProcessor != null) {
|
||||||
matrixTransformationProcessor.release();
|
matrixTextureProcessor.release();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -206,8 +205,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
/* destPost= */ 0,
|
/* destPost= */ 0,
|
||||||
/* length= */ textureTransformMatrix.length);
|
/* length= */ textureTransformMatrix.length);
|
||||||
|
|
||||||
if (matrixTransformationProcessor != null) {
|
if (matrixTextureProcessor != null) {
|
||||||
matrixTransformationProcessor.setTextureTransformMatrix(textureTransformMatrix);
|
matrixTextureProcessor.setTextureTransformMatrix(textureTransformMatrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -271,8 +270,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
|
|
||||||
EGLSurface outputEglSurface = this.outputEglSurface;
|
EGLSurface outputEglSurface = this.outputEglSurface;
|
||||||
SurfaceInfo outputSurfaceInfo = this.outputSurfaceInfo;
|
SurfaceInfo outputSurfaceInfo = this.outputSurfaceInfo;
|
||||||
MatrixTransformationProcessor matrixTransformationProcessor =
|
MatrixTextureProcessor matrixTextureProcessor = this.matrixTextureProcessor;
|
||||||
this.matrixTransformationProcessor;
|
|
||||||
|
|
||||||
GlUtil.focusEglSurface(
|
GlUtil.focusEglSurface(
|
||||||
eglDisplay,
|
eglDisplay,
|
||||||
|
|
@ -281,7 +279,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
outputSurfaceInfo.width,
|
outputSurfaceInfo.width,
|
||||||
outputSurfaceInfo.height);
|
outputSurfaceInfo.height);
|
||||||
GlUtil.clearOutputFrame();
|
GlUtil.clearOutputFrame();
|
||||||
matrixTransformationProcessor.drawFrame(inputTexture.texId, presentationTimeUs);
|
matrixTextureProcessor.drawFrame(inputTexture.texId, presentationTimeUs);
|
||||||
|
|
||||||
if (dropLateFrame && System.nanoTime() > releaseTimeNs) {
|
if (dropLateFrame && System.nanoTime() > releaseTimeNs) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -291,7 +289,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EnsuresNonNullIf(
|
@EnsuresNonNullIf(
|
||||||
expression = {"outputSurfaceInfo", "outputEglSurface", "matrixTransformationProcessor"},
|
expression = {"outputSurfaceInfo", "outputEglSurface", "matrixTextureProcessor"},
|
||||||
result = true)
|
result = true)
|
||||||
private synchronized boolean ensureConfigured(int inputWidth, int inputHeight)
|
private synchronized boolean ensureConfigured(int inputWidth, int inputHeight)
|
||||||
throws FrameProcessingException, GlUtil.GlException {
|
throws FrameProcessingException, GlUtil.GlException {
|
||||||
|
|
@ -313,9 +311,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outputSurfaceInfo == null) {
|
if (outputSurfaceInfo == null) {
|
||||||
if (matrixTransformationProcessor != null) {
|
if (matrixTextureProcessor != null) {
|
||||||
matrixTransformationProcessor.release();
|
matrixTextureProcessor.release();
|
||||||
matrixTransformationProcessor = null;
|
matrixTextureProcessor = null;
|
||||||
}
|
}
|
||||||
outputEglSurface = null;
|
outputEglSurface = null;
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -342,14 +340,13 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
this.debugSurfaceView = debugSurfaceView;
|
this.debugSurfaceView = debugSurfaceView;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (matrixTransformationProcessor != null && outputSizeOrRotationChanged) {
|
if (matrixTextureProcessor != null && outputSizeOrRotationChanged) {
|
||||||
matrixTransformationProcessor.release();
|
matrixTextureProcessor.release();
|
||||||
matrixTransformationProcessor = null;
|
matrixTextureProcessor = null;
|
||||||
outputSizeOrRotationChanged = false;
|
outputSizeOrRotationChanged = false;
|
||||||
}
|
}
|
||||||
if (matrixTransformationProcessor == null) {
|
if (matrixTextureProcessor == null) {
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor = createMatrixTextureProcessorForOutputSurface(outputSurfaceInfo);
|
||||||
createMatrixTransformationProcessorForOutputSurface(outputSurfaceInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.outputSurfaceInfo = outputSurfaceInfo;
|
this.outputSurfaceInfo = outputSurfaceInfo;
|
||||||
|
|
@ -357,7 +354,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MatrixTransformationProcessor createMatrixTransformationProcessorForOutputSurface(
|
private MatrixTextureProcessor createMatrixTextureProcessorForOutputSurface(
|
||||||
SurfaceInfo outputSurfaceInfo) throws FrameProcessingException {
|
SurfaceInfo outputSurfaceInfo) throws FrameProcessingException {
|
||||||
ImmutableList.Builder<GlMatrixTransformation> matrixTransformationListBuilder =
|
ImmutableList.Builder<GlMatrixTransformation> matrixTransformationListBuilder =
|
||||||
new ImmutableList.Builder<GlMatrixTransformation>().addAll(matrixTransformations);
|
new ImmutableList.Builder<GlMatrixTransformation>().addAll(matrixTransformations);
|
||||||
|
|
@ -371,39 +368,37 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
Presentation.createForWidthAndHeight(
|
Presentation.createForWidthAndHeight(
|
||||||
outputSurfaceInfo.width, outputSurfaceInfo.height, Presentation.LAYOUT_SCALE_TO_FIT));
|
outputSurfaceInfo.width, outputSurfaceInfo.height, Presentation.LAYOUT_SCALE_TO_FIT));
|
||||||
|
|
||||||
MatrixTransformationProcessor matrixTransformationProcessor;
|
MatrixTextureProcessor matrixTextureProcessor;
|
||||||
ImmutableList<GlMatrixTransformation> expandedMatrixTransformations =
|
ImmutableList<GlMatrixTransformation> expandedMatrixTransformations =
|
||||||
matrixTransformationListBuilder.build();
|
matrixTransformationListBuilder.build();
|
||||||
if (sampleFromExternalTexture) {
|
if (sampleFromExternalTexture) {
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
MatrixTransformationProcessor.createWithExternalSamplerApplyingEotfThenOetf(
|
MatrixTextureProcessor.createWithExternalSamplerApplyingEotfThenOetf(
|
||||||
context, expandedMatrixTransformations, rgbMatrices, colorInfo);
|
context, expandedMatrixTransformations, rgbMatrices, colorInfo);
|
||||||
} else {
|
} else {
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
MatrixTransformationProcessor.createApplyingOetf(
|
MatrixTextureProcessor.createApplyingOetf(
|
||||||
context, expandedMatrixTransformations, rgbMatrices, colorInfo);
|
context, expandedMatrixTransformations, rgbMatrices, colorInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
matrixTransformationProcessor.setTextureTransformMatrix(textureTransformMatrix);
|
matrixTextureProcessor.setTextureTransformMatrix(textureTransformMatrix);
|
||||||
Pair<Integer, Integer> outputSize =
|
Pair<Integer, Integer> outputSize = matrixTextureProcessor.configure(inputWidth, inputHeight);
|
||||||
matrixTransformationProcessor.configure(inputWidth, inputHeight);
|
|
||||||
checkState(outputSize.first == outputSurfaceInfo.width);
|
checkState(outputSize.first == outputSurfaceInfo.width);
|
||||||
checkState(outputSize.second == outputSurfaceInfo.height);
|
checkState(outputSize.second == outputSurfaceInfo.height);
|
||||||
return matrixTransformationProcessor;
|
return matrixTextureProcessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void maybeRenderFrameToDebugSurface(TextureInfo inputTexture, long presentationTimeUs) {
|
private void maybeRenderFrameToDebugSurface(TextureInfo inputTexture, long presentationTimeUs) {
|
||||||
if (debugSurfaceViewWrapper == null || matrixTransformationProcessor == null) {
|
if (debugSurfaceViewWrapper == null || this.matrixTextureProcessor == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MatrixTransformationProcessor matrixTransformationProcessor =
|
MatrixTextureProcessor matrixTextureProcessor = this.matrixTextureProcessor;
|
||||||
this.matrixTransformationProcessor;
|
|
||||||
try {
|
try {
|
||||||
debugSurfaceViewWrapper.maybeRenderToSurfaceView(
|
debugSurfaceViewWrapper.maybeRenderToSurfaceView(
|
||||||
() -> {
|
() -> {
|
||||||
GlUtil.clearOutputFrame();
|
GlUtil.clearOutputFrame();
|
||||||
matrixTransformationProcessor.drawFrame(inputTexture.texId, presentationTimeUs);
|
matrixTextureProcessor.drawFrame(inputTexture.texId, presentationTimeUs);
|
||||||
});
|
});
|
||||||
} catch (FrameProcessingException | GlUtil.GlException e) {
|
} catch (FrameProcessingException | GlUtil.GlException e) {
|
||||||
Log.d(TAG, "Error rendering to debug preview", e);
|
Log.d(TAG, "Error rendering to debug preview", e);
|
||||||
|
|
@ -159,15 +159,15 @@ public final class GlEffectsFrameProcessor implements FrameProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Combines consecutive {@link GlMatrixTransformation} instances into a single {@link
|
* Combines consecutive {@link GlMatrixTransformation} and {@link RgbMatrix} instances into a
|
||||||
* MatrixTransformationProcessor} and converts all other {@link GlEffect} instances to separate
|
* single {@link MatrixTextureProcessor} and converts all other {@link GlEffect} instances to
|
||||||
* {@link GlTextureProcessor} instances.
|
* separate {@link GlTextureProcessor} instances.
|
||||||
*
|
*
|
||||||
* <p>All {@link Effect} instances must be {@link GlEffect} instances.
|
* <p>All {@link Effect} instances must be {@link GlEffect} instances.
|
||||||
*
|
*
|
||||||
* @return A non-empty list of {@link GlTextureProcessor} instances to apply in the given order.
|
* @return A non-empty list of {@link GlTextureProcessor} instances to apply in the given order.
|
||||||
* The first is an {@link ExternalTextureProcessor} and the last is a {@link
|
* The first is an {@link ExternalTextureProcessor} and the last is a {@link
|
||||||
* FinalMatrixTransformationProcessorWrapper}.
|
* FinalMatrixTextureProcessorWrapper}.
|
||||||
*/
|
*/
|
||||||
// TODO(b/239757183): Squash GlMatrixTransformation and RgbMatrix together.
|
// TODO(b/239757183): Squash GlMatrixTransformation and RgbMatrix together.
|
||||||
private static ImmutableList<GlTextureProcessor> getGlTextureProcessorsForGlEffects(
|
private static ImmutableList<GlTextureProcessor> getGlTextureProcessorsForGlEffects(
|
||||||
|
|
@ -206,17 +206,17 @@ public final class GlEffectsFrameProcessor implements FrameProcessor {
|
||||||
matrixTransformationListBuilder.build();
|
matrixTransformationListBuilder.build();
|
||||||
ImmutableList<RgbMatrix> rgbMatrices = rgbMatrixListBuilder.build();
|
ImmutableList<RgbMatrix> rgbMatrices = rgbMatrixListBuilder.build();
|
||||||
if (!matrixTransformations.isEmpty() || !rgbMatrices.isEmpty() || sampleFromExternalTexture) {
|
if (!matrixTransformations.isEmpty() || !rgbMatrices.isEmpty() || sampleFromExternalTexture) {
|
||||||
MatrixTransformationProcessor matrixTransformationProcessor;
|
MatrixTextureProcessor matrixTextureProcessor;
|
||||||
if (sampleFromExternalTexture) {
|
if (sampleFromExternalTexture) {
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
MatrixTransformationProcessor.createWithExternalSamplerApplyingEotf(
|
MatrixTextureProcessor.createWithExternalSamplerApplyingEotf(
|
||||||
context, matrixTransformations, rgbMatrices, colorInfo);
|
context, matrixTransformations, rgbMatrices, colorInfo);
|
||||||
} else {
|
} else {
|
||||||
matrixTransformationProcessor =
|
matrixTextureProcessor =
|
||||||
MatrixTransformationProcessor.create(
|
MatrixTextureProcessor.create(
|
||||||
context, matrixTransformations, rgbMatrices, ColorInfo.isTransferHdr(colorInfo));
|
context, matrixTransformations, rgbMatrices, ColorInfo.isTransferHdr(colorInfo));
|
||||||
}
|
}
|
||||||
textureProcessorListBuilder.add(matrixTransformationProcessor);
|
textureProcessorListBuilder.add(matrixTextureProcessor);
|
||||||
matrixTransformationListBuilder = new ImmutableList.Builder<>();
|
matrixTransformationListBuilder = new ImmutableList.Builder<>();
|
||||||
rgbMatrixListBuilder = new ImmutableList.Builder<>();
|
rgbMatrixListBuilder = new ImmutableList.Builder<>();
|
||||||
sampleFromExternalTexture = false;
|
sampleFromExternalTexture = false;
|
||||||
|
|
@ -226,7 +226,7 @@ public final class GlEffectsFrameProcessor implements FrameProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
textureProcessorListBuilder.add(
|
textureProcessorListBuilder.add(
|
||||||
new FinalMatrixTransformationProcessorWrapper(
|
new FinalMatrixTextureProcessorWrapper(
|
||||||
context,
|
context,
|
||||||
eglDisplay,
|
eglDisplay,
|
||||||
eglContext,
|
eglContext,
|
||||||
|
|
@ -271,7 +271,7 @@ public final class GlEffectsFrameProcessor implements FrameProcessor {
|
||||||
private final ExternalTextureManager inputExternalTextureManager;
|
private final ExternalTextureManager inputExternalTextureManager;
|
||||||
private final Surface inputSurface;
|
private final Surface inputSurface;
|
||||||
private final boolean releaseFramesAutomatically;
|
private final boolean releaseFramesAutomatically;
|
||||||
private final FinalMatrixTransformationProcessorWrapper finalTextureProcessorWrapper;
|
private final FinalMatrixTextureProcessorWrapper finalTextureProcessorWrapper;
|
||||||
private final ImmutableList<GlTextureProcessor> allTextureProcessors;
|
private final ImmutableList<GlTextureProcessor> allTextureProcessors;
|
||||||
|
|
||||||
private @MonotonicNonNull FrameInfo nextInputFrameInfo;
|
private @MonotonicNonNull FrameInfo nextInputFrameInfo;
|
||||||
|
|
@ -297,15 +297,14 @@ public final class GlEffectsFrameProcessor implements FrameProcessor {
|
||||||
|
|
||||||
checkState(!textureProcessors.isEmpty());
|
checkState(!textureProcessors.isEmpty());
|
||||||
checkState(textureProcessors.get(0) instanceof ExternalTextureProcessor);
|
checkState(textureProcessors.get(0) instanceof ExternalTextureProcessor);
|
||||||
checkState(getLast(textureProcessors) instanceof FinalMatrixTransformationProcessorWrapper);
|
checkState(getLast(textureProcessors) instanceof FinalMatrixTextureProcessorWrapper);
|
||||||
ExternalTextureProcessor inputExternalTextureProcessor =
|
ExternalTextureProcessor inputExternalTextureProcessor =
|
||||||
(ExternalTextureProcessor) textureProcessors.get(0);
|
(ExternalTextureProcessor) textureProcessors.get(0);
|
||||||
inputExternalTextureManager =
|
inputExternalTextureManager =
|
||||||
new ExternalTextureManager(inputExternalTextureProcessor, frameProcessingTaskExecutor);
|
new ExternalTextureManager(inputExternalTextureProcessor, frameProcessingTaskExecutor);
|
||||||
inputExternalTextureProcessor.setInputListener(inputExternalTextureManager);
|
inputExternalTextureProcessor.setInputListener(inputExternalTextureManager);
|
||||||
inputSurface = new Surface(inputExternalTextureManager.getSurfaceTexture());
|
inputSurface = new Surface(inputExternalTextureManager.getSurfaceTexture());
|
||||||
finalTextureProcessorWrapper =
|
finalTextureProcessorWrapper = (FinalMatrixTextureProcessorWrapper) getLast(textureProcessors);
|
||||||
(FinalMatrixTransformationProcessorWrapper) getLast(textureProcessors);
|
|
||||||
allTextureProcessors = textureProcessors;
|
allTextureProcessors = textureProcessors;
|
||||||
previousStreamOffsetUs = C.TIME_UNSET;
|
previousStreamOffsetUs = C.TIME_UNSET;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ public interface GlMatrixTransformation extends GlEffect {
|
||||||
@Override
|
@Override
|
||||||
default SingleFrameGlTextureProcessor toGlTextureProcessor(Context context, boolean useHdr)
|
default SingleFrameGlTextureProcessor toGlTextureProcessor(Context context, boolean useHdr)
|
||||||
throws FrameProcessingException {
|
throws FrameProcessingException {
|
||||||
return MatrixTransformationProcessor.create(
|
return MatrixTextureProcessor.create(
|
||||||
context,
|
context,
|
||||||
/* matrixTransformations= */ ImmutableList.of(this),
|
/* matrixTransformations= */ ImmutableList.of(this),
|
||||||
/* rgbMatrices= */ ImmutableList.of(),
|
/* rgbMatrices= */ ImmutableList.of(),
|
||||||
|
|
|
||||||
|
|
@ -50,10 +50,9 @@ import java.util.List;
|
||||||
*
|
*
|
||||||
* <p>Can copy frames from an external texture and apply color transformations for HDR if needed.
|
* <p>Can copy frames from an external texture and apply color transformations for HDR if needed.
|
||||||
*/
|
*/
|
||||||
// TODO(b/239757183): Rename Matrix to a more generic name.
|
|
||||||
@UnstableApi
|
@UnstableApi
|
||||||
@SuppressWarnings("FunctionalInterfaceClash") // b/228192298
|
@SuppressWarnings("FunctionalInterfaceClash") // b/228192298
|
||||||
/* package */ final class MatrixTransformationProcessor extends SingleFrameGlTextureProcessor
|
/* package */ final class MatrixTextureProcessor extends SingleFrameGlTextureProcessor
|
||||||
implements ExternalTextureProcessor {
|
implements ExternalTextureProcessor {
|
||||||
|
|
||||||
private static final String VERTEX_SHADER_TRANSFORMATION_PATH =
|
private static final String VERTEX_SHADER_TRANSFORMATION_PATH =
|
||||||
|
|
@ -142,7 +141,7 @@ import java.util.List;
|
||||||
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
||||||
* operation fails or is unsupported.
|
* operation fails or is unsupported.
|
||||||
*/
|
*/
|
||||||
public static MatrixTransformationProcessor create(
|
public static MatrixTextureProcessor create(
|
||||||
Context context,
|
Context context,
|
||||||
List<GlMatrixTransformation> matrixTransformations,
|
List<GlMatrixTransformation> matrixTransformations,
|
||||||
List<RgbMatrix> rgbMatrices,
|
List<RgbMatrix> rgbMatrices,
|
||||||
|
|
@ -153,7 +152,7 @@ import java.util.List;
|
||||||
context, VERTEX_SHADER_TRANSFORMATION_PATH, FRAGMENT_SHADER_TRANSFORMATION_PATH);
|
context, VERTEX_SHADER_TRANSFORMATION_PATH, FRAGMENT_SHADER_TRANSFORMATION_PATH);
|
||||||
|
|
||||||
// No transfer functions needed, because input and output are both optical colors.
|
// No transfer functions needed, because input and output are both optical colors.
|
||||||
return new MatrixTransformationProcessor(
|
return new MatrixTextureProcessor(
|
||||||
glProgram,
|
glProgram,
|
||||||
ImmutableList.copyOf(matrixTransformations),
|
ImmutableList.copyOf(matrixTransformations),
|
||||||
ImmutableList.copyOf(rgbMatrices),
|
ImmutableList.copyOf(rgbMatrices),
|
||||||
|
|
@ -183,7 +182,7 @@ import java.util.List;
|
||||||
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
||||||
* operation fails or is unsupported.
|
* operation fails or is unsupported.
|
||||||
*/
|
*/
|
||||||
public static MatrixTransformationProcessor createWithExternalSamplerApplyingEotf(
|
public static MatrixTextureProcessor createWithExternalSamplerApplyingEotf(
|
||||||
Context context,
|
Context context,
|
||||||
List<GlMatrixTransformation> matrixTransformations,
|
List<GlMatrixTransformation> matrixTransformations,
|
||||||
List<RgbMatrix> rgbMatrices,
|
List<RgbMatrix> rgbMatrices,
|
||||||
|
|
@ -217,7 +216,7 @@ import java.util.List;
|
||||||
glProgram.setIntUniform("uEotfColorTransfer", colorTransfer);
|
glProgram.setIntUniform("uEotfColorTransfer", colorTransfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new MatrixTransformationProcessor(
|
return new MatrixTextureProcessor(
|
||||||
glProgram,
|
glProgram,
|
||||||
ImmutableList.copyOf(matrixTransformations),
|
ImmutableList.copyOf(matrixTransformations),
|
||||||
ImmutableList.copyOf(rgbMatrices),
|
ImmutableList.copyOf(rgbMatrices),
|
||||||
|
|
@ -243,7 +242,7 @@ import java.util.List;
|
||||||
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
||||||
* operation fails or is unsupported.
|
* operation fails or is unsupported.
|
||||||
*/
|
*/
|
||||||
public static MatrixTransformationProcessor createApplyingOetf(
|
public static MatrixTextureProcessor createApplyingOetf(
|
||||||
Context context,
|
Context context,
|
||||||
List<GlMatrixTransformation> matrixTransformations,
|
List<GlMatrixTransformation> matrixTransformations,
|
||||||
List<RgbMatrix> rgbMatrices,
|
List<RgbMatrix> rgbMatrices,
|
||||||
|
|
@ -264,7 +263,7 @@ import java.util.List;
|
||||||
glProgram.setIntUniform("uOetfColorTransfer", colorTransfer);
|
glProgram.setIntUniform("uOetfColorTransfer", colorTransfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new MatrixTransformationProcessor(
|
return new MatrixTextureProcessor(
|
||||||
glProgram,
|
glProgram,
|
||||||
ImmutableList.copyOf(matrixTransformations),
|
ImmutableList.copyOf(matrixTransformations),
|
||||||
ImmutableList.copyOf(rgbMatrices),
|
ImmutableList.copyOf(rgbMatrices),
|
||||||
|
|
@ -290,7 +289,7 @@ import java.util.List;
|
||||||
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
* @throws FrameProcessingException If a problem occurs while reading shader files or an OpenGL
|
||||||
* operation fails or is unsupported.
|
* operation fails or is unsupported.
|
||||||
*/
|
*/
|
||||||
public static MatrixTransformationProcessor createWithExternalSamplerApplyingEotfThenOetf(
|
public static MatrixTextureProcessor createWithExternalSamplerApplyingEotfThenOetf(
|
||||||
Context context,
|
Context context,
|
||||||
List<GlMatrixTransformation> matrixTransformations,
|
List<GlMatrixTransformation> matrixTransformations,
|
||||||
List<RgbMatrix> rgbMatrices,
|
List<RgbMatrix> rgbMatrices,
|
||||||
|
|
@ -322,7 +321,7 @@ import java.util.List;
|
||||||
glProgram.setIntUniform("uEotfColorTransfer", Format.NO_VALUE);
|
glProgram.setIntUniform("uEotfColorTransfer", Format.NO_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new MatrixTransformationProcessor(
|
return new MatrixTextureProcessor(
|
||||||
glProgram,
|
glProgram,
|
||||||
ImmutableList.copyOf(matrixTransformations),
|
ImmutableList.copyOf(matrixTransformations),
|
||||||
ImmutableList.copyOf(rgbMatrices),
|
ImmutableList.copyOf(rgbMatrices),
|
||||||
|
|
@ -340,7 +339,7 @@ import java.util.List;
|
||||||
* @param useHdr Whether to process the input as an HDR signal. Using HDR requires the {@code
|
* @param useHdr Whether to process the input as an HDR signal. Using HDR requires the {@code
|
||||||
* EXT_YUV_target} OpenGL extension.
|
* EXT_YUV_target} OpenGL extension.
|
||||||
*/
|
*/
|
||||||
private MatrixTransformationProcessor(
|
private MatrixTextureProcessor(
|
||||||
GlProgram glProgram,
|
GlProgram glProgram,
|
||||||
ImmutableList<GlMatrixTransformation> matrixTransformations,
|
ImmutableList<GlMatrixTransformation> matrixTransformations,
|
||||||
ImmutableList<RgbMatrix> rgbMatrices,
|
ImmutableList<RgbMatrix> rgbMatrices,
|
||||||
|
|
@ -91,7 +91,7 @@ public class RgbFilter implements RgbMatrix {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MatrixTransformationProcessor toGlTextureProcessor(Context context, boolean useHdr)
|
public MatrixTextureProcessor toGlTextureProcessor(Context context, boolean useHdr)
|
||||||
throws FrameProcessingException {
|
throws FrameProcessingException {
|
||||||
checkForConsistentHdrSetting(useHdr);
|
checkForConsistentHdrSetting(useHdr);
|
||||||
return RgbMatrix.super.toGlTextureProcessor(context, useHdr);
|
return RgbMatrix.super.toGlTextureProcessor(context, useHdr);
|
||||||
|
|
|
||||||
|
|
@ -40,9 +40,9 @@ public interface RgbMatrix extends GlEffect {
|
||||||
float[] getMatrix(long presentationTimeUs, boolean useHdr);
|
float[] getMatrix(long presentationTimeUs, boolean useHdr);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
default MatrixTransformationProcessor toGlTextureProcessor(Context context, boolean useHdr)
|
default MatrixTextureProcessor toGlTextureProcessor(Context context, boolean useHdr)
|
||||||
throws FrameProcessingException {
|
throws FrameProcessingException {
|
||||||
return MatrixTransformationProcessor.create(
|
return MatrixTextureProcessor.create(
|
||||||
context,
|
context,
|
||||||
/* matrixTransformations= */ ImmutableList.of(),
|
/* matrixTransformations= */ ImmutableList.of(),
|
||||||
/* rgbMatrices= */ ImmutableList.of(this),
|
/* rgbMatrices= */ ImmutableList.of(this),
|
||||||
|
|
|
||||||
|
|
@ -25,8 +25,8 @@ import org.junit.runner.RunWith;
|
||||||
/**
|
/**
|
||||||
* Unit tests for {@link ScaleToFitTransformation}.
|
* Unit tests for {@link ScaleToFitTransformation}.
|
||||||
*
|
*
|
||||||
* <p>See {@code MatrixTransformationPixelTest} for pixel tests testing {@link
|
* <p>See {@code MatrixTextureProcessorPixelTest} for pixel tests testing {@link
|
||||||
* MatrixTransformationProcessor} given a transformation matrix.
|
* MatrixTextureProcessor} given a transformation matrix.
|
||||||
*/
|
*/
|
||||||
@RunWith(AndroidJUnit4.class)
|
@RunWith(AndroidJUnit4.class)
|
||||||
public final class ScaleToFitTransformationTest {
|
public final class ScaleToFitTransformationTest {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue