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 26285252f3a9bac244cbe09083ec0611ebd6c2e8..34031a0c52885c7e2da5d0b16a6ce55898456fa3 100644 |
--- a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java |
+++ b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java |
@@ -125,6 +125,7 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { |
private RendererType rendererType; |
private ScalingType scalingType; |
private boolean mirror; |
+ private RendererEvents rendererEvents; |
// Flag if renderFrame() was ever called. |
boolean seenFrame; |
// Total number of video frames received in renderFrame() call. |
@@ -398,6 +399,11 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { |
&& rotation == rotationDegree) { |
return; |
} |
+ if (rendererEvents != null) { |
+ Log.d(TAG, "ID: " + id + |
+ ". Reporting frame resolution changed to " + videoWidth + " x " + videoHeight); |
wzh
2015/08/14 16:53:28
nit: + ". Reporting ..."
AlexG
2015/08/14 18:28:12
I think for Chrome Java standard is a little diffe
|
+ rendererEvents.onFrameResolutionChanged(videoWidth, videoHeight, rotation); |
+ } |
// Frame re-allocation need to be synchronized with copying |
// frame to textures in draw() function to avoid re-allocating |
@@ -425,6 +431,10 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { |
@Override |
public synchronized void renderFrame(I420Frame frame) { |
+ if (!seenFrame && rendererEvents != null) { |
+ Log.d(TAG, "ID: " + id + ". Reporting first rendered frame."); |
+ rendererEvents.onFirstFrameRendered(); |
+ } |
setSize(frame.width, frame.height, frame.rotationDegree); |
long now = System.nanoTime(); |
framesReceived++; |
@@ -480,6 +490,19 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { |
} |
} |
+ /** Interface for reporting rendering events. */ |
+ public static interface RendererEvents { |
+ /** |
+ * Callback fired once first frame is rendered. |
+ */ |
+ public void onFirstFrameRendered(); |
+ |
+ /** |
+ * Callback fired when rendered frame resolution or rotation has changed. |
+ */ |
+ public void onFrameResolutionChanged(int videoWidth, int videoHeight, int rotation); |
+ } |
+ |
/** Passes GLSurfaceView to video renderer. */ |
public static void setView(GLSurfaceView surface, |
Runnable eglContextReadyCallback) { |
@@ -574,6 +597,22 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { |
} |
} |
+ public static void setRendererEvents( |
+ VideoRenderer.Callbacks renderer, RendererEvents rendererEvents) { |
+ Log.d(TAG, "VideoRendererGui.setRendererEvents"); |
+ if (instance == null) { |
+ throw new RuntimeException( |
+ "Attempt to set renderer events before setting GLSurfaceView"); |
+ } |
+ synchronized (instance.yuvImageRenderers) { |
+ for (YuvImageRenderer yuvImageRenderer : instance.yuvImageRenderers) { |
+ if (yuvImageRenderer == renderer) { |
+ yuvImageRenderer.rendererEvents = rendererEvents; |
+ } |
+ } |
+ } |
+ } |
+ |
public static void remove(VideoRenderer.Callbacks renderer) { |
Log.d(TAG, "VideoRendererGui.remove"); |
if (instance == null) { |