diff options
6 files changed, 105 insertions, 4 deletions
diff --git a/api/current.txt b/api/current.txt index 1254a8526eb0..d8de38398f92 100644 --- a/api/current.txt +++ b/api/current.txt @@ -17246,6 +17246,7 @@ package android.hardware.camera2 { field public static final int REQUEST_AVAILABLE_CAPABILITIES_MANUAL_SENSOR = 1; // 0x1 field public static final int REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME = 12; // 0xc field public static final int REQUEST_AVAILABLE_CAPABILITIES_MOTION_TRACKING = 10; // 0xa + field public static final int REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING = 15; // 0xf field public static final int REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING = 4; // 0x4 field public static final int REQUEST_AVAILABLE_CAPABILITIES_RAW = 3; // 0x3 field public static final int REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS = 5; // 0x5 diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 1f29d1a22325..c84c4a762796 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -935,7 +935,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>List of the maximum number of regions that can be used for metering in * auto-exposure (AE), auto-white balance (AWB), and auto-focus (AF); - * this corresponds to the the maximum number of elements in + * this corresponds to the maximum number of elements in * {@link CaptureRequest#CONTROL_AE_REGIONS android.control.aeRegions}, {@link CaptureRequest#CONTROL_AWB_REGIONS android.control.awbRegions}, * and {@link CaptureRequest#CONTROL_AF_REGIONS android.control.afRegions}.</p> * <p><b>Range of valid values:</b><br></p> @@ -955,7 +955,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>The maximum number of metering regions that can be used by the auto-exposure (AE) * routine.</p> - * <p>This corresponds to the the maximum allowed number of elements in + * <p>This corresponds to the maximum allowed number of elements in * {@link CaptureRequest#CONTROL_AE_REGIONS android.control.aeRegions}.</p> * <p><b>Range of valid values:</b><br> * Value will be >= 0. For FULL-capability devices, this @@ -973,7 +973,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>The maximum number of metering regions that can be used by the auto-white balance (AWB) * routine.</p> - * <p>This corresponds to the the maximum allowed number of elements in + * <p>This corresponds to the maximum allowed number of elements in * {@link CaptureRequest#CONTROL_AWB_REGIONS android.control.awbRegions}.</p> * <p><b>Range of valid values:</b><br> * Value will be >= 0.</p> @@ -989,7 +989,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri /** * <p>The maximum number of metering regions that can be used by the auto-focus (AF) routine.</p> - * <p>This corresponds to the the maximum allowed number of elements in + * <p>This corresponds to the maximum allowed number of elements in * {@link CaptureRequest#CONTROL_AF_REGIONS android.control.afRegions}.</p> * <p><b>Range of valid values:</b><br> * Value will be >= 0. For FULL-capability devices, this @@ -1987,6 +1987,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME MONOCHROME}</li> * <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA SECURE_IMAGE_DATA}</li> * <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA SYSTEM_CAMERA}</li> + * <li>{@link #REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING OFFLINE_PROCESSING}</li> * </ul></p> * <p>This key is available on all devices.</p> * @@ -2006,6 +2007,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * @see #REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME * @see #REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA * @see #REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA + * @see #REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING */ @PublicKey @NonNull diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 799c71683d8a..f2a7abd60d85 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -1004,6 +1004,51 @@ public abstract class CameraMetadata<TKey> { */ public static final int REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA = 14; + /** + * <p>The camera device supports the OFFLINE_PROCESSING use case.</p> + * <p>With OFFLINE_PROCESSING capability, the application can switch an ongoing + * capture session to offline mode by calling the + * CameraCaptureSession#switchToOffline method and specify streams to be kept in offline + * mode. The camera will then stop currently active repeating requests, prepare for + * some requests to go into offline mode, and return an offline session object. After + * the switchToOffline call returns, the original capture session is in closed state as + * if the CameraCaptureSession#close method has been called. + * In the offline mode, all inflight requests will continue to be processed in the + * background, and the application can immediately close the camera or create a new + * capture session without losing those requests' output images and capture results.</p> + * <p>While the camera device is processing offline requests, it + * might not be able to support all stream configurations it can support + * without offline requests. When that happens, the createCaptureSession + * method call will fail. The following stream configurations are guaranteed to work + * without hitting the resource busy exception:</p> + * <ul> + * <li>One ongoing offline session: target one output surface of YUV or + * JPEG format, any resolution.</li> + * <li>The active camera capture session:<ol> + * <li>One preview surface (SurfaceView or SurfaceTexture) up to 1920 width</li> + * <li>One YUV ImageReader surface up to 1920 width</li> + * <li>One Jpeg ImageReader, any resolution: the camera device is + * allowed to slow down JPEG output speed by 50% if there is any ongoing offline + * session.</li> + * <li>One ImageWriter surface of private format, any resolution if the device supports + * PRIVATE_REPROCESSING capability</li> + * </ol> + * </li> + * <li>Alternatively, the active camera session above can be replaced by an legacy + * {@link android.hardware.Camera Camera} with the following parameter settings:<ol> + * <li>Preview size up to 1920 width</li> + * <li>Preview callback size up to 1920 width</li> + * <li>Video size up to 1920 width</li> + * <li>Picture size, any resolution: the camera device is + * allowed to slow down JPEG output speed by 50% if there is any ongoing offline + * session.</li> + * </ol> + * </li> + * </ul> + * @see CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES + */ + public static final int REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING = 15; + // // Enumeration values for CameraCharacteristics#SCALER_CROPPING_TYPE // diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index bcbc33780ec4..41435c9b6a40 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -29,6 +29,7 @@ import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureResult; import android.hardware.camera2.ICameraDeviceCallbacks; import android.hardware.camera2.ICameraDeviceUser; +import android.hardware.camera2.ICameraOfflineSession; import android.hardware.camera2.TotalCaptureResult; import android.hardware.camera2.params.InputConfiguration; import android.hardware.camera2.params.OutputConfiguration; @@ -866,6 +867,38 @@ public class CameraDeviceImpl extends CameraDevice } } + public void switchToOffline(ICameraDeviceCallbacks cbs, Surface[] offlineOutputs) + throws CameraAccessException { + if ((offlineOutputs == null) || (offlineOutputs.length == 0)) { + throw new IllegalArgumentException("Invalid offline outputs!"); + } + if (cbs == null) { + throw new IllegalArgumentException("Invalid device callbacks!"); + } + + ICameraOfflineSession offlineSession = null; + synchronized(mInterfaceLock) { + int streamId = -1; + for (Surface surface : offlineOutputs) { + for (int i = 0; i < mConfiguredOutputs.size(); i++) { + if (surface == mConfiguredOutputs.valueAt(i).getSurface()) { + streamId = mConfiguredOutputs.keyAt(i); + break; + } + } + if (streamId == -1) { + throw new IllegalArgumentException("Offline surface is not part of this" + + " session"); + } + } + + offlineSession = mRemoteDevice.switchToOffline(cbs, + offlineOutputs); + // TODO: Initialize CameraOfflineSession wrapper, clear 'mConfiguredOutputs', + // and update request tracking + } + } + public void tearDown(Surface surface) throws CameraAccessException { if (surface == null) throw new IllegalArgumentException("Surface is null"); diff --git a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java index 3660f29f68d1..397417ba5b4f 100644 --- a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java +++ b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java @@ -28,6 +28,8 @@ import android.hardware.camera2.CameraManager; import android.hardware.camera2.CameraAccessException; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.ICameraDeviceUser; +import android.hardware.camera2.ICameraDeviceCallbacks; +import android.hardware.camera2.ICameraOfflineSession; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.params.OutputConfiguration; import android.hardware.camera2.params.SessionConfiguration; @@ -248,6 +250,17 @@ public class ICameraDeviceUserWrapper { } } + public ICameraOfflineSession switchToOffline(ICameraDeviceCallbacks cbs, + Surface[] offlineOutputs) + throws CameraAccessException { + try { + return mRemoteDevice.switchToOffline(cbs, offlineOutputs); + } catch (Throwable t) { + CameraManager.throwAsPublicException(t); + throw new UnsupportedOperationException("Unexpected exception", t); + } + } + public void finalizeOutputConfigurations(int streamId, OutputConfiguration deferredConfig) throws CameraAccessException { try { diff --git a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java index 5d1435ab4c8d..6ab0c294f5e4 100644 --- a/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java +++ b/core/java/android/hardware/camera2/legacy/CameraDeviceUserShim.java @@ -24,6 +24,7 @@ import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.ICameraDeviceCallbacks; import android.hardware.camera2.ICameraDeviceUser; +import android.hardware.camera2.ICameraOfflineSession; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.impl.CaptureResultExtras; import android.hardware.camera2.impl.PhysicalCaptureResultInfo; @@ -789,6 +790,12 @@ public class CameraDeviceUserShim implements ICameraDeviceUser { } @Override + public ICameraOfflineSession switchToOffline(ICameraDeviceCallbacks cbs, + Surface[] offlineOutputs) { + throw new UnsupportedOperationException("Legacy device does not support switchToOffline"); + } + + @Override public IBinder asBinder() { // This is solely intended to be used for in-process binding. return null; |