| Index: talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
|
| diff --git a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
|
| index e9e95abedfd379e68fc50b495ff1d3dc8f74ce1e..cde27e24387d6a72f864ebd596fc13982431c479 100644
|
| --- a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
|
| +++ b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
|
| @@ -68,8 +68,6 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| private int screenHeight;
|
| // List of yuv renderers.
|
| private final ArrayList<YuvImageRenderer> yuvImageRenderers;
|
| - // |drawer| is synchronized on |yuvImageRenderers|.
|
| - private GlRectDrawer drawer;
|
| // Render and draw threads.
|
| private static Thread renderFrameThread;
|
| private static Thread drawThread;
|
| @@ -98,6 +96,8 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| // currently leaking resources to avoid a rare crash in release() where the EGLContext has
|
| // become invalid beforehand.
|
| private int[] yuvTextures = { 0, 0, 0 };
|
| + private final RendererCommon.YuvUploader yuvUploader = new RendererCommon.YuvUploader();
|
| + private final RendererCommon.GlDrawer drawer;
|
| // Resources for making a deep copy of incoming OES texture frame.
|
| private GlTextureFrameBuffer textureCopy;
|
|
|
| @@ -156,12 +156,13 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| private YuvImageRenderer(
|
| GLSurfaceView surface, int id,
|
| int x, int y, int width, int height,
|
| - RendererCommon.ScalingType scalingType, boolean mirror) {
|
| + RendererCommon.ScalingType scalingType, boolean mirror, RendererCommon.GlDrawer drawer) {
|
| Logging.d(TAG, "YuvImageRenderer.Create id: " + id);
|
| this.surface = surface;
|
| this.id = id;
|
| this.scalingType = scalingType;
|
| this.mirror = mirror;
|
| + this.drawer = drawer;
|
| layoutInPercentage = new Rect(x, y, Math.min(100, x + width), Math.min(100, y + height));
|
| updateLayoutProperties = false;
|
| rotationDegree = 0;
|
| @@ -173,6 +174,7 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
|
|
| private synchronized void release() {
|
| surface = null;
|
| + drawer.release();
|
| synchronized (pendingFrameLock) {
|
| if (pendingFrame != null) {
|
| VideoRenderer.renderFrameDone(pendingFrame);
|
| @@ -225,7 +227,7 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| }
|
| }
|
|
|
| - private void draw(GlRectDrawer drawer) {
|
| + private void draw() {
|
| if (!seenFrame) {
|
| // No frame received yet - nothing to render.
|
| return;
|
| @@ -244,7 +246,7 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| pendingFrame.samplingMatrix, pendingFrame.rotationDegree);
|
| if (pendingFrame.yuvFrame) {
|
| rendererType = RendererType.RENDERER_YUV;
|
| - drawer.uploadYuvData(yuvTextures, pendingFrame.width, pendingFrame.height,
|
| + yuvUploader.uploadYuvData(yuvTextures, pendingFrame.width, pendingFrame.height,
|
| pendingFrame.yuvStrides, pendingFrame.yuvPlanes);
|
| } else {
|
| rendererType = RendererType.RENDERER_TEXTURE;
|
| @@ -257,8 +259,8 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| GlUtil.checkNoGLES2Error("glBindFramebuffer");
|
|
|
| // Copy the OES texture content. This will also normalize the sampling matrix.
|
| - GLES20.glViewport(0, 0, textureCopy.getWidth(), textureCopy.getHeight());
|
| - drawer.drawOes(pendingFrame.textureId, rotatedSamplingMatrix);
|
| + drawer.drawOes(pendingFrame.textureId, rotatedSamplingMatrix,
|
| + 0, 0, textureCopy.getWidth(), textureCopy.getHeight());
|
| rotatedSamplingMatrix = RendererCommon.identityMatrix();
|
|
|
| // Restore normal framebuffer.
|
| @@ -271,17 +273,17 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| }
|
| }
|
|
|
| - // OpenGL defaults to lower left origin - flip vertically.
|
| - GLES20.glViewport(displayLayout.left, screenHeight - displayLayout.bottom,
|
| - displayLayout.width(), displayLayout.height());
|
| -
|
| updateLayoutMatrix();
|
| final float[] texMatrix =
|
| RendererCommon.multiplyMatrices(rotatedSamplingMatrix, layoutMatrix);
|
| + // OpenGL defaults to lower left origin - flip viewport position vertically.
|
| + final int viewportY = screenHeight - displayLayout.bottom;
|
| if (rendererType == RendererType.RENDERER_YUV) {
|
| - drawer.drawYuv(yuvTextures, texMatrix);
|
| + drawer.drawYuv(yuvTextures, texMatrix,
|
| + displayLayout.left, viewportY, displayLayout.width(), displayLayout.height());
|
| } else {
|
| - drawer.drawRgb(textureCopy.getTextureId(), texMatrix);
|
| + drawer.drawRgb(textureCopy.getTextureId(), texMatrix,
|
| + displayLayout.left, viewportY, displayLayout.width(), displayLayout.height());
|
| }
|
|
|
| if (isNewFrame) {
|
| @@ -468,6 +470,16 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| */
|
| public static synchronized YuvImageRenderer create(int x, int y, int width, int height,
|
| RendererCommon.ScalingType scalingType, boolean mirror) {
|
| + return create(x, y, width, height, scalingType, mirror, new GlRectDrawer());
|
| + }
|
| +
|
| + /**
|
| + * Creates VideoRenderer.Callbacks with top left corner at (x, y) and resolution (width, height).
|
| + * All parameters are in percentage of screen resolution. The custom |drawer| will be used for
|
| + * drawing frames on the EGLSurface. This class is responsible for calling release() on |drawer|.
|
| + */
|
| + public static synchronized YuvImageRenderer create(int x, int y, int width, int height,
|
| + RendererCommon.ScalingType scalingType, boolean mirror, RendererCommon.GlDrawer drawer) {
|
| // Check display region parameters.
|
| if (x < 0 || x > 100 || y < 0 || y > 100 ||
|
| width < 0 || width > 100 || height < 0 || height > 100 ||
|
| @@ -481,7 +493,7 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| }
|
| final YuvImageRenderer yuvImageRenderer = new YuvImageRenderer(
|
| instance.surface, instance.yuvImageRenderers.size(),
|
| - x, y, width, height, scalingType, mirror);
|
| + x, y, width, height, scalingType, mirror, drawer);
|
| synchronized (instance.yuvImageRenderers) {
|
| if (instance.onSurfaceCreatedCalled) {
|
| // onSurfaceCreated has already been called for VideoRendererGui -
|
| @@ -605,8 +617,6 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| }
|
|
|
| synchronized (yuvImageRenderers) {
|
| - // Create drawer for YUV/OES frames.
|
| - drawer = new GlRectDrawer();
|
| // Create textures for all images.
|
| for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) {
|
| yuvImageRenderer.createTextures();
|
| @@ -647,7 +657,7 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
| synchronized (yuvImageRenderers) {
|
| for (YuvImageRenderer yuvImageRenderer : yuvImageRenderers) {
|
| - yuvImageRenderer.draw(drawer);
|
| + yuvImageRenderer.draw();
|
| }
|
| }
|
| }
|
|
|