| Index: webrtc/sdk/android/api/org/webrtc/YuvConverter.java
|
| diff --git a/webrtc/sdk/android/api/org/webrtc/YuvConverter.java b/webrtc/sdk/android/api/org/webrtc/YuvConverter.java
|
| index 050d69de8edbaa3c95d37cd8f1750bf740e974d9..bd6f8af76abcdfb703acf4987bff52e29f17992c 100644
|
| --- a/webrtc/sdk/android/api/org/webrtc/YuvConverter.java
|
| +++ b/webrtc/sdk/android/api/org/webrtc/YuvConverter.java
|
| @@ -80,15 +80,12 @@ class YuvConverter {
|
| + "}\n";
|
| // clang-format on
|
|
|
| - private final int frameBufferId;
|
| - private final int frameTextureId;
|
| + private final GlTextureFrameBuffer textureFrameBuffer;
|
| private final GlShader shader;
|
| private final int texMatrixLoc;
|
| private final int xUnitLoc;
|
| private final int coeffsLoc;
|
| private final ThreadUtils.ThreadChecker threadChecker = new ThreadUtils.ThreadChecker();
|
| - private int frameBufferWidth;
|
| - private int frameBufferHeight;
|
| private boolean released = false;
|
|
|
| /**
|
| @@ -96,25 +93,7 @@ class YuvConverter {
|
| */
|
| public YuvConverter() {
|
| threadChecker.checkIsOnValidThread();
|
| - frameTextureId = GlUtil.generateTexture(GLES20.GL_TEXTURE_2D);
|
| - this.frameBufferWidth = 0;
|
| - this.frameBufferHeight = 0;
|
| -
|
| - // Create framebuffer object and bind it.
|
| - final int frameBuffers[] = new int[1];
|
| - GLES20.glGenFramebuffers(1, frameBuffers, 0);
|
| - frameBufferId = frameBuffers[0];
|
| - GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBufferId);
|
| - GlUtil.checkNoGLES2Error("Generate framebuffer");
|
| -
|
| - // Attach the texture to the framebuffer as color attachment.
|
| - GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
|
| - GLES20.GL_TEXTURE_2D, frameTextureId, 0);
|
| - GlUtil.checkNoGLES2Error("Attach texture to framebuffer");
|
| -
|
| - // Restore normal framebuffer.
|
| - GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
|
| -
|
| + textureFrameBuffer = new GlTextureFrameBuffer(GLES20.GL_RGBA);
|
| shader = new GlShader(VERTEX_SHADER, FRAGMENT_SHADER);
|
| shader.useProgram();
|
| texMatrixLoc = shader.getUniformLocation("texMatrix");
|
| @@ -186,26 +165,14 @@ class YuvConverter {
|
| transformMatrix =
|
| RendererCommon.multiplyMatrices(transformMatrix, RendererCommon.verticalFlipMatrix());
|
|
|
| + final int frameBufferWidth = stride / 4;
|
| + final int frameBufferHeight = total_height;
|
| + textureFrameBuffer.setSize(frameBufferWidth, frameBufferHeight);
|
| +
|
| // Bind our framebuffer.
|
| - GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBufferId);
|
| + GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, textureFrameBuffer.getFrameBufferId());
|
| GlUtil.checkNoGLES2Error("glBindFramebuffer");
|
|
|
| - if (frameBufferWidth != stride / 4 || frameBufferHeight != total_height) {
|
| - frameBufferWidth = stride / 4;
|
| - frameBufferHeight = total_height;
|
| - // (Re)-Allocate texture.
|
| - GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
| - GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameTextureId);
|
| - GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, frameBufferWidth,
|
| - frameBufferHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
|
| -
|
| - // Check that the framebuffer is in a good state.
|
| - final int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
|
| - if (status != GLES20.GL_FRAMEBUFFER_COMPLETE) {
|
| - throw new IllegalStateException("Framebuffer not complete, status: " + status);
|
| - }
|
| - }
|
| -
|
| GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
|
| GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, srcTextureId);
|
| GLES20.glUniformMatrix4fv(texMatrixLoc, 1, false, transformMatrix, 0);
|
| @@ -251,9 +218,6 @@ class YuvConverter {
|
| threadChecker.checkIsOnValidThread();
|
| released = true;
|
| shader.release();
|
| - GLES20.glDeleteTextures(1, new int[] {frameTextureId}, 0);
|
| - GLES20.glDeleteFramebuffers(1, new int[] {frameBufferId}, 0);
|
| - frameBufferWidth = 0;
|
| - frameBufferHeight = 0;
|
| + textureFrameBuffer.release();
|
| }
|
| }
|
|
|