| Index: webrtc/sdk/android/api/org/webrtc/RendererCommon.java
|
| diff --git a/webrtc/sdk/android/api/org/webrtc/RendererCommon.java b/webrtc/sdk/android/api/org/webrtc/RendererCommon.java
|
| index a82cea1d251c3b5ddd7418c922a773055da36a1d..63ffb8e552fe4b215bb36d0c0efb4354f72eb416 100644
|
| --- a/webrtc/sdk/android/api/org/webrtc/RendererCommon.java
|
| +++ b/webrtc/sdk/android/api/org/webrtc/RendererCommon.java
|
| @@ -14,7 +14,6 @@ import android.graphics.Point;
|
| import android.opengl.GLES20;
|
| import android.opengl.Matrix;
|
| import android.view.View;
|
| -
|
| import java.nio.ByteBuffer;
|
|
|
| /**
|
| @@ -63,13 +62,14 @@ public class RendererCommon {
|
| // TODO(magjed): Investigate when GL_UNPACK_ROW_LENGTH is available, or make a custom shader
|
| // that handles stride and compare performance with intermediate copy.
|
| private ByteBuffer copyBuffer;
|
| + private int[] yuvTextures;
|
|
|
| /**
|
| - * Upload |planes| into |outputYuvTextures|, taking stride into consideration.
|
| - * |outputYuvTextures| must have been generated in advance.
|
| + * Upload |planes| into OpenGL textures, taking stride into consideration.
|
| + *
|
| + * @return Array of three texture indices corresponding to Y-, U-, and V-plane respectively.
|
| */
|
| - public void uploadYuvData(
|
| - int[] outputYuvTextures, int width, int height, int[] strides, ByteBuffer[] planes) {
|
| + public int[] uploadYuvData(int width, int height, int[] strides, ByteBuffer[] planes) {
|
| final int[] planeWidths = new int[] {width, width / 2, width / 2};
|
| final int[] planeHeights = new int[] {height, height / 2, height / 2};
|
| // Make a first pass to see if we need a temporary copy buffer.
|
| @@ -84,10 +84,17 @@ public class RendererCommon {
|
| && (copyBuffer == null || copyBuffer.capacity() < copyCapacityNeeded)) {
|
| copyBuffer = ByteBuffer.allocateDirect(copyCapacityNeeded);
|
| }
|
| + // Make sure YUV textures are allocated.
|
| + if (yuvTextures == null) {
|
| + yuvTextures = new int[3];
|
| + for (int i = 0; i < 3; i++) {
|
| + yuvTextures[i] = GlUtil.generateTexture(GLES20.GL_TEXTURE_2D);
|
| + }
|
| + }
|
| // Upload each plane.
|
| for (int i = 0; i < 3; ++i) {
|
| GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i);
|
| - GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, outputYuvTextures[i]);
|
| + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]);
|
| // GLES only accepts packed data, i.e. stride == planeWidth.
|
| final ByteBuffer packedByteBuffer;
|
| if (strides[i] == planeWidths[i]) {
|
| @@ -101,6 +108,19 @@ public class RendererCommon {
|
| GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, planeWidths[i],
|
| planeHeights[i], 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, packedByteBuffer);
|
| }
|
| + return yuvTextures;
|
| + }
|
| +
|
| + /**
|
| + * Releases cached resources. Uploader can still be used and the resources will be reallocated
|
| + * on first use.
|
| + */
|
| + public void release() {
|
| + copyBuffer = null;
|
| + if (yuvTextures != null) {
|
| + GLES20.glDeleteTextures(3, yuvTextures, 0);
|
| + yuvTextures = null;
|
| + }
|
| }
|
| }
|
|
|
|
|