Index: talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java |
diff --git a/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java b/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java |
index 718bb917472509fd3db680f7b8712451c60569ca..33ccff29ef5a16b49855833421dee65ddebd45f3 100644 |
--- a/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java |
+++ b/talk/app/webrtc/java/android/org/webrtc/SurfaceViewRenderer.java |
@@ -28,6 +28,7 @@ |
package org.webrtc; |
import android.content.Context; |
+import android.content.res.Resources.NotFoundException; |
import android.graphics.Point; |
import android.graphics.SurfaceTexture; |
import android.opengl.GLES20; |
@@ -152,9 +153,9 @@ public class SurfaceViewRenderer extends SurfaceView |
EGLContext sharedContext, RendererCommon.RendererEvents rendererEvents) { |
synchronized (handlerLock) { |
if (renderThreadHandler != null) { |
- throw new IllegalStateException("Already initialized"); |
+ throw new IllegalStateException(getResourceName() + "Already initialized"); |
} |
- Logging.d(TAG, "Initializing"); |
+ Logging.d(TAG, getResourceName() + "Initializing."); |
this.rendererEvents = rendererEvents; |
renderThread = new HandlerThread(TAG); |
renderThread.start(); |
@@ -195,7 +196,7 @@ public class SurfaceViewRenderer extends SurfaceView |
final CountDownLatch eglCleanupBarrier = new CountDownLatch(1); |
synchronized (handlerLock) { |
if (renderThreadHandler == null) { |
- Logging.d(TAG, "Already released"); |
+ Logging.d(TAG, getResourceName() + "Already released"); |
return; |
} |
// Release EGL and GL resources on render thread. |
@@ -212,8 +213,7 @@ public class SurfaceViewRenderer extends SurfaceView |
} |
if (eglBase.hasSurface()) { |
// Clear last rendered image to black. |
- GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); |
- eglBase.swapBuffers(); |
+ makeBlack(); |
} |
eglBase.release(); |
eglBase = null; |
@@ -277,7 +277,8 @@ public class SurfaceViewRenderer extends SurfaceView |
} |
synchronized (handlerLock) { |
if (renderThreadHandler == null) { |
- Logging.d(TAG, "Dropping frame - SurfaceViewRenderer not initialized or already released."); |
+ Logging.d(TAG, getResourceName() |
+ + "Dropping frame - Not initialized or already released."); |
VideoRenderer.renderFrameDone(frame); |
return; |
} |
@@ -337,7 +338,7 @@ public class SurfaceViewRenderer extends SurfaceView |
// SurfaceHolder.Callback interface. |
@Override |
public void surfaceCreated(final SurfaceHolder holder) { |
- Logging.d(TAG, "Surface created"); |
+ Logging.d(TAG, getResourceName() + "Surface created."); |
synchronized (layoutLock) { |
isSurfaceCreated = true; |
} |
@@ -346,7 +347,7 @@ public class SurfaceViewRenderer extends SurfaceView |
@Override |
public void surfaceDestroyed(SurfaceHolder holder) { |
- Logging.d(TAG, "Surface destroyed"); |
+ Logging.d(TAG, getResourceName() + "Surface destroyed."); |
synchronized (layoutLock) { |
isSurfaceCreated = false; |
surfaceWidth = 0; |
@@ -361,7 +362,7 @@ public class SurfaceViewRenderer extends SurfaceView |
@Override |
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { |
- Logging.d(TAG, "Surface changed: " + width + "x" + height); |
+ Logging.d(TAG, getResourceName() + "Surface changed: " + width + "x" + height); |
synchronized (layoutLock) { |
surfaceWidth = width; |
surfaceHeight = height; |
@@ -381,6 +382,23 @@ public class SurfaceViewRenderer extends SurfaceView |
} |
} |
+ private String getResourceName() { |
+ try { |
+ return getResources().getResourceEntryName(getId()) + ": "; |
+ } catch (NotFoundException e) { |
+ return ""; |
+ } |
+ } |
+ |
+ private void makeBlack() { |
+ if (Thread.currentThread() != renderThread) { |
+ throw new IllegalStateException(getResourceName() + "Wrong thread."); |
+ } |
+ GLES20.glClearColor(0, 0, 0, 0); |
+ GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); |
+ eglBase.swapBuffers(); |
+ } |
+ |
/** |
* Requests new layout if necessary. Returns true if layout and surface size are consistent. |
*/ |
@@ -388,7 +406,7 @@ public class SurfaceViewRenderer extends SurfaceView |
synchronized (layoutLock) { |
final Point desiredLayoutSize = getDesiredLayoutSize(); |
if (desiredLayoutSize.x != layoutWidth || desiredLayoutSize.y != layoutHeight) { |
- Logging.d(TAG, "Requesting new layout with size: " |
+ Logging.d(TAG, getResourceName() + "Requesting new layout with size: " |
+ desiredLayoutSize.x + "x" + desiredLayoutSize.y); |
// Request layout update on UI thread. |
post(new Runnable() { |
@@ -408,14 +426,16 @@ public class SurfaceViewRenderer extends SurfaceView |
* Renders and releases |pendingFrame|. |
*/ |
private void renderFrameOnRenderThread() { |
+ if (Thread.currentThread() != renderThread) { |
+ throw new IllegalStateException(getResourceName() + "Wrong thread."); |
+ } |
if (eglBase == null || !eglBase.hasSurface()) { |
- Logging.d(TAG, "No surface to draw on"); |
+ Logging.d(TAG, getResourceName() + "No surface to draw on"); |
return; |
} |
if (!checkConsistentLayout()) { |
// Output intermediate black frames while the layout is updated. |
- GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); |
- eglBase.swapBuffers(); |
+ makeBlack(); |
return; |
} |
// After a surface size change, the EGLSurface might still have a buffer of the old size in the |
@@ -423,8 +443,7 @@ public class SurfaceViewRenderer extends SurfaceView |
// changed. Such a buffer will be rendered incorrectly, so flush it with a black frame. |
synchronized (layoutLock) { |
if (eglBase.surfaceWidth() != surfaceWidth || eglBase.surfaceHeight() != surfaceHeight) { |
- GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); |
- eglBase.swapBuffers(); |
+ makeBlack(); |
} |
} |
// Fetch and render |pendingFrame|. |
@@ -509,12 +528,11 @@ public class SurfaceViewRenderer extends SurfaceView |
if (frameWidth != frame.width || frameHeight != frame.height |
|| frameRotation != frame.rotationDegree) { |
if (rendererEvents != null) { |
- final String id = getResources().getResourceEntryName(getId()); |
if (frameWidth == 0 || frameHeight == 0) { |
- Logging.d(TAG, "ID: " + id + ". Reporting first rendered frame."); |
+ Logging.d(TAG, getResourceName() + "Reporting first rendered frame."); |
rendererEvents.onFirstFrameRendered(); |
} |
- Logging.d(TAG, "ID: " + id + ". Reporting frame resolution changed to " |
+ Logging.d(TAG, getResourceName() + "Reporting frame resolution changed to " |
+ frame.width + "x" + frame.height + " with rotation " + frame.rotationDegree); |
rendererEvents.onFrameResolutionChanged(frame.width, frame.height, frame.rotationDegree); |
} |
@@ -527,13 +545,13 @@ public class SurfaceViewRenderer extends SurfaceView |
private void logStatistics() { |
synchronized (statisticsLock) { |
- Logging.d(TAG, "ID: " + getResources().getResourceEntryName(getId()) + ". Frames received: " |
+ Logging.d(TAG, getResourceName() + "Frames received: " |
+ framesReceived + ". Dropped: " + framesDropped + ". Rendered: " + framesRendered); |
if (framesReceived > 0 && framesRendered > 0) { |
final long timeSinceFirstFrameNs = System.nanoTime() - firstFrameTimeNs; |
- Logging.d(TAG, "Duration: " + (int) (timeSinceFirstFrameNs / 1e6) + |
+ Logging.d(TAG, getResourceName() + "Duration: " + (int) (timeSinceFirstFrameNs / 1e6) + |
" ms. FPS: " + (float) framesRendered * 1e9 / timeSinceFirstFrameNs); |
- Logging.d(TAG, "Average render time: " |
+ Logging.d(TAG, getResourceName() + "Average render time: " |
+ (int) (renderTimeNs / (1000 * framesRendered)) + " us."); |
} |
} |