From 71f33eae7bfbe19de44974c8508eb7b3624bad38 Mon Sep 17 00:00:00 2001
From: Bharatt Kukreja
Note that getAvailableSessionKeys returns the CaptureRequest keys that are difficult to + * apply per-frame, whereas this function returns CameraCharacteristics keys that are dependent + * on a particular SessionConfiguration.
+ * + * @return List of CameraCharacteristic keys containing characterisitics specific to a session + * configuration. For Android 15, this list only contains CONTROL_ZOOM_RATIO_RANGE. + */ + @NonNull + @FlaggedApi(Flags.FLAG_FEATURE_COMBINATION_QUERY) + public ListReturns a subset of {@link #getAvailableCaptureRequestKeys} keys that can * be overridden for physical devices backing a logical multi-camera.
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index 58cba414fc47..3835c5201946 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -16,6 +16,7 @@ package android.hardware.camera2; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -28,6 +29,8 @@ import android.hardware.camera2.params.StreamConfigurationMap; import android.os.Handler; import android.view.Surface; +import com.android.internal.camera.flags.Flags; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.List; @@ -1412,7 +1415,35 @@ public abstract class CameraDevice implements AutoCloseable { throw new UnsupportedOperationException("Subclasses must override this method"); } - /** + /** + *Get camera characteristics for a particular session configuration by the camera device.
+ * + *The camera characteristics returned here is typically more limited than the characteristics + * returned from {@link CameraManager#getCameraCharacteristics}. The keys that have more limited + * values are listed in + * {@link CameraCharacteristics#getAvailableSessionCharacteristicsKeys}.
+ * + *Other than that, the characteristics returned here can be used in the same way as those + * returned from {@link CameraManager#getCameraCharacteristics}.
+ * + * @param sessionConfig : The session configuration for which characteristics are fetched. + * @return CameraCharacteristics specific to a given session configuration. + * @throws UnsupportedOperationException if the query operation is not supported by the camera + * device + * @throws IllegalArgumentException if the session configuration is invalid + * @throws CameraAccessException if the camera device is no longer connected or has + * encountered a fatal error + * @throws IllegalStateException if the camera device has been closed + * @see android.hardware.camera2.CameraCharacteristics#getAvailableSessionCharacteristicsKeys + */ + @NonNull + @FlaggedApi(Flags.FLAG_FEATURE_COMBINATION_QUERY) + public CameraCharacteristics getSessionCharacteristics( + @NonNull SessionConfiguration sessionConfig) throws CameraAccessException { + throw new UnsupportedOperationException("Subclasses must override this method"); + } + + /** * A callback objects for receiving updates about the state of a camera device. * *A callback instance must be provided to the {@link CameraManager#openCamera} method to diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index 3851e368fb62..ccb24e7d2457 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -786,6 +786,18 @@ public class CameraDeviceImpl extends CameraDevice } } + @Override + public CameraCharacteristics getSessionCharacteristics( + @NonNull SessionConfiguration sessionConfig) throws CameraAccessException, + UnsupportedOperationException, IllegalArgumentException { + synchronized (mInterfaceLock) { + checkIfCameraClosedOrInError(); + CameraMetadataNative info = mRemoteDevice.getSessionCharacteristics(sessionConfig); + + return new CameraCharacteristics(info); + } + } + /** * For use by backwards-compatibility code only. */ diff --git a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java index b6b1968bfcdd..2129260b0ae8 100644 --- a/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java +++ b/core/java/android/hardware/camera2/impl/ICameraDeviceUserWrapper.java @@ -16,19 +16,12 @@ package android.hardware.camera2.impl; -import static android.hardware.camera2.CameraAccessException.CAMERA_DISABLED; -import static android.hardware.camera2.CameraAccessException.CAMERA_DISCONNECTED; -import static android.hardware.camera2.CameraAccessException.CAMERA_IN_USE; -import static android.hardware.camera2.CameraAccessException.CAMERA_ERROR; -import static android.hardware.camera2.CameraAccessException.MAX_CAMERAS_IN_USE; -import static android.hardware.camera2.CameraAccessException.CAMERA_DEPRECATED_HAL; - import android.hardware.ICameraService; -import android.hardware.camera2.CameraManager; import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureRequest; -import android.hardware.camera2.ICameraDeviceUser; 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.params.OutputConfiguration; @@ -205,6 +198,28 @@ public class ICameraDeviceUserWrapper { } } + /** + * Fetches the CameraCharacteristics for a given session configuration. + */ + public CameraMetadataNative getSessionCharacteristics(SessionConfiguration sessionConfig) + throws CameraAccessException { + try { + return mRemoteDevice.getSessionCharacteristics(sessionConfig); + } catch (ServiceSpecificException e) { + if (e.errorCode == ICameraService.ERROR_INVALID_OPERATION) { + throw new UnsupportedOperationException("Session characteristics query not " + + "supported"); + } else if (e.errorCode == ICameraService.ERROR_ILLEGAL_ARGUMENT) { + throw new IllegalArgumentException("Invalid session configuration"); + } + + throw e; + } catch (Throwable t) { + CameraManager.throwAsPublicException(t); + throw new UnsupportedOperationException("Unexpected exception", t); + } + } + public long flush() throws CameraAccessException { try { return mRemoteDevice.flush(); -- cgit v1.2.3-59-g8ed1b