diff options
| author | 2024-04-01 17:43:33 +0000 | |
|---|---|---|
| committer | 2024-04-01 17:43:33 +0000 | |
| commit | 18e7428e8b1208a54983e43919a04d2634490474 (patch) | |
| tree | ec6c7d5404563f6f8b46c5348e4593dc618d8627 | |
| parent | 7f04bec505ba97e3cfaa76e853abfc984128fc95 (diff) | |
| parent | 22d63688cdec8826dfbcac681acf96c110d23ec9 (diff) | |
Merge changes from topic "session_chars_cp" into main
* changes:
camera2: Ensure SessionCharacteristics and CameraCharactersitics can be used interchangeably
Camera2: Add Session Characteristic keys by query version.
5 files changed, 114 insertions, 55 deletions
diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 21c700468cb4..ea7f8c4c5dfc 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -41,7 +41,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * <p>The properties describing a @@ -569,10 +571,23 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri @NonNull @FlaggedApi(Flags.FLAG_FEATURE_COMBINATION_QUERY) public List<CameraCharacteristics.Key<?>> getAvailableSessionCharacteristicsKeys() { - if (mAvailableSessionCharacteristicsKeys == null) { - mAvailableSessionCharacteristicsKeys = - Arrays.asList(CONTROL_ZOOM_RATIO_RANGE, SCALER_AVAILABLE_MAX_DIGITAL_ZOOM); + if (mAvailableSessionCharacteristicsKeys != null) { + return mAvailableSessionCharacteristicsKeys; } + + Integer queryVersion = get(INFO_SESSION_CONFIGURATION_QUERY_VERSION); + if (queryVersion == null) { + mAvailableSessionCharacteristicsKeys = List.of(); + return mAvailableSessionCharacteristicsKeys; + } + + mAvailableSessionCharacteristicsKeys = + AVAILABLE_SESSION_CHARACTERISTICS_KEYS_MAP.entrySet().stream() + .filter(e -> e.getKey() <= queryVersion) + .map(Map.Entry::getValue) + .flatMap(Arrays::stream) + .collect(Collectors.toUnmodifiableList()); + return mAvailableSessionCharacteristicsKeys; } @@ -6117,16 +6132,22 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri public static final Key<android.util.Range<Float>> EFV_PADDING_ZOOM_FACTOR_RANGE = new Key<android.util.Range<Float>>("android.efv.paddingZoomFactorRange", new TypeReference<android.util.Range<Float>>() {{ }}); + + /** + * Mapping from INFO_SESSION_CONFIGURATION_QUERY_VERSION to session characteristics key. + */ + private static final Map<Integer, Key<?>[]> AVAILABLE_SESSION_CHARACTERISTICS_KEYS_MAP = + Map.ofEntries( + Map.entry( + 35, + new Key<?>[] { + CONTROL_ZOOM_RATIO_RANGE, + SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, + } + ) + ); + /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ * End generated code *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ - - - - - - - - - } diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index ea7db4ccf5f2..4cd40ea57f0f 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -112,6 +112,34 @@ public final class CameraManager { private static final int CAMERA_TYPE_BACKWARD_COMPATIBLE = 0; private static final int CAMERA_TYPE_ALL = 1; + /** + * Caches the mapping between a logical camera ID and 'MultiResolutionStreamConfigurationMap' + * that is calculated by {@link #getPhysicalCameraMultiResolutionConfigs} as the calculation + * might take many binder calls. + * <p> + * Note, this is a map of maps. The structure is: + * <pre> + * { + * logicalCameraId_1 -> { + * physicalCameraId_1 -> [ + * streamConfiguration_1, + * streamConfiguration_2, + * ... + * ], + * physicalCameraId_2 -> [...], + * ... + * }, + * logicalCameraId_2 -> { + * ... + * }, + * ... + * } + * </pre> + * </p> + */ + private final Map<String, Map<String, StreamConfiguration[]>> + mCameraIdToMultiResolutionStreamConfigurationMap = new HashMap<>(); + private final Context mContext; private final Object mLock = new Object(); @@ -566,8 +594,14 @@ public final class CameraManager { private Map<String, StreamConfiguration[]> getPhysicalCameraMultiResolutionConfigs( String cameraId, CameraMetadataNative info, ICameraService cameraService) throws CameraAccessException { + if (mCameraIdToMultiResolutionStreamConfigurationMap.containsKey(cameraId)) { + return mCameraIdToMultiResolutionStreamConfigurationMap.get(cameraId); + } + HashMap<String, StreamConfiguration[]> multiResolutionStreamConfigurations = - new HashMap<String, StreamConfiguration[]>(); + new HashMap<>(); + mCameraIdToMultiResolutionStreamConfigurationMap.put(cameraId, + multiResolutionStreamConfigurations); Boolean multiResolutionStreamSupported = info.get( CameraCharacteristics.SCALER_MULTI_RESOLUTION_STREAM_SUPPORTED); @@ -676,30 +710,10 @@ public final class CameraManager { "Camera service is currently unavailable"); } try { - Size displaySize = getDisplaySize(); - CameraMetadataNative info = cameraService.getCameraCharacteristics(cameraId, mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait, mContext.getDeviceId(), getDevicePolicyFromContext(mContext)); - try { - info.setCameraId(Integer.parseInt(cameraId)); - } catch (NumberFormatException e) { - Log.v(TAG, "Failed to parse camera Id " + cameraId + " to integer"); - } - - boolean hasConcurrentStreams = - CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId, - mContext.getDeviceId()); - info.setHasMandatoryConcurrentStreams(hasConcurrentStreams); - info.setDisplaySize(displaySize); - - Map<String, StreamConfiguration[]> multiResolutionSizeMap = - getPhysicalCameraMultiResolutionConfigs(cameraId, info, cameraService); - if (multiResolutionSizeMap.size() > 0) { - info.setMultiResolutionStreamConfigurationMap(multiResolutionSizeMap); - } - - characteristics = new CameraCharacteristics(info); + characteristics = prepareCameraCharacteristics(cameraId, info, cameraService); } catch (ServiceSpecificException e) { throw ExceptionUtils.throwAsPublicException(e); } catch (RemoteException e) { @@ -712,6 +726,48 @@ public final class CameraManager { return characteristics; } + + /** + * Utility method to take a {@link CameraMetadataNative} object and wrap it into a + * {@link CameraCharacteristics} object that has all required fields and keys set and is fit + * for apps to consume. + * + * @param cameraId camera Id that the CameraMetadataNative was fetched for. + * @param metadata base CameraMetadataNative to be wrapped + * @param cameraService remote cameraservice instance to be used if binder calls need + * to be made. + * @return A CameraCharacteristics object that can be used by the apps. + * @hide + */ + @NonNull + public CameraCharacteristics prepareCameraCharacteristics( + @NonNull String cameraId, CameraMetadataNative metadata, ICameraService cameraService) + throws CameraAccessException { + synchronized (mLock) { + try { + metadata.setCameraId(Integer.parseInt(cameraId)); + } catch (NumberFormatException e) { + Log.v(TAG, "Failed to parse camera Id " + cameraId + " to integer"); + } + + boolean hasConcurrentStreams = + CameraManagerGlobal.get().cameraIdHasConcurrentStreamsLocked(cameraId, + mContext.getDeviceId()); + metadata.setHasMandatoryConcurrentStreams(hasConcurrentStreams); + + Size displaySize = getDisplaySize(); + metadata.setDisplaySize(displaySize); + + Map<String, StreamConfiguration[]> multiResolutionSizeMap = + getPhysicalCameraMultiResolutionConfigs(cameraId, metadata, cameraService); + if (!multiResolutionSizeMap.isEmpty()) { + metadata.setMultiResolutionStreamConfigurationMap(multiResolutionSizeMap); + } + + return new CameraCharacteristics(metadata); + } + } + /** * <p>Query the camera extension capabilities of a camera device.</p> * diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 6f901d7ec7d2..735b20f738ac 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -4454,13 +4454,4 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ * End generated code *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ - - - - - - - - - } diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index 69b1c34a1da2..76287ca8c286 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -6133,14 +6133,4 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { /*~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~ * End generated code *~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~@~O@*/ - - - - - - - - - - } diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java index 24ac0b56a095..81d0976c09bb 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java @@ -132,13 +132,14 @@ public class CameraDeviceSetupImpl extends CameraDevice.CameraDeviceSetup { } try { - CameraMetadataNative metadataNative = cameraService.getSessionCharacteristics( + CameraMetadataNative metadata = cameraService.getSessionCharacteristics( mCameraId, mTargetSdkVersion, CameraManager.shouldOverrideToPortrait(mContext), sessionConfig, mContext.getDeviceId(), mCameraManager.getDevicePolicyFromContext(mContext)); - return new CameraCharacteristics(metadataNative); + return mCameraManager.prepareCameraCharacteristics(mCameraId, metadata, + cameraService); } catch (ServiceSpecificException e) { switch (e.errorCode) { case ICameraService.ERROR_INVALID_OPERATION -> |