| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 import org.webrtc.StatsReport; | 30 import org.webrtc.StatsReport; |
| 31 import org.webrtc.VideoRenderer; | 31 import org.webrtc.VideoRenderer; |
| 32 | 32 |
| 33 import java.util.LinkedList; | 33 import java.util.LinkedList; |
| 34 import java.util.List; | 34 import java.util.List; |
| 35 import java.util.concurrent.CountDownLatch; | 35 import java.util.concurrent.CountDownLatch; |
| 36 import java.util.concurrent.ExecutorService; | 36 import java.util.concurrent.ExecutorService; |
| 37 import java.util.concurrent.Executors; | 37 import java.util.concurrent.Executors; |
| 38 import java.util.concurrent.TimeUnit; | 38 import java.util.concurrent.TimeUnit; |
| 39 | 39 |
| 40 public class PeerConnectionClientTest extends InstrumentationTestCase | 40 public class PeerConnectionClientTest |
| 41 implements PeerConnectionEvents { | 41 extends InstrumentationTestCase implements PeerConnectionEvents { |
| 42 private static final String TAG = "RTCClientTest"; | 42 private static final String TAG = "RTCClientTest"; |
| 43 private static final int ICE_CONNECTION_WAIT_TIMEOUT = 10000; | 43 private static final int ICE_CONNECTION_WAIT_TIMEOUT = 10000; |
| 44 private static final int WAIT_TIMEOUT = 7000; | 44 private static final int WAIT_TIMEOUT = 7000; |
| 45 private static final int CAMERA_SWITCH_ATTEMPTS = 3; | 45 private static final int CAMERA_SWITCH_ATTEMPTS = 3; |
| 46 private static final int VIDEO_RESTART_ATTEMPTS = 3; | 46 private static final int VIDEO_RESTART_ATTEMPTS = 3; |
| 47 private static final int CAPTURE_FORMAT_CHANGE_ATTEMPTS = 3; | 47 private static final int CAPTURE_FORMAT_CHANGE_ATTEMPTS = 3; |
| 48 private static final int VIDEO_RESTART_TIMEOUT = 500; | 48 private static final int VIDEO_RESTART_TIMEOUT = 500; |
| 49 private static final int EXPECTED_VIDEO_FRAMES = 10; | 49 private static final int EXPECTED_VIDEO_FRAMES = 10; |
| 50 private static final String VIDEO_CODEC_VP8 = "VP8"; | 50 private static final String VIDEO_CODEC_VP8 = "VP8"; |
| 51 private static final String VIDEO_CODEC_VP9 = "VP9"; | 51 private static final String VIDEO_CODEC_VP9 = "VP9"; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 // Resets render to wait for new amount of video frames. | 96 // Resets render to wait for new amount of video frames. |
| 97 public synchronized void reset(int expectedFrames) { | 97 public synchronized void reset(int expectedFrames) { |
| 98 renderFrameCalled = false; | 98 renderFrameCalled = false; |
| 99 doneRendering = new CountDownLatch(expectedFrames); | 99 doneRendering = new CountDownLatch(expectedFrames); |
| 100 } | 100 } |
| 101 | 101 |
| 102 @Override | 102 @Override |
| 103 public synchronized void renderFrame(VideoRenderer.I420Frame frame) { | 103 public synchronized void renderFrame(VideoRenderer.I420Frame frame) { |
| 104 if (!renderFrameCalled) { | 104 if (!renderFrameCalled) { |
| 105 if (rendererName != null) { | 105 if (rendererName != null) { |
| 106 Log.d(TAG, rendererName + " render frame: " | 106 Log.d(TAG, rendererName + " render frame: " + frame.rotatedWidth() + "
x " |
| 107 + frame.rotatedWidth() + " x " + frame.rotatedHeight()); | 107 + frame.rotatedHeight()); |
| 108 } else { | 108 } else { |
| 109 Log.d(TAG, "Render frame: " + frame.rotatedWidth() + " x " + frame.rot
atedHeight()); | 109 Log.d(TAG, "Render frame: " + frame.rotatedWidth() + " x " + frame.rot
atedHeight()); |
| 110 } | 110 } |
| 111 } | 111 } |
| 112 renderFrameCalled = true; | 112 renderFrameCalled = true; |
| 113 VideoRenderer.renderFrameDone(frame); | 113 VideoRenderer.renderFrameDone(frame); |
| 114 doneRendering.countDown(); | 114 doneRendering.countDown(); |
| 115 } | 115 } |
| 116 | 116 |
| 117 | |
| 118 // This method shouldn't hold any locks or touch member variables since it | 117 // This method shouldn't hold any locks or touch member variables since it |
| 119 // blocks. | 118 // blocks. |
| 120 public boolean waitForFramesRendered(int timeoutMs) | 119 public boolean waitForFramesRendered(int timeoutMs) throws InterruptedExcept
ion { |
| 121 throws InterruptedException { | |
| 122 doneRendering.await(timeoutMs, TimeUnit.MILLISECONDS); | 120 doneRendering.await(timeoutMs, TimeUnit.MILLISECONDS); |
| 123 return (doneRendering.getCount() <= 0); | 121 return (doneRendering.getCount() <= 0); |
| 124 } | 122 } |
| 125 } | 123 } |
| 126 | 124 |
| 127 // Peer connection events implementation. | 125 // Peer connection events implementation. |
| 128 @Override | 126 @Override |
| 129 public void onLocalDescription(SessionDescription sdp) { | 127 public void onLocalDescription(SessionDescription sdp) { |
| 130 Log.d(TAG, "LocalSDP type: " + sdp.type); | 128 Log.d(TAG, "LocalSDP type: " + sdp.type); |
| 131 synchronized (localSdpEvent) { | 129 synchronized (localSdpEvent) { |
| 132 localSdp = sdp; | 130 localSdp = sdp; |
| 133 localSdpEvent.notifyAll(); | 131 localSdpEvent.notifyAll(); |
| 134 } | 132 } |
| 135 } | 133 } |
| 136 | 134 |
| 137 @Override | 135 @Override |
| 138 public void onIceCandidate(final IceCandidate candidate) { | 136 public void onIceCandidate(final IceCandidate candidate) { |
| 139 synchronized(iceCandidateEvent) { | 137 synchronized (iceCandidateEvent) { |
| 140 Log.d(TAG, "IceCandidate #" + iceCandidates.size() + " : " + candidate.toS
tring()); | 138 Log.d(TAG, "IceCandidate #" + iceCandidates.size() + " : " + candidate.toS
tring()); |
| 141 if (loopback) { | 139 if (loopback) { |
| 142 // Loopback local ICE candidate in a separate thread to avoid adding | 140 // Loopback local ICE candidate in a separate thread to avoid adding |
| 143 // remote ICE candidate in a local ICE candidate callback. | 141 // remote ICE candidate in a local ICE candidate callback. |
| 144 signalingExecutor.execute(new Runnable() { | 142 signalingExecutor.execute(new Runnable() { |
| 145 @Override | 143 @Override |
| 146 public void run() { | 144 public void run() { |
| 147 pcClient.addRemoteIceCandidate(candidate); | 145 pcClient.addRemoteIceCandidate(candidate); |
| 148 } | 146 } |
| 149 }); | 147 }); |
| 150 } | 148 } |
| 151 iceCandidates.add(candidate); | 149 iceCandidates.add(candidate); |
| 152 iceCandidateEvent.notifyAll(); | 150 iceCandidateEvent.notifyAll(); |
| 153 } | 151 } |
| 154 } | 152 } |
| 155 | 153 |
| 156 @Override | 154 @Override |
| 157 public void onIceCandidatesRemoved(final IceCandidate[] candidates) { | 155 public void onIceCandidatesRemoved(final IceCandidate[] candidates) { |
| 158 // TODO(honghaiz): Add this for tests. | 156 // TODO(honghaiz): Add this for tests. |
| 159 } | 157 } |
| 160 | 158 |
| 161 @Override | 159 @Override |
| 162 public void onIceConnected() { | 160 public void onIceConnected() { |
| 163 Log.d(TAG, "ICE Connected"); | 161 Log.d(TAG, "ICE Connected"); |
| 164 synchronized(iceConnectedEvent) { | 162 synchronized (iceConnectedEvent) { |
| 165 isIceConnected = true; | 163 isIceConnected = true; |
| 166 iceConnectedEvent.notifyAll(); | 164 iceConnectedEvent.notifyAll(); |
| 167 } | 165 } |
| 168 } | 166 } |
| 169 | 167 |
| 170 @Override | 168 @Override |
| 171 public void onIceDisconnected() { | 169 public void onIceDisconnected() { |
| 172 Log.d(TAG, "ICE Disconnected"); | 170 Log.d(TAG, "ICE Disconnected"); |
| 173 synchronized(iceConnectedEvent) { | 171 synchronized (iceConnectedEvent) { |
| 174 isIceConnected = false; | 172 isIceConnected = false; |
| 175 iceConnectedEvent.notifyAll(); | 173 iceConnectedEvent.notifyAll(); |
| 176 } | 174 } |
| 177 } | 175 } |
| 178 | 176 |
| 179 @Override | 177 @Override |
| 180 public void onPeerConnectionClosed() { | 178 public void onPeerConnectionClosed() { |
| 181 Log.d(TAG, "PeerConnection closed"); | 179 Log.d(TAG, "PeerConnection closed"); |
| 182 synchronized(closeEvent) { | 180 synchronized (closeEvent) { |
| 183 isClosed = true; | 181 isClosed = true; |
| 184 closeEvent.notifyAll(); | 182 closeEvent.notifyAll(); |
| 185 } | 183 } |
| 186 } | 184 } |
| 187 | 185 |
| 188 @Override | 186 @Override |
| 189 public void onPeerConnectionError(String description) { | 187 public void onPeerConnectionError(String description) { |
| 190 fail("PC Error: " + description); | 188 fail("PC Error: " + description); |
| 191 } | 189 } |
| 192 | 190 |
| 193 @Override | 191 @Override |
| 194 public void onPeerConnectionStatsReady(StatsReport[] reports) { | 192 public void onPeerConnectionStatsReady(StatsReport[] reports) {} |
| 195 } | |
| 196 | 193 |
| 197 // Helper wait functions. | 194 // Helper wait functions. |
| 198 private boolean waitForLocalSDP(int timeoutMs) | 195 private boolean waitForLocalSDP(int timeoutMs) throws InterruptedException { |
| 199 throws InterruptedException { | 196 synchronized (localSdpEvent) { |
| 200 synchronized(localSdpEvent) { | |
| 201 if (localSdp == null) { | 197 if (localSdp == null) { |
| 202 localSdpEvent.wait(timeoutMs); | 198 localSdpEvent.wait(timeoutMs); |
| 203 } | 199 } |
| 204 return (localSdp != null); | 200 return (localSdp != null); |
| 205 } | 201 } |
| 206 } | 202 } |
| 207 | 203 |
| 208 private boolean waitForIceCandidates(int timeoutMs) | 204 private boolean waitForIceCandidates(int timeoutMs) throws InterruptedExceptio
n { |
| 209 throws InterruptedException { | 205 synchronized (iceCandidateEvent) { |
| 210 synchronized(iceCandidateEvent) { | |
| 211 if (iceCandidates.size() == 0) { | 206 if (iceCandidates.size() == 0) { |
| 212 iceCandidateEvent.wait(timeoutMs); | 207 iceCandidateEvent.wait(timeoutMs); |
| 213 } | 208 } |
| 214 return (iceCandidates.size() > 0); | 209 return (iceCandidates.size() > 0); |
| 215 } | 210 } |
| 216 } | 211 } |
| 217 | 212 |
| 218 private boolean waitForIceConnected(int timeoutMs) | 213 private boolean waitForIceConnected(int timeoutMs) throws InterruptedException
{ |
| 219 throws InterruptedException { | 214 synchronized (iceConnectedEvent) { |
| 220 synchronized(iceConnectedEvent) { | |
| 221 if (!isIceConnected) { | 215 if (!isIceConnected) { |
| 222 iceConnectedEvent.wait(timeoutMs); | 216 iceConnectedEvent.wait(timeoutMs); |
| 223 } | 217 } |
| 224 if (!isIceConnected) { | 218 if (!isIceConnected) { |
| 225 Log.e(TAG, "ICE connection failure"); | 219 Log.e(TAG, "ICE connection failure"); |
| 226 } | 220 } |
| 227 | 221 |
| 228 return isIceConnected; | 222 return isIceConnected; |
| 229 } | 223 } |
| 230 } | 224 } |
| 231 | 225 |
| 232 private boolean waitForPeerConnectionClosed(int timeoutMs) | 226 private boolean waitForPeerConnectionClosed(int timeoutMs) throws InterruptedE
xception { |
| 233 throws InterruptedException { | 227 synchronized (closeEvent) { |
| 234 synchronized(closeEvent) { | |
| 235 if (!isClosed) { | 228 if (!isClosed) { |
| 236 closeEvent.wait(timeoutMs); | 229 closeEvent.wait(timeoutMs); |
| 237 } | 230 } |
| 238 return isClosed; | 231 return isClosed; |
| 239 } | 232 } |
| 240 } | 233 } |
| 241 | 234 |
| 242 PeerConnectionClient createPeerConnectionClient( | 235 PeerConnectionClient createPeerConnectionClient(MockRenderer localRenderer, |
| 243 MockRenderer localRenderer, MockRenderer remoteRenderer, | 236 MockRenderer remoteRenderer, PeerConnectionParameters peerConnectionParame
ters, |
| 244 PeerConnectionParameters peerConnectionParameters, EglBase.Context eglCont
ext) { | 237 EglBase.Context eglContext) { |
| 245 List<PeerConnection.IceServer> iceServers = | 238 List<PeerConnection.IceServer> iceServers = new LinkedList<PeerConnection.Ic
eServer>(); |
| 246 new LinkedList<PeerConnection.IceServer>(); | 239 SignalingParameters signalingParameters = |
| 247 SignalingParameters signalingParameters = new SignalingParameters( | 240 new SignalingParameters(iceServers, true, // iceServers, initiator. |
| 248 iceServers, true, // iceServers, initiator. | 241 null, null, null, // clientId, wssUrl, wssPostUrl. |
| 249 null, null, null, // clientId, wssUrl, wssPostUrl. | 242 null, null); // offerSdp, iceCandidates. |
| 250 null, null); // offerSdp, iceCandidates. | |
| 251 | 243 |
| 252 PeerConnectionClient client = PeerConnectionClient.getInstance(); | 244 PeerConnectionClient client = PeerConnectionClient.getInstance(); |
| 253 PeerConnectionFactory.Options options = new PeerConnectionFactory.Options(); | 245 PeerConnectionFactory.Options options = new PeerConnectionFactory.Options(); |
| 254 options.networkIgnoreMask = 0; | 246 options.networkIgnoreMask = 0; |
| 255 options.disableNetworkMonitor = true; | 247 options.disableNetworkMonitor = true; |
| 256 client.setPeerConnectionFactoryOptions(options); | 248 client.setPeerConnectionFactoryOptions(options); |
| 257 client.createPeerConnectionFactory( | 249 client.createPeerConnectionFactory( |
| 258 getInstrumentation().getTargetContext(), peerConnectionParameters, this)
; | 250 getInstrumentation().getTargetContext(), peerConnectionParameters, this)
; |
| 259 client.createPeerConnection(eglContext, localRenderer, remoteRenderer, signa
lingParameters); | 251 client.createPeerConnection(eglContext, localRenderer, remoteRenderer, signa
lingParameters); |
| 260 client.createOffer(); | 252 client.createOffer(); |
| 261 return client; | 253 return client; |
| 262 } | 254 } |
| 263 | 255 |
| 264 private PeerConnectionParameters createParametersForAudioCall() { | 256 private PeerConnectionParameters createParametersForAudioCall() { |
| 265 PeerConnectionParameters peerConnectionParameters = | 257 PeerConnectionParameters peerConnectionParameters = |
| 266 new PeerConnectionParameters( | 258 new PeerConnectionParameters(false, /* videoCallEnabled */ |
| 267 false, /* videoCallEnabled */ | |
| 268 true, /* loopback */ | 259 true, /* loopback */ |
| 269 false, /* tracing */ | 260 false, /* tracing */ |
| 270 // Video codec parameters. | 261 // Video codec parameters. |
| 271 true, /* useCamera2 */ | 262 true, /* useCamera2 */ |
| 272 0, /* videoWidth */ | 263 0, /* videoWidth */ |
| 273 0, /* videoHeight */ | 264 0, /* videoHeight */ |
| 274 0, /* videoFps */ | 265 0, /* videoFps */ |
| 275 0, /* videoStartBitrate */ | 266 0, /* videoStartBitrate */ |
| 276 "", /* videoCodec */ | 267 "", /* videoCodec */ |
| 277 true, /* videoCodecHwAcceleration */ | 268 true, /* videoCodecHwAcceleration */ |
| 278 false, /* captureToToTexture */ | 269 false, /* captureToToTexture */ |
| 279 // Audio codec parameters. | 270 // Audio codec parameters. |
| 280 0, /* audioStartBitrate */ | 271 0, /* audioStartBitrate */ |
| 281 "OPUS", /* audioCodec */ | 272 "OPUS", /* audioCodec */ |
| 282 false, /* noAudioProcessing */ | 273 false, /* noAudioProcessing */ |
| 283 false, /* aecDump */ | 274 false, /* aecDump */ |
| 284 false /* useOpenSLES */, | 275 false /* useOpenSLES */, false /* disableBuiltInAEC */, false /* dis
ableBuiltInAGC */, |
| 285 false /* disableBuiltInAEC */, | 276 false /* disableBuiltInNS */, false /* enableLevelControl */); |
| 286 false /* disableBuiltInAGC */, | |
| 287 false /* disableBuiltInNS */, | |
| 288 false /* enableLevelControl */); | |
| 289 return peerConnectionParameters; | 277 return peerConnectionParameters; |
| 290 } | 278 } |
| 291 | 279 |
| 292 private PeerConnectionParameters createParametersForVideoCall( | 280 private PeerConnectionParameters createParametersForVideoCall( |
| 293 String videoCodec, boolean captureToTexture) { | 281 String videoCodec, boolean captureToTexture) { |
| 294 final boolean useCamera2 = captureToTexture | 282 final boolean useCamera2 = |
| 295 && Camera2Enumerator.isSupported(getInstrumentation().getTargetContext()
); | 283 captureToTexture && Camera2Enumerator.isSupported(getInstrumentation().g
etTargetContext()); |
| 296 | 284 |
| 297 PeerConnectionParameters peerConnectionParameters = | 285 PeerConnectionParameters peerConnectionParameters = |
| 298 new PeerConnectionParameters( | 286 new PeerConnectionParameters(true, /* videoCallEnabled */ |
| 299 true, /* videoCallEnabled */ | |
| 300 true, /* loopback */ | 287 true, /* loopback */ |
| 301 false, /* tracing */ | 288 false, /* tracing */ |
| 302 // Video codec parameters. | 289 // Video codec parameters. |
| 303 useCamera2, /* useCamera2 */ | 290 useCamera2, /* useCamera2 */ |
| 304 0, /* videoWidth */ | 291 0, /* videoWidth */ |
| 305 0, /* videoHeight */ | 292 0, /* videoHeight */ |
| 306 0, /* videoFps */ | 293 0, /* videoFps */ |
| 307 0, /* videoStartBitrate */ | 294 0, /* videoStartBitrate */ |
| 308 videoCodec, /* videoCodec */ | 295 videoCodec, /* videoCodec */ |
| 309 true, /* videoCodecHwAcceleration */ | 296 true, /* videoCodecHwAcceleration */ |
| 310 captureToTexture, /* captureToToTexture */ | 297 captureToTexture, /* captureToToTexture */ |
| 311 // Audio codec parameters. | 298 // Audio codec parameters. |
| 312 0, /* audioStartBitrate */ | 299 0, /* audioStartBitrate */ |
| 313 "OPUS", /* audioCodec */ | 300 "OPUS", /* audioCodec */ |
| 314 false, /* noAudioProcessing */ | 301 false, /* noAudioProcessing */ |
| 315 false, /* aecDump */ | 302 false, /* aecDump */ |
| 316 false /* useOpenSLES */, | 303 false /* useOpenSLES */, false /* disableBuiltInAEC */, false /* dis
ableBuiltInAGC */, |
| 317 false /* disableBuiltInAEC */, | 304 false /* disableBuiltInNS */, false /* enableLevelControl */); |
| 318 false /* disableBuiltInAGC */, | |
| 319 false /* disableBuiltInNS */, | |
| 320 false /* enableLevelControl */); | |
| 321 return peerConnectionParameters; | 305 return peerConnectionParameters; |
| 322 } | 306 } |
| 323 | 307 |
| 324 @Override | 308 @Override |
| 325 public void setUp() { | 309 public void setUp() { |
| 326 signalingExecutor = Executors.newSingleThreadExecutor(); | 310 signalingExecutor = Executors.newSingleThreadExecutor(); |
| 327 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { | 311 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
| 328 eglBase = EglBase.create(); | 312 eglBase = EglBase.create(); |
| 329 } | 313 } |
| 330 } | 314 } |
| 331 | 315 |
| 332 @Override | 316 @Override |
| 333 public void tearDown() { | 317 public void tearDown() { |
| 334 signalingExecutor.shutdown(); | 318 signalingExecutor.shutdown(); |
| 335 if (eglBase != null) { | 319 if (eglBase != null) { |
| 336 eglBase.release(); | 320 eglBase.release(); |
| 337 } | 321 } |
| 338 } | 322 } |
| 339 | 323 |
| 340 @SmallTest | 324 @SmallTest |
| 341 public void testSetLocalOfferMakesVideoFlowLocally() | 325 public void testSetLocalOfferMakesVideoFlowLocally() throws InterruptedExcepti
on { |
| 342 throws InterruptedException { | |
| 343 Log.d(TAG, "testSetLocalOfferMakesVideoFlowLocally"); | 326 Log.d(TAG, "testSetLocalOfferMakesVideoFlowLocally"); |
| 344 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); | 327 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); |
| 345 pcClient = createPeerConnectionClient( | 328 pcClient = createPeerConnectionClient(localRenderer, new MockRenderer(0, nul
l), |
| 346 localRenderer, new MockRenderer(0, null), | |
| 347 createParametersForVideoCall(VIDEO_CODEC_VP8, false), null); | 329 createParametersForVideoCall(VIDEO_CODEC_VP8, false), null); |
| 348 | 330 |
| 349 // Wait for local SDP and ice candidates set events. | 331 // Wait for local SDP and ice candidates set events. |
| 350 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); | 332 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); |
| 351 assertTrue("ICE candidates were not generated.", | 333 assertTrue("ICE candidates were not generated.", waitForIceCandidates(WAIT_T
IMEOUT)); |
| 352 waitForIceCandidates(WAIT_TIMEOUT)); | |
| 353 | 334 |
| 354 // Check that local video frames were rendered. | 335 // Check that local video frames were rendered. |
| 355 assertTrue("Local video frames were not rendered.", | 336 assertTrue( |
| 356 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 337 "Local video frames were not rendered.", localRenderer.waitForFramesRend
ered(WAIT_TIMEOUT)); |
| 357 | 338 |
| 358 pcClient.close(); | 339 pcClient.close(); |
| 359 assertTrue("PeerConnection close event was not received.", | 340 assertTrue( |
| 360 waitForPeerConnectionClosed(WAIT_TIMEOUT)); | 341 "PeerConnection close event was not received.", waitForPeerConnectionClo
sed(WAIT_TIMEOUT)); |
| 361 Log.d(TAG, "testSetLocalOfferMakesVideoFlowLocally Done."); | 342 Log.d(TAG, "testSetLocalOfferMakesVideoFlowLocally Done."); |
| 362 } | 343 } |
| 363 | 344 |
| 364 private void doLoopbackTest(PeerConnectionParameters parameters, boolean decod
eToTexure) | 345 private void doLoopbackTest(PeerConnectionParameters parameters, boolean decod
eToTexure) |
| 365 throws InterruptedException { | 346 throws InterruptedException { |
| 366 loopback = true; | 347 loopback = true; |
| 367 MockRenderer localRenderer = null; | 348 MockRenderer localRenderer = null; |
| 368 MockRenderer remoteRenderer = null; | 349 MockRenderer remoteRenderer = null; |
| 369 if (parameters.videoCallEnabled) { | 350 if (parameters.videoCallEnabled) { |
| 370 Log.d(TAG, "testLoopback for video " + parameters.videoCodec); | 351 Log.d(TAG, "testLoopback for video " + parameters.videoCodec); |
| 371 localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAM
E); | 352 localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAM
E); |
| 372 remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_N
AME); | 353 remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_N
AME); |
| 373 } else { | 354 } else { |
| 374 Log.d(TAG, "testLoopback for audio."); | 355 Log.d(TAG, "testLoopback for audio."); |
| 375 } | 356 } |
| 376 pcClient = createPeerConnectionClient(localRenderer, remoteRenderer, paramet
ers, | 357 pcClient = createPeerConnectionClient(localRenderer, remoteRenderer, paramet
ers, |
| 377 decodeToTexure ? eglBase.getEglBaseContext() : null); | 358 decodeToTexure ? eglBase.getEglBaseContext() : null); |
| 378 | 359 |
| 379 // Wait for local SDP, rename it to answer and set as remote SDP. | 360 // Wait for local SDP, rename it to answer and set as remote SDP. |
| 380 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); | 361 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); |
| 381 SessionDescription remoteSdp = new SessionDescription( | 362 SessionDescription remoteSdp = new SessionDescription( |
| 382 SessionDescription.Type.fromCanonicalForm("answer"), | 363 SessionDescription.Type.fromCanonicalForm("answer"), localSdp.descriptio
n); |
| 383 localSdp.description); | |
| 384 pcClient.setRemoteDescription(remoteSdp); | 364 pcClient.setRemoteDescription(remoteSdp); |
| 385 | 365 |
| 386 // Wait for ICE connection. | 366 // Wait for ICE connection. |
| 387 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); | 367 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); |
| 388 | 368 |
| 389 if (parameters.videoCallEnabled) { | 369 if (parameters.videoCallEnabled) { |
| 390 // Check that local and remote video frames were rendered. | 370 // Check that local and remote video frames were rendered. |
| 391 assertTrue("Local video frames were not rendered.", | 371 assertTrue("Local video frames were not rendered.", |
| 392 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 372 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| 393 assertTrue("Remote video frames were not rendered.", | 373 assertTrue("Remote video frames were not rendered.", |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 485 // Wait for local SDP, rename it to answer and set as remote SDP. | 465 // Wait for local SDP, rename it to answer and set as remote SDP. |
| 486 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); | 466 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); |
| 487 | 467 |
| 488 // Release the EGL context used for creating the PeerConnectionClient. | 468 // Release the EGL context used for creating the PeerConnectionClient. |
| 489 // Since createPeerConnectionClient is asynchronous, we must wait for the lo
cal | 469 // Since createPeerConnectionClient is asynchronous, we must wait for the lo
cal |
| 490 // SessionDescription. | 470 // SessionDescription. |
| 491 eglBase.release(); | 471 eglBase.release(); |
| 492 eglBase = null; | 472 eglBase = null; |
| 493 | 473 |
| 494 SessionDescription remoteSdp = new SessionDescription( | 474 SessionDescription remoteSdp = new SessionDescription( |
| 495 SessionDescription.Type.fromCanonicalForm("answer"), | 475 SessionDescription.Type.fromCanonicalForm("answer"), localSdp.descriptio
n); |
| 496 localSdp.description); | |
| 497 pcClient.setRemoteDescription(remoteSdp); | 476 pcClient.setRemoteDescription(remoteSdp); |
| 498 | 477 |
| 499 // Wait for ICE connection. | 478 // Wait for ICE connection. |
| 500 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); | 479 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); |
| 501 // Check that local and remote video frames were rendered. | 480 // Check that local and remote video frames were rendered. |
| 502 assertTrue("Local video frames were not rendered.", | 481 assertTrue( |
| 503 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 482 "Local video frames were not rendered.", localRenderer.waitForFramesRend
ered(WAIT_TIMEOUT)); |
| 504 assertTrue("Remote video frames were not rendered.", | 483 assertTrue("Remote video frames were not rendered.", |
| 505 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 484 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| 506 | 485 |
| 507 pcClient.close(); | 486 pcClient.close(); |
| 508 assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT)); | 487 assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT)); |
| 509 Log.d(TAG, "testLoopback done."); | 488 Log.d(TAG, "testLoopback done."); |
| 510 } | 489 } |
| 511 | 490 |
| 512 @SmallTest | 491 @SmallTest |
| 513 public void testLoopbackH264CaptureToTexture() throws InterruptedException { | 492 public void testLoopbackH264CaptureToTexture() throws InterruptedException { |
| 514 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { | 493 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { |
| 515 Log.i(TAG, "Encode to textures is not supported. Requires KITKAT"); | 494 Log.i(TAG, "Encode to textures is not supported. Requires KITKAT"); |
| 516 return; | 495 return; |
| 517 } | 496 } |
| 518 // TODO(perkj): If we can always capture to textures, there is no need to ch
eck if the | 497 // TODO(perkj): If we can always capture to textures, there is no need to ch
eck if the |
| 519 // hardware encoder supports to encode from a texture. | 498 // hardware encoder supports to encode from a texture. |
| 520 if (!MediaCodecVideoEncoder.isH264HwSupportedUsingTextures()) { | 499 if (!MediaCodecVideoEncoder.isH264HwSupportedUsingTextures()) { |
| 521 Log.i(TAG, "H264 encode to textures is not supported."); | 500 Log.i(TAG, "H264 encode to textures is not supported."); |
| 522 return; | 501 return; |
| 523 } | 502 } |
| 524 doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_H264, true), true); | 503 doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_H264, true), true); |
| 525 } | 504 } |
| 526 | 505 |
| 527 | |
| 528 // Checks if default front camera can be switched to back camera and then | 506 // Checks if default front camera can be switched to back camera and then |
| 529 // again to front camera. | 507 // again to front camera. |
| 530 @SmallTest | 508 @SmallTest |
| 531 public void testCameraSwitch() throws InterruptedException { | 509 public void testCameraSwitch() throws InterruptedException { |
| 532 Log.d(TAG, "testCameraSwitch"); | 510 Log.d(TAG, "testCameraSwitch"); |
| 533 loopback = true; | 511 loopback = true; |
| 534 | 512 |
| 535 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); | 513 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); |
| 536 MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE
_RENDERER_NAME); | 514 MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE
_RENDERER_NAME); |
| 537 | 515 |
| 538 pcClient = createPeerConnectionClient( | 516 pcClient = createPeerConnectionClient( |
| 539 localRenderer, remoteRenderer, createParametersForVideoCall(VIDEO_CODEC_
VP8, false), null); | 517 localRenderer, remoteRenderer, createParametersForVideoCall(VIDEO_CODEC_
VP8, false), null); |
| 540 | 518 |
| 541 // Wait for local SDP, rename it to answer and set as remote SDP. | 519 // Wait for local SDP, rename it to answer and set as remote SDP. |
| 542 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); | 520 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); |
| 543 SessionDescription remoteSdp = new SessionDescription( | 521 SessionDescription remoteSdp = new SessionDescription( |
| 544 SessionDescription.Type.fromCanonicalForm("answer"), | 522 SessionDescription.Type.fromCanonicalForm("answer"), localSdp.descriptio
n); |
| 545 localSdp.description); | |
| 546 pcClient.setRemoteDescription(remoteSdp); | 523 pcClient.setRemoteDescription(remoteSdp); |
| 547 | 524 |
| 548 // Wait for ICE connection. | 525 // Wait for ICE connection. |
| 549 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); | 526 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); |
| 550 | 527 |
| 551 // Check that local and remote video frames were rendered. | 528 // Check that local and remote video frames were rendered. |
| 552 assertTrue("Local video frames were not rendered before camera switch.", | 529 assertTrue("Local video frames were not rendered before camera switch.", |
| 553 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 530 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| 554 assertTrue("Remote video frames were not rendered before camera switch.", | 531 assertTrue("Remote video frames were not rendered before camera switch.", |
| 555 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 532 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 581 | 558 |
| 582 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); | 559 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); |
| 583 MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE
_RENDERER_NAME); | 560 MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE
_RENDERER_NAME); |
| 584 | 561 |
| 585 pcClient = createPeerConnectionClient( | 562 pcClient = createPeerConnectionClient( |
| 586 localRenderer, remoteRenderer, createParametersForVideoCall(VIDEO_CODEC_
VP8, false), null); | 563 localRenderer, remoteRenderer, createParametersForVideoCall(VIDEO_CODEC_
VP8, false), null); |
| 587 | 564 |
| 588 // Wait for local SDP, rename it to answer and set as remote SDP. | 565 // Wait for local SDP, rename it to answer and set as remote SDP. |
| 589 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); | 566 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); |
| 590 SessionDescription remoteSdp = new SessionDescription( | 567 SessionDescription remoteSdp = new SessionDescription( |
| 591 SessionDescription.Type.fromCanonicalForm("answer"), | 568 SessionDescription.Type.fromCanonicalForm("answer"), localSdp.descriptio
n); |
| 592 localSdp.description); | |
| 593 pcClient.setRemoteDescription(remoteSdp); | 569 pcClient.setRemoteDescription(remoteSdp); |
| 594 | 570 |
| 595 // Wait for ICE connection. | 571 // Wait for ICE connection. |
| 596 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); | 572 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); |
| 597 | 573 |
| 598 // Check that local and remote video frames were rendered. | 574 // Check that local and remote video frames were rendered. |
| 599 assertTrue("Local video frames were not rendered before video restart.", | 575 assertTrue("Local video frames were not rendered before video restart.", |
| 600 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 576 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| 601 assertTrue("Remote video frames were not rendered before video restart.", | 577 assertTrue("Remote video frames were not rendered before video restart.", |
| 602 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 578 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 629 | 605 |
| 630 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); | 606 MockRenderer localRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, LOCAL_R
ENDERER_NAME); |
| 631 MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE
_RENDERER_NAME); | 607 MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE
_RENDERER_NAME); |
| 632 | 608 |
| 633 pcClient = createPeerConnectionClient( | 609 pcClient = createPeerConnectionClient( |
| 634 localRenderer, remoteRenderer, createParametersForVideoCall(VIDEO_CODEC_
VP8, false), null); | 610 localRenderer, remoteRenderer, createParametersForVideoCall(VIDEO_CODEC_
VP8, false), null); |
| 635 | 611 |
| 636 // Wait for local SDP, rename it to answer and set as remote SDP. | 612 // Wait for local SDP, rename it to answer and set as remote SDP. |
| 637 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); | 613 assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT)); |
| 638 SessionDescription remoteSdp = new SessionDescription( | 614 SessionDescription remoteSdp = new SessionDescription( |
| 639 SessionDescription.Type.fromCanonicalForm("answer"), | 615 SessionDescription.Type.fromCanonicalForm("answer"), localSdp.descriptio
n); |
| 640 localSdp.description); | |
| 641 pcClient.setRemoteDescription(remoteSdp); | 616 pcClient.setRemoteDescription(remoteSdp); |
| 642 | 617 |
| 643 // Wait for ICE connection. | 618 // Wait for ICE connection. |
| 644 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); | 619 assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAI
T_TIMEOUT)); |
| 645 | 620 |
| 646 // Check that local and remote video frames were rendered. | 621 // Check that local and remote video frames were rendered. |
| 647 assertTrue("Local video frames were not rendered before camera resolution ch
ange.", | 622 assertTrue("Local video frames were not rendered before camera resolution ch
ange.", |
| 648 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 623 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| 649 assertTrue("Remote video frames were not rendered before camera resolution c
hange.", | 624 assertTrue("Remote video frames were not rendered before camera resolution c
hange.", |
| 650 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 625 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 664 assertTrue("Local video frames were not rendered after capture format chan
ge.", | 639 assertTrue("Local video frames were not rendered after capture format chan
ge.", |
| 665 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 640 localRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| 666 assertTrue("Remote video frames were not rendered after capture format cha
nge.", | 641 assertTrue("Remote video frames were not rendered after capture format cha
nge.", |
| 667 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); | 642 remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT)); |
| 668 } | 643 } |
| 669 | 644 |
| 670 pcClient.close(); | 645 pcClient.close(); |
| 671 assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT)); | 646 assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT)); |
| 672 Log.d(TAG, "testCaptureFormatChange done."); | 647 Log.d(TAG, "testCaptureFormatChange done."); |
| 673 } | 648 } |
| 674 | |
| 675 } | 649 } |
| OLD | NEW |