aboutsummaryrefslogtreecommitdiff
path: root/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java
diff options
context:
space:
mode:
Diffstat (limited to 'apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java')
-rw-r--r--apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java88
1 files changed, 71 insertions, 17 deletions
diff --git a/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java b/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java
index aae07e9..753fa00 100644
--- a/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java
+++ b/apps/TestingCamera2/src/com/android/testingcamera2/v1/CameraOps.java
@@ -26,6 +26,7 @@ import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureRequest.Builder;
+import android.hardware.camera2.params.OutputConfiguration;
import android.util.Size;
import android.media.Image;
import android.media.ImageReader;
@@ -45,6 +46,7 @@ import com.android.ex.camera2.blocking.BlockingSessionCallback;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Set;
/**
* A camera controller class that runs in its own thread, to
@@ -67,6 +69,7 @@ public class CameraOps {
private final BlockingStateCallback mDeviceListener =
new BlockingStateCallback();
+ private String mCameraId;
private CameraDevice mCamera;
private CameraCaptureSession mSession;
@@ -80,6 +83,7 @@ public class CameraOps {
private CaptureRequest.Builder mRecordingRequestBuilder;
List<Surface> mOutputSurfaces = new ArrayList<Surface>(2);
private Surface mPreviewSurface;
+ private Surface mPreviewSurface2;
// How many JPEG buffers do we want to hold on to at once
private static final int MAX_CONCURRENT_JPEGS = 2;
@@ -103,6 +107,11 @@ public class CameraOps {
private final Listener mListener;
private final Handler mListenerHandler;
+ // Physical camera id of the current logical multi-camera. "" if this is not a logical
+ // multi-camera.
+ private String mPhysicalCameraId1;
+ private String mPhysicalCameraId2;
+
private void checkOk() {
if (mStatus < STATUS_OK) {
throw new IllegalStateException(String.format("Device not OK: %d", mStatus ));
@@ -173,18 +182,36 @@ public class CameraOps {
}
private void minimalOpenCamera() throws ApiFailureException {
- if (mCamera == null) {
- final String[] devices;
- final CameraCharacteristics characteristics;
+ // Open camera if not yet opened, or the currently opened camera is not the right one.
+ if (mCamera == null || !mCameraId.equals(mCamera.getId())) {
+ closeDevice();
+ mPhysicalCameraId1 = "";
+ mPhysicalCameraId2 = "";
+ final CameraCharacteristics characteristics;
try {
- devices = mCameraManager.getCameraIdList();
- if (devices == null || devices.length == 0) {
- throw new ApiFailureException("no devices");
+ CameraCharacteristics c = mCameraManager.getCameraCharacteristics(mCameraId);
+ int[] caps = c.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES);
+ for (int cap : caps) {
+ if (CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
+ != cap) {
+ continue;
+ }
+
+ Set<String> physicalIds = c.getPhysicalCameraIds();
+ if (physicalIds.size() != 2) {
+ throw new ApiFailureException(
+ "3 or more physical cameras are not yet supported");
+ }
+ String[] physicalIdsArray = physicalIds.toArray(new String[2]);
+ mPhysicalCameraId1 = physicalIdsArray[0];
+ mPhysicalCameraId2 = physicalIdsArray[1];
+ break;
}
- mCamera = mBlockingCameraManager.openCamera(devices[0],
+ Log.i(TAG, "Opening " + mCameraId);
+ mCamera = mBlockingCameraManager.openCamera(mCameraId,
mDeviceListener, mOpsHandler);
- mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCamera.getId());
+ mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId);
characteristics = mCameraCharacteristics;
} catch (CameraAccessException e) {
throw new ApiFailureException("open failure", e);
@@ -197,7 +224,7 @@ public class CameraOps {
mListenerHandler.post(new Runnable() {
@Override
public void run() {
- mListener.onCameraOpened(devices[0], characteristics);
+ mListener.onCameraOpened(mCameraId, characteristics);
}
});
}
@@ -212,11 +239,20 @@ public class CameraOps {
mSession = sessionListener.waitAndGetSession(IDLE_WAIT_MS);
}
+ private void configureOutputsByConfigs(List<OutputConfiguration> outputConfigs)
+ throws CameraAccessException {
+ BlockingSessionCallback sessionListener = new BlockingSessionCallback();
+ mCamera.createCaptureSessionByOutputConfigurations(outputConfigs, sessionListener, mOpsHandler);
+ mSession = sessionListener.waitAndGetSession(IDLE_WAIT_MS);
+ }
+
/**
* Set up SurfaceView dimensions for camera preview
*/
- public void minimalPreviewConfig(SurfaceHolder previewHolder) throws ApiFailureException {
+ public void minimalPreviewConfig(String cameraId, SurfaceHolder previewHolder,
+ SurfaceHolder previewHolder2) throws ApiFailureException {
+ mCameraId = cameraId;
minimalOpenCamera();
try {
CameraCharacteristics properties =
@@ -236,7 +272,9 @@ public class CameraOps {
}
Log.i(TAG, "Set preview size to " + sz.toString());
previewHolder.setFixedSize(sz.getWidth(), sz.getHeight());
+ previewHolder2.setFixedSize(sz.getWidth(), sz.getHeight());
mPreviewSurface = previewHolder.getSurface();
+ mPreviewSurface2 = previewHolder2.getSurface();
} catch (CameraAccessException e) {
throw new ApiFailureException("Error setting up minimal preview", e);
}
@@ -329,24 +367,40 @@ public class CameraOps {
/**
* Configure streams and run minimal preview
*/
- public void minimalPreview(SurfaceHolder previewHolder, CameraControls camCtl)
- throws ApiFailureException {
+ public void minimalPreview(SurfaceHolder previewHolder, SurfaceHolder previewHolder2,
+ CameraControls camCtl) throws ApiFailureException {
minimalOpenCamera();
- if (mPreviewSurface == null) {
+ if (mPreviewSurface == null || mPreviewSurface2 == null) {
throw new ApiFailureException("Preview surface is not created");
}
try {
- List<Surface> outputSurfaces = new ArrayList<Surface>(/*capacity*/1);
- outputSurfaces.add(mPreviewSurface);
-
- configureOutputs(outputSurfaces);
+ List<OutputConfiguration> outputConfigs =
+ new ArrayList<OutputConfiguration>(/*capacity*/2);
+ boolean isLogicalCamera =
+ !mPhysicalCameraId1.equals("") && !mPhysicalCameraId2.equals("");
+ if (isLogicalCamera) {
+ OutputConfiguration config1 = new OutputConfiguration(previewHolder.getSurface());
+ config1.setPhysicalCameraId(mPhysicalCameraId1);
+ outputConfigs.add(config1);
+
+ OutputConfiguration config2 = new OutputConfiguration(previewHolder2.getSurface());
+ config2.setPhysicalCameraId(mPhysicalCameraId2);
+ outputConfigs.add(config2);
+ } else {
+ OutputConfiguration config = new OutputConfiguration(previewHolder.getSurface());
+ outputConfigs.add(config);
+ }
+ configureOutputsByConfigs(outputConfigs);
mPreviewRequestBuilder = mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
updateCaptureRequest(mPreviewRequestBuilder, camCtl);
mPreviewRequestBuilder.addTarget(mPreviewSurface);
+ if (isLogicalCamera) {
+ mPreviewRequestBuilder.addTarget(mPreviewSurface2);
+ }
mSession.setRepeatingRequest(mPreviewRequestBuilder.build(), null, null);
} catch (CameraAccessException e) {