| 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 afaebf6f2eea1072c5671f3564ecb578615abe4d..1d413b8ece89d1a42cb6a7a89b6c371f9784c1d2 100644
|
| --- a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
|
| +++ b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java
|
| @@ -36,12 +36,10 @@ import javax.microedition.khronos.opengles.GL10;
|
| import android.annotation.SuppressLint;
|
| import android.graphics.Point;
|
| import android.graphics.Rect;
|
| -import android.graphics.SurfaceTexture;
|
| import android.opengl.EGL14;
|
| import android.opengl.EGLContext;
|
| import android.opengl.GLES20;
|
| import android.opengl.GLSurfaceView;
|
| -import android.opengl.Matrix;
|
|
|
| import org.webrtc.Logging;
|
| import org.webrtc.VideoRenderer.I420Frame;
|
| @@ -77,6 +75,9 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| // Current SDK version.
|
| private static final int CURRENT_SDK_VERSION =
|
| android.os.Build.VERSION.SDK_INT;
|
| + // Render and draw threads.
|
| + private static Thread renderFrameThread;
|
| + private static Thread drawThread;
|
|
|
| private VideoRendererGui(GLSurfaceView surface) {
|
| this.surface = surface;
|
| @@ -372,6 +373,9 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| VideoRenderer.renderFrameDone(frame);
|
| return;
|
| }
|
| + if (renderFrameThread == null) {
|
| + renderFrameThread = Thread.currentThread();
|
| + }
|
| if (!seenFrame && rendererEvents != null) {
|
| Logging.d(TAG, "ID: " + id + ". Reporting first rendered frame.");
|
| rendererEvents.onFirstFrameRendered();
|
| @@ -394,6 +398,7 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| // Skip rendering of this frame if previous frame was not rendered yet.
|
| framesDropped++;
|
| VideoRenderer.renderFrameDone(frame);
|
| + seenFrame = true;
|
| return;
|
| }
|
| pendingFrame = frame;
|
| @@ -430,6 +435,8 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| }
|
| instance.yuvImageRenderers.clear();
|
| }
|
| + renderFrameThread = null;
|
| + drawThread = null;
|
| instance.surface = null;
|
| eglContext = null;
|
| eglContextReady = null;
|
| @@ -565,6 +572,26 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
| }
|
| }
|
|
|
| + private static void printStackTrace(Thread thread, String threadName) {
|
| + if (thread != null) {
|
| + StackTraceElement[] stackTraces = thread.getStackTrace();
|
| + if (stackTraces.length > 0) {
|
| + Logging.d(TAG, threadName + " stacks trace:");
|
| + for (StackTraceElement stackTrace : stackTraces) {
|
| + Logging.d(TAG, stackTrace.toString());
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + public static synchronized void printStackTraces() {
|
| + if (instance == null) {
|
| + return;
|
| + }
|
| + printStackTrace(renderFrameThread, "Render frame thread");
|
| + printStackTrace(drawThread, "Draw thread");
|
| + }
|
| +
|
| @SuppressLint("NewApi")
|
| @Override
|
| public void onSurfaceCreated(GL10 unused, EGLConfig config) {
|
| @@ -613,6 +640,9 @@ public class VideoRendererGui implements GLSurfaceView.Renderer {
|
|
|
| @Override
|
| public void onDrawFrame(GL10 unused) {
|
| + if (drawThread == null) {
|
| + drawThread = Thread.currentThread();
|
| + }
|
| GLES20.glViewport(0, 0, screenWidth, screenHeight);
|
| GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
|
| synchronized (yuvImageRenderers) {
|
|
|