Index: webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java |
diff --git a/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java b/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java |
index 08c024283ce8d6da08d0e9ed25a96078f94e41ea..dda16ad3903fb211587d0e7d0787883b5c1da01f 100644 |
--- a/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java |
+++ b/webrtc/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java |
@@ -42,7 +42,9 @@ import org.webrtc.PeerConnectionFactory; |
import org.webrtc.SessionDescription; |
import org.webrtc.StatsReport; |
import org.webrtc.VideoCapturer; |
+import org.webrtc.VideoFrame; |
import org.webrtc.VideoRenderer; |
+import org.webrtc.VideoSink; |
@RunWith(BaseJUnit4ClassRunner.class) |
public class PeerConnectionClientTest implements PeerConnectionEvents { |
@@ -126,6 +128,49 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { |
} |
} |
+ // Mock VideoSink implementation. |
+ private static class MockSink implements VideoSink { |
+ // These are protected by 'this' since we gets called from worker threads. |
+ private String rendererName; |
+ private boolean renderFrameCalled = false; |
+ |
+ // Thread-safe in itself. |
+ private CountDownLatch doneRendering; |
+ |
+ public MockSink(int expectedFrames, String rendererName) { |
+ this.rendererName = rendererName; |
+ reset(expectedFrames); |
+ } |
+ |
+ // Resets render to wait for new amount of video frames. |
+ public synchronized void reset(int expectedFrames) { |
+ renderFrameCalled = false; |
+ doneRendering = new CountDownLatch(expectedFrames); |
+ } |
+ |
+ @Override |
+ public synchronized void onFrame(VideoFrame frame) { |
+ if (!renderFrameCalled) { |
+ if (rendererName != null) { |
+ Log.d(TAG, |
+ rendererName + " render frame: " + frame.getRotatedWidth() + " x " |
+ + frame.getRotatedHeight()); |
+ } else { |
+ Log.d(TAG, "Render frame: " + frame.getRotatedWidth() + " x " + frame.getRotatedHeight()); |
+ } |
+ } |
+ renderFrameCalled = true; |
+ doneRendering.countDown(); |
+ } |
+ |
+ // This method shouldn't hold any locks or touch member variables since it |
+ // blocks. |
+ public boolean waitForFramesRendered(int timeoutMs) throws InterruptedException { |
+ doneRendering.await(timeoutMs, TimeUnit.MILLISECONDS); |
+ return (doneRendering.getCount() <= 0); |
+ } |
+ } |
+ |
// Peer connection events implementation. |
@Override |
public void onLocalDescription(SessionDescription sdp) { |
@@ -236,7 +281,7 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { |
} |
} |
- PeerConnectionClient createPeerConnectionClient(MockRenderer localRenderer, |
+ PeerConnectionClient createPeerConnectionClient(MockSink localRenderer, |
MockRenderer remoteRenderer, PeerConnectionParameters peerConnectionParameters, |
VideoCapturer videoCapturer) { |
List<PeerConnection.IceServer> iceServers = new LinkedList<PeerConnection.IceServer>(); |
@@ -333,7 +378,7 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { |
@SmallTest |
public void testSetLocalOfferMakesVideoFlowLocally() throws InterruptedException { |
Log.d(TAG, "testSetLocalOfferMakesVideoFlowLocally"); |
- MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
+ MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
pcClient = createPeerConnectionClient(localRenderer, new MockRenderer(0, null), |
createParametersForVideoCall(VIDEO_CODEC_VP8), |
createCameraCapturer(false /* captureToTexture */)); |
@@ -355,11 +400,11 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { |
private void doLoopbackTest(PeerConnectionParameters parameters, VideoCapturer videoCapturer, |
boolean decodeToTexture) throws InterruptedException { |
loopback = true; |
- MockRenderer localRenderer = null; |
+ MockSink localRenderer = null; |
MockRenderer remoteRenderer = null; |
if (parameters.videoCallEnabled) { |
Log.d(TAG, "testLoopback for video " + parameters.videoCodec); |
- localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
+ localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME); |
} else { |
Log.d(TAG, "testLoopback for audio."); |
@@ -494,7 +539,7 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { |
Log.d(TAG, "testCameraSwitch"); |
loopback = true; |
- MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
+ MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME); |
pcClient = createPeerConnectionClient(localRenderer, remoteRenderer, |
@@ -542,7 +587,7 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { |
Log.d(TAG, "testVideoSourceRestart"); |
loopback = true; |
- MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
+ MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME); |
pcClient = createPeerConnectionClient(localRenderer, remoteRenderer, |
@@ -591,7 +636,7 @@ public class PeerConnectionClientTest implements PeerConnectionEvents { |
Log.d(TAG, "testCaptureFormatChange"); |
loopback = true; |
- MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
+ MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME); |
MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME); |
pcClient = createPeerConnectionClient(localRenderer, remoteRenderer, |