Index: webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java |
diff --git a/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java b/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java |
index 7f89ac8a61c5bda8f1850699962cf55c0b3a59a1..f35d50957cf183a8be8785babdd12c32298ceac2 100644 |
--- a/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java |
+++ b/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java |
@@ -191,9 +191,13 @@ class CameraVideoCapturerTestFixtures { |
public boolean onFirstFrameAvailableCalled; |
public final Object onCameraFreezedLock = new Object(); |
private String onCameraFreezedDescription; |
+ public final Object cameraClosedLock = new Object(); |
+ private boolean cameraClosed = true; |
@Override |
public void onCameraError(String errorDescription) { |
+ Logging.w(TAG, "Camera error: " + errorDescription); |
+ cameraClosed = true; |
} |
@Override |
@@ -207,6 +211,9 @@ class CameraVideoCapturerTestFixtures { |
@Override |
public void onCameraOpening(int cameraId) { |
onCameraOpeningCalled = true; |
+ synchronized (cameraClosedLock) { |
+ cameraClosed = false; |
+ } |
} |
@Override |
@@ -215,7 +222,12 @@ class CameraVideoCapturerTestFixtures { |
} |
@Override |
- public void onCameraClosed() { } |
+ public void onCameraClosed() { |
+ synchronized (cameraClosedLock) { |
+ cameraClosed = true; |
+ cameraClosedLock.notifyAll(); |
+ } |
+ } |
public String waitForCameraFreezed() throws InterruptedException { |
Logging.d(TAG, "Waiting for the camera to freeze"); |
@@ -224,6 +236,15 @@ class CameraVideoCapturerTestFixtures { |
return onCameraFreezedDescription; |
} |
} |
+ |
+ public void waitForCameraClosed() throws InterruptedException { |
+ synchronized (cameraClosedLock) { |
+ while (!cameraClosed) { |
+ Logging.d(TAG, "Waiting for the camera to close."); |
+ cameraClosedLock.wait(); |
+ } |
+ } |
+ } |
} |
/** |
@@ -332,7 +353,8 @@ class CameraVideoCapturerTestFixtures { |
} |
private CapturerInstance createCapturer(boolean initialize) { |
- return createCapturer("", initialize); |
+ String name = testObjectFactory.cameraEnumerator.getDeviceNames()[0]; |
+ return createCapturer(name, initialize); |
} |
private void startCapture(CapturerInstance instance) { |
@@ -347,12 +369,9 @@ class CameraVideoCapturerTestFixtures { |
instance.format = format; |
} |
- private void disposeCapturer(CapturerInstance instance) { |
- try { |
- instance.capturer.stopCapture(); |
- } catch (InterruptedException e) { |
- // TODO(sakal): Remove this once stopCapture no longer throws InterruptedException |
- } |
+ private void disposeCapturer(CapturerInstance instance) throws InterruptedException { |
+ instance.capturer.stopCapture(); |
+ instance.cameraEvents.waitForCameraClosed(); |
instance.capturer.dispose(); |
instance.surfaceTextureHelper.returnTextureFrame(); |
instance.surfaceTextureHelper.dispose(); |
@@ -416,11 +435,11 @@ class CameraVideoCapturerTestFixtures { |
} |
// Test methods |
- public void createCapturerAndDispose() { |
+ public void createCapturerAndDispose() throws InterruptedException { |
disposeCapturer(createCapturer(true /* initialize */)); |
} |
- public void createNonExistingCamera() { |
+ public void createNonExistingCamera() throws InterruptedException { |
try { |
disposeCapturer(createCapturer("non-existing camera", false /* initialize */)); |
} catch (IllegalArgumentException e) { |
@@ -431,7 +450,8 @@ class CameraVideoCapturerTestFixtures { |
} |
public void createCapturerAndRender() throws InterruptedException { |
- createCapturerAndRender(""); |
+ String name = testObjectFactory.cameraEnumerator.getDeviceNames()[0]; |
+ createCapturerAndRender(name); |
} |
public void createFrontFacingCapturerAndRender() throws InterruptedException { |
@@ -452,6 +472,8 @@ class CameraVideoCapturerTestFixtures { |
final CapturerInstance capturerInstance = createCapturer(false /* initialize */); |
final VideoTrackWithRenderer videoTrackWithRenderer = |
createVideoTrackWithRenderer(capturerInstance.capturer); |
+ // Wait for the camera to start so we can switch it |
+ assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0); |
// Array with one element to avoid final problem in nested classes. |
final boolean[] cameraSwitchSuccessful = new boolean[1]; |
@@ -485,7 +507,6 @@ class CameraVideoCapturerTestFixtures { |
// Make sure camera is started and first frame is received and then stop it. |
assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
capturerInstance.observer.waitForNextCapturedFrame(); |
- capturerInstance.capturer.stopCapture(); |
disposeCapturer(capturerInstance); |
assertTrue(capturerInstance.cameraEvents.onCameraOpeningCalled); |
@@ -670,7 +691,6 @@ class CameraVideoCapturerTestFixtures { |
if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP_MR1) { |
// The first opened camera client will be evicted. |
assertTrue(capturerInstance.observer.waitForCapturerToStart()); |
- capturerInstance.capturer.stopCapture(); |
} else { |
assertFalse(capturerInstance.observer.waitForCapturerToStart()); |
} |
@@ -699,7 +719,6 @@ class CameraVideoCapturerTestFixtures { |
Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Waiting for capture to start."); |
videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender(); |
Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Stopping capture."); |
- capturerInstance.capturer.stopCapture(); |
disposeCapturer(capturerInstance); |
} |
@@ -711,8 +730,6 @@ class CameraVideoCapturerTestFixtures { |
final Object competingCamera = testObjectFactory.rawOpenCamera(cameraName); |
startCapture(capturerInstance); |
- |
- capturerInstance.capturer.stopCapture(); |
disposeCapturer(capturerInstance); |
testObjectFactory.rawCloseCamera(competingCamera); |