Chromium Code Reviews| 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) { |
|
wzh
2015/10/12 20:45:47
nit: if we can have a global util func for this, w
|
| + 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) { |