diff options
| author | 2024-05-10 16:01:39 +0000 | |
|---|---|---|
| committer | 2024-05-10 16:01:39 +0000 | |
| commit | 3d85c9daa9a27aed697dedaa84cd1d85e0da6b08 (patch) | |
| tree | b28e4b3e6675b22dd98ccef1fd006a8154dabbdc | |
| parent | e8af6041a4eddfc90a795ed4cccf693a63aa4b5c (diff) | |
| parent | c9e439051548b5116793f977f96b20d288da8ed5 (diff) | |
Merge "camera2: Ensure SessionCharacteristics and CameraCharactersitics can be used interchangeably" into 24D1-dev
| -rw-r--r-- | core/java/android/hardware/camera2/CameraManager.java | 97 | ||||
| -rw-r--r-- | core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java | 5 |
2 files changed, 79 insertions, 23 deletions
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index c7d886e23487..1a4c641c3d38 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -105,6 +105,33 @@ public final class CameraManager { private static final int CAMERA_TYPE_ALL = 1; private ArrayList<String> mDeviceIdList; + /** + * 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(); @@ -540,8 +567,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); @@ -649,28 +682,9 @@ public final class CameraManager { "Camera service is currently unavailable"); } try { - Size displaySize = getDisplaySize(); - CameraMetadataNative info = cameraService.getCameraCharacteristics(cameraId, mContext.getApplicationInfo().targetSdkVersion, overrideToPortrait); - 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); - 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) { @@ -683,6 +697,47 @@ 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); + 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/impl/CameraDeviceSetupImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java index 0f199b15af6c..0f16f37de2bb 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceSetupImpl.java @@ -130,11 +130,12 @@ public class CameraDeviceSetupImpl extends CameraDevice.CameraDeviceSetup { } try { - CameraMetadataNative metadataNative = cameraService.getSessionCharacteristics( + CameraMetadataNative metadata = cameraService.getSessionCharacteristics( mCameraId, mTargetSdkVersion, CameraManager.shouldOverrideToPortrait(mContext), sessionConfig); - return new CameraCharacteristics(metadataNative); + return mCameraManager.prepareCameraCharacteristics(mCameraId, metadata, + cameraService); } catch (ServiceSpecificException e) { switch (e.errorCode) { case ICameraService.ERROR_INVALID_OPERATION -> |