diff options
| author | 2023-12-07 17:52:52 +0000 | |
|---|---|---|
| committer | 2023-12-07 17:52:52 +0000 | |
| commit | 5d0a104b96036d9f345c1eb4fdf245d14963d87b (patch) | |
| tree | 22e7e246de89c5555694ccbc509d15732a410c09 | |
| parent | 219e099231c71e7e7e22a24f206ef4bd77d91fe1 (diff) | |
| parent | 71f33eae7bfbe19de44974c8508eb7b3624bad38 (diff) | |
Merge "Camera: Add getSessionCharacteristics API" into main
5 files changed, 93 insertions, 10 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 6864df8131b8..7206298287d9 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -18787,6 +18787,7 @@ package android.hardware.camera2 { 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(); @@ -18939,6 +18940,7 @@ package android.hardware.camera2 { 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 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<CameraCharacteri 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 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri } /** + * <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 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"); } - /** + /** + * <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 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(); |