Index: webrtc/sdk/android/api/org/webrtc/SurfaceViewRenderer.java |
diff --git a/webrtc/sdk/android/api/org/webrtc/SurfaceViewRenderer.java b/webrtc/sdk/android/api/org/webrtc/SurfaceViewRenderer.java |
index 06d72425a84bec41f0ba11fc42835018ca58047c..f664b014e1e25134435d3f2ca92892980a77e5f3 100644 |
--- a/webrtc/sdk/android/api/org/webrtc/SurfaceViewRenderer.java |
+++ b/webrtc/sdk/android/api/org/webrtc/SurfaceViewRenderer.java |
@@ -28,7 +28,7 @@ import java.util.concurrent.CountDownLatch; |
* Interaction with the layout framework in onMeasure and onSizeChanged. |
*/ |
public class SurfaceViewRenderer |
- extends SurfaceView implements SurfaceHolder.Callback, VideoRenderer.Callbacks { |
+ extends SurfaceView implements SurfaceHolder.Callback, VideoRenderer.Callbacks, VideoSink { |
private static final String TAG = "SurfaceViewRenderer"; |
// Cached resource name. |
@@ -208,6 +208,13 @@ public class SurfaceViewRenderer |
eglRenderer.renderFrame(frame); |
} |
+ // VideoSink interface. |
+ @Override |
+ public void onFrame(VideoFrame frame) { |
+ updateFrameDimensionsAndReportEvents(frame); |
+ eglRenderer.onFrame(frame); |
+ } |
+ |
// View layout interface. |
@Override |
protected void onMeasure(int widthSpec, int heightSpec) { |
@@ -339,6 +346,39 @@ public class SurfaceViewRenderer |
} |
} |
+ // Update frame dimensions and report any changes to |rendererEvents|. |
+ private void updateFrameDimensionsAndReportEvents(VideoFrame frame) { |
+ synchronized (layoutLock) { |
+ if (isRenderingPaused) { |
+ return; |
+ } |
+ if (!isFirstFrameRendered) { |
+ isFirstFrameRendered = true; |
+ logD("Reporting first rendered frame."); |
+ if (rendererEvents != null) { |
+ rendererEvents.onFirstFrameRendered(); |
+ } |
+ } |
+ if (rotatedFrameWidth != frame.getRotatedWidth() |
+ || rotatedFrameHeight != frame.getRotatedHeight() |
+ || frameRotation != frame.getRotation()) { |
+ logD("Reporting frame resolution changed to " + frame.getBuffer().getWidth() + "x" |
+ + frame.getBuffer().getHeight() + " with rotation " + frame.getRotation()); |
+ if (rendererEvents != null) { |
+ rendererEvents.onFrameResolutionChanged( |
+ frame.getBuffer().getWidth(), frame.getBuffer().getHeight(), frame.getRotation()); |
+ } |
+ rotatedFrameWidth = frame.getRotatedWidth(); |
+ rotatedFrameHeight = frame.getRotatedHeight(); |
+ frameRotation = frame.getRotation(); |
+ post(() -> { |
+ updateSurfaceSize(); |
+ requestLayout(); |
+ }); |
+ } |
+ } |
+ } |
+ |
private void logD(String string) { |
Logging.d(TAG, resourceName + string); |
} |