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 9dd2f02c4bd2aff331724f175259de4e071644dd..8246e8bd17bf6f96c84c69842112f64e6e638efb 100644 |
--- a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java |
+++ b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java |
@@ -148,6 +148,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. |
@@ -430,6 +431,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); |
+ rendererEvents.onFrameResolutionChanged(videoWidth, videoHeight, rotation); |
+ } |
// Frame re-allocation need to be synchronized with copying |
// frame to textures in draw() function to avoid re-allocating |
@@ -461,6 +467,10 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { |
// This object has been released. |
return; |
} |
+ 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++; |
@@ -518,6 +528,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 synchronized void setView(GLSurfaceView surface, |
Runnable eglContextReadyCallback) { |
@@ -612,6 +635,22 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { |
} |
} |
+ public static synchronized 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 synchronized void remove(VideoRenderer.Callbacks renderer) { |
Log.d(TAG, "VideoRendererGui.remove"); |
if (instance == null) { |