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(); |
} |
} |
} |