From 71f33eae7bfbe19de44974c8508eb7b3624bad38 Mon Sep 17 00:00:00 2001 From: Bharatt Kukreja Date: Tue, 21 Nov 2023 10:10:31 +0000 Subject: 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 --- core/api/current.txt | 2 ++ .../hardware/camera2/CameraCharacteristics.java | 23 +++++++++++++++ .../android/hardware/camera2/CameraDevice.java | 33 +++++++++++++++++++++- .../hardware/camera2/impl/CameraDeviceImpl.java | 12 ++++++++ .../camera2/impl/ICameraDeviceUserWrapper.java | 33 ++++++++++++++++------ 5 files changed, 93 insertions(+), 10 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 17c11a8ddbc5..5313df64cddd 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -18786,6 +18786,7 @@ package android.hardware.camera2 { method @NonNull public java.util.List> getAvailableCaptureRequestKeys(); method @NonNull public java.util.List> getAvailableCaptureResultKeys(); method public java.util.List> getAvailablePhysicalCameraRequestKeys(); + method @FlaggedApi("com.android.internal.camera.flags.feature_combination_query") @NonNull public java.util.List> getAvailableSessionCharacteristicsKeys(); method public java.util.List> getAvailableSessionKeys(); method @NonNull public java.util.List> getKeys(); method @NonNull public java.util.List> getKeysNeedingPermission(); @@ -18938,6 +18939,7 @@ package android.hardware.camera2 { method @Deprecated public abstract void createReprocessableCaptureSessionByConfigurations(@NonNull android.hardware.camera2.params.InputConfiguration, @NonNull java.util.List, @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 bb8924c3919a..dec5b9c7352c 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.annotations.GuardedBy; 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 @@ public final class CameraCharacteristics extends CameraMetadata> mKeysNeedingPermission; private List> mAvailableRequestKeys; private List> mAvailableSessionKeys; + private List> mAvailableSessionCharacteristicsKeys; private List> mAvailablePhysicalRequestKeys; private List> mAvailableResultKeys; private ArrayList mRecommendedConfigurations; @@ -545,6 +547,27 @@ public final class CameraCharacteristics extends CameraMetadataGet the keys in Camera Characteristics whose values are capture session specific. + * The session specific characteristics can be acquired by calling + * CameraDevice.getSessionCharacteristics().

+ * + *

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 List> getAvailableSessionCharacteristicsKeys() { + if (mAvailableSessionCharacteristicsKeys == null) { + mAvailableSessionCharacteristicsKeys = Arrays.asList(CONTROL_ZOOM_RATIO_RANGE); + } + return mAvailableSessionCharacteristicsKeys; + } + /** *

Returns 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