Camera: Add getSessionCharacteristics API
Add API to fetch characteristics for a given session configuration.
API-Coverage-Bug: 314203548
Test: Build
Bug: 303645857
Change-Id: I8f7e881c328e56d37a2fe59064948b735650db5f
diff --git a/core/api/current.txt b/core/api/current.txt
index 17c11a8..5313df6 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -18786,6 +18786,7 @@
method @NonNull public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableCaptureRequestKeys();
method @NonNull public java.util.List<android.hardware.camera2.CaptureResult.Key<?>> getAvailableCaptureResultKeys();
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailablePhysicalCameraRequestKeys();
+ method @FlaggedApi("com.android.internal.camera.flags.feature_combination_query") @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getAvailableSessionCharacteristicsKeys();
method public java.util.List<android.hardware.camera2.CaptureRequest.Key<?>> getAvailableSessionKeys();
method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeys();
method @NonNull public java.util.List<android.hardware.camera2.CameraCharacteristics.Key<?>> getKeysNeedingPermission();
@@ -18938,6 +18939,7 @@
method @Deprecated public abstract void createReprocessableCaptureSessionByConfigurations(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List<android.hardware.camera2.params.OutputConfiguration>, @NonNull android.hardware.camera2.CameraCaptureSession.StateCallback, @Nullable android.os.Handler) throws android.hardware.camera2.CameraAccessException;
method public int getCameraAudioRestriction() throws android.hardware.camera2.CameraAccessException;
method @NonNull public abstract String getId();
+ method @FlaggedApi("com.android.internal.camera.flags.feature_combination_query") @NonNull public android.hardware.camera2.CameraCharacteristics getSessionCharacteristics(@NonNull android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
method @Deprecated public boolean isSessionConfigurationSupported(@NonNull android.hardware.camera2.params.SessionConfiguration) throws android.hardware.camera2.CameraAccessException;
method public void setCameraAudioRestriction(int) throws android.hardware.camera2.CameraAccessException;
field public static final int AUDIO_RESTRICTION_NONE = 0; // 0x0
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java
index bb8924c..dec5b9c 100644
--- a/core/java/android/hardware/camera2/CameraCharacteristics.java
+++ b/core/java/android/hardware/camera2/CameraCharacteristics.java
@@ -35,6 +35,7 @@
import com.android.internal.camera.flags.Flags;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -206,6 +207,7 @@
private List<CameraCharacteristics.Key<?>> mKeysNeedingPermission;
private List<CaptureRequest.Key<?>> mAvailableRequestKeys;
private List<CaptureRequest.Key<?>> mAvailableSessionKeys;
+ private List<CameraCharacteristics.Key<?>> mAvailableSessionCharacteristicsKeys;
private List<CaptureRequest.Key<?>> mAvailablePhysicalRequestKeys;
private List<CaptureResult.Key<?>> mAvailableResultKeys;
private ArrayList<RecommendedStreamConfigurationMap> mRecommendedConfigurations;
@@ -546,6 +548,27 @@
}
/**
+ * <p>Get the keys in Camera Characteristics whose values are capture session specific.
+ * The session specific characteristics can be acquired by calling
+ * CameraDevice.getSessionCharacteristics(). </p>
+ *
+ * <p>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.</p>
+ *
+ * @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 List<CameraCharacteristics.Key<?>> getAvailableSessionCharacteristicsKeys() {
+ if (mAvailableSessionCharacteristicsKeys == null) {
+ mAvailableSessionCharacteristicsKeys = Arrays.asList(CONTROL_ZOOM_RATIO_RANGE);
+ }
+ return mAvailableSessionCharacteristicsKeys;
+ }
+
+ /**
* <p>Returns a subset of {@link #getAvailableCaptureRequestKeys} keys that can
* be overridden for physical devices backing a logical multi-camera.</p>
*
diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java
index 58cba41..3835c52 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.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 @@
throw new UnsupportedOperationException("Subclasses must override this method");
}
- /**
+ /**
+ * <p>Get camera characteristics for a particular session configuration by the camera device.</p>
+ *
+ * <p>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}. </p>
+ *
+ * <p>Other than that, the characteristics returned here can be used in the same way as those
+ * returned from {@link CameraManager#getCameraCharacteristics}.</p>
+ *
+ * @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.
*
* <p>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 3851e36..ccb24e7 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -786,6 +786,18 @@
}
}
+ @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 b6b1968..2129260 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 @@
}
}
+ /**
+ * 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();