Index: webrtc/api/androidtests/src/org/webrtc/Camera2CapturerTest.java |
diff --git a/webrtc/api/androidtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java b/webrtc/api/androidtests/src/org/webrtc/Camera2CapturerTest.java |
similarity index 60% |
copy from webrtc/api/androidtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java |
copy to webrtc/api/androidtests/src/org/webrtc/Camera2CapturerTest.java |
index 614105cd5df6fbc4392a96106b547f2d52568a7e..7ad60c05e7b53d38fa3c9c742a66c540f85d6d91 100644 |
--- a/webrtc/api/androidtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java |
+++ b/webrtc/api/androidtests/src/org/webrtc/Camera2CapturerTest.java |
@@ -13,19 +13,143 @@ package org.webrtc; |
import org.webrtc.CameraEnumerationAndroid.CaptureFormat; |
import android.content.Context; |
+import android.hardware.camera2.CameraDevice; |
+import android.hardware.camera2.CameraManager; |
+import android.hardware.camera2.CameraAccessException; |
+import android.os.Handler; |
+import android.os.Looper; |
import android.test.InstrumentationTestCase; |
import android.test.suitebuilder.annotation.SmallTest; |
import android.test.suitebuilder.annotation.MediumTest; |
import android.test.suitebuilder.annotation.LargeTest; |
-public class Camera1CapturerUsingTextureTest extends InstrumentationTestCase { |
- static final String TAG = "Camera1CapturerUsingTextureTest"; |
+import java.util.concurrent.CountDownLatch; |
+ |
+public class Camera2CapturerTest extends InstrumentationTestCase { |
+ static final String TAG = "Camera2CapturerTest"; |
+ |
+ /** |
+ * Simple camera2 implementation that only knows how to open the camera and close it. |
+ */ |
+ private class SimpleCamera2 { |
+ final CameraManager cameraManager; |
+ final LooperThread looperThread; |
+ final CountDownLatch openDoneSignal; |
+ final Object cameraDeviceLock; |
+ CameraDevice cameraDevice; // Guarded by cameraDeviceLock |
+ boolean openSucceeded; // Guarded by cameraDeviceLock |
+ |
+ private class LooperThread extends Thread { |
+ final CountDownLatch startedSignal = new CountDownLatch(1); |
+ private Handler handler; |
+ |
+ @Override |
+ public void run() { |
+ Looper.prepare(); |
+ handler = new Handler(); |
+ startedSignal.countDown(); |
+ Looper.loop(); |
+ } |
+ |
+ public void waitToStart() { |
+ ThreadUtils.awaitUninterruptibly(startedSignal); |
+ } |
+ |
+ public void requestStop() { |
+ handler.getLooper().quit(); |
+ } |
+ |
+ public Handler getHandler() { |
+ return handler; |
+ } |
+ } |
+ |
+ private class CameraStateCallback extends CameraDevice.StateCallback { |
+ @Override |
+ public void onClosed(CameraDevice cameraDevice) { |
+ Logging.d(TAG, "Simple camera2 closed."); |
+ |
+ synchronized (cameraDeviceLock) { |
+ SimpleCamera2.this.cameraDevice = null; |
+ } |
+ } |
+ |
+ @Override |
+ public void onDisconnected(CameraDevice cameraDevice) { |
+ Logging.d(TAG, "Simple camera2 disconnected."); |
+ |
+ synchronized (cameraDeviceLock) { |
+ SimpleCamera2.this.cameraDevice = null; |
+ } |
+ } |
+ |
+ @Override |
+ public void onError(CameraDevice cameraDevice, int errorCode) { |
+ Logging.w(TAG, "Simple camera2 error: " + errorCode); |
+ |
+ synchronized (cameraDeviceLock) { |
+ SimpleCamera2.this.cameraDevice = cameraDevice; |
+ openSucceeded = false; |
+ } |
+ |
+ openDoneSignal.countDown(); |
+ } |
+ |
+ @Override |
+ public void onOpened(CameraDevice cameraDevice) { |
+ Logging.d(TAG, "Simple camera2 opened."); |
+ |
+ synchronized (cameraDeviceLock) { |
+ SimpleCamera2.this.cameraDevice = cameraDevice; |
+ openSucceeded = true; |
+ } |
+ |
+ openDoneSignal.countDown(); |
+ } |
+ } |
+ |
+ SimpleCamera2(Context context, String deviceName) { |
+ cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); |
+ looperThread = new LooperThread(); |
+ looperThread.start(); |
+ looperThread.waitToStart(); |
+ cameraDeviceLock = new Object(); |
+ openDoneSignal = new CountDownLatch(1); |
+ cameraDevice = null; |
+ Logging.d(TAG, "Opening simple camera2."); |
+ try { |
+ cameraManager.openCamera(deviceName, new CameraStateCallback(), looperThread.getHandler()); |
+ } catch (CameraAccessException e) { |
+ fail("Simple camera2 CameraAccessException: " + e.getMessage()); |
+ } |
+ |
+ Logging.d(TAG, "Waiting for simple camera2 to open."); |
+ ThreadUtils.awaitUninterruptibly(openDoneSignal); |
+ synchronized (cameraDeviceLock) { |
+ if (!openSucceeded) { |
+ fail("Opening simple camera2 failed."); |
+ } |
+ } |
+ } |
+ |
+ public void close() { |
+ Logging.d(TAG, "Closing simple camera2."); |
+ synchronized (cameraDeviceLock) { |
+ if (cameraDevice != null) { |
+ cameraDevice.close(); |
+ } |
+ } |
+ |
+ looperThread.requestStop(); |
+ ThreadUtils.joinUninterruptibly(looperThread); |
+ } |
+ } |
private class TestObjectFactory |
extends CameraVideoCapturerTestFixtures.TestObjectFactory { |
@Override |
public CameraEnumerator getCameraEnumerator() { |
- return new Camera1Enumerator(); |
+ return new Camera2Enumerator(getAppContext()); |
} |
@Override |
@@ -36,13 +160,13 @@ public class Camera1CapturerUsingTextureTest extends InstrumentationTestCase { |
@SuppressWarnings("deprecation") |
@Override |
public Object rawOpenCamera(String cameraName) { |
- return android.hardware.Camera.open(Camera1Enumerator.getCameraIndex(cameraName)); |
+ return new SimpleCamera2(getAppContext(), cameraName); |
} |
@SuppressWarnings("deprecation") |
@Override |
public void rawCloseCamera(Object camera) { |
- ((android.hardware.Camera) camera).release(); |
+ ((SimpleCamera2) camera).close(); |
} |
} |