SurfaceViewRenderer: Add resource name to log outputs and exceptions

Add resource name to log outputs to distinguish local renderer from remote renderer.

This Cl also adds some thread checks and factors out a small helper function makeBlack().

Review URL: https://codereview.webrtc.org/1420203003

Cr-Commit-Position: refs/heads/master@{#10596}
This commit is contained in:
magjed
2015-11-11 03:06:42 -08:00
committed by Commit bot
parent 1323fc39ba
commit b2d1c5026d

View File

@ -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.");
}
}