From e8c0483bf7374737b5a8426fd5861ae3de4c136d Mon Sep 17 00:00:00 2001 From: Kwangkyu Park Date: Fri, 28 Apr 2023 20:31:07 +0900 Subject: [PATCH] Camera: Use characteristic from user app for extension For the advanced extender, camera characteristics are provided from the extension proxy service. However, the vendor key-values are ripped off from the characteristics because the service does not hold the camera permission. To maintain consistency across the basic and advanced extender and CameraX extension and Camera2 extension, this change will populate the camera characteristics from the user app side. Bug: 279854053 Test: Manual test with vendor key, Camera Extension CTS Change-Id: Ic08751b824ea1cfa0208cf7246ab8c3ff7cd367c --- .../CameraExtensionCharacteristics.java | 85 ++++++++++--------- .../hardware/camera2/CameraManager.java | 5 +- .../extension/IAdvancedExtenderImpl.aidl | 6 +- .../extension/ISessionProcessorImpl.aidl | 5 +- .../CameraAdvancedExtensionSessionImpl.java | 26 +++--- .../camera2/impl/CameraDeviceImpl.java | 9 +- .../impl/CameraExtensionSessionImpl.java | 16 ++-- .../camera2/impl/CameraExtensionUtils.java | 11 +++ .../CameraExtensionsProxyService.java | 30 +++++-- 9 files changed, 121 insertions(+), 72 deletions(-) diff --git a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java index 1bf004a2aeb0f..d48e20e128b9f 100644 --- a/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraExtensionCharacteristics.java @@ -30,6 +30,7 @@ import android.hardware.camera2.extension.IInitializeSessionCallback; import android.hardware.camera2.extension.IPreviewExtenderImpl; import android.hardware.camera2.extension.LatencyRange; import android.hardware.camera2.extension.SizeList; +import android.hardware.camera2.impl.CameraExtensionUtils; import android.hardware.camera2.impl.CameraMetadataNative; import android.hardware.camera2.params.ExtensionSessionConfiguration; import android.hardware.camera2.params.StreamConfigurationMap; @@ -47,8 +48,10 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.concurrent.Future; @@ -161,16 +164,19 @@ public final class CameraExtensionCharacteristics { private final Context mContext; private final String mCameraId; - private final CameraCharacteristics mChars; + private final Map mCharacteristicsMap; + private final Map mCharacteristicsMapNative; /** * @hide */ public CameraExtensionCharacteristics(Context context, String cameraId, - CameraCharacteristics chars) { + Map characteristicsMap) { mContext = context; mCameraId = cameraId; - mChars = chars; + mCharacteristicsMap = characteristicsMap; + mCharacteristicsMapNative = + CameraExtensionUtils.getCharacteristicsMapNative(characteristicsMap); } private static ArrayList getSupportedSizes(List sizesList, @@ -468,11 +474,11 @@ public final class CameraExtensionCharacteristics { * @hide */ public static boolean isExtensionSupported(String cameraId, int extensionType, - CameraCharacteristics chars) { + Map characteristicsMap) { if (areAdvancedExtensionsSupported()) { try { IAdvancedExtenderImpl extender = initializeAdvancedExtension(extensionType); - return extender.isExtensionAvailable(cameraId); + return extender.isExtensionAvailable(cameraId, characteristicsMap); } catch (RemoteException e) { Log.e(TAG, "Failed to query extension availability! Extension service does not" + " respond!"); @@ -487,8 +493,10 @@ public final class CameraExtensionCharacteristics { } try { - return extenders.first.isExtensionAvailable(cameraId, chars.getNativeMetadata()) && - extenders.second.isExtensionAvailable(cameraId, chars.getNativeMetadata()); + return extenders.first.isExtensionAvailable(cameraId, + characteristicsMap.get(cameraId)) + && extenders.second.isExtensionAvailable(cameraId, + characteristicsMap.get(cameraId)); } catch (RemoteException e) { Log.e(TAG, "Failed to query extension availability! Extension service does not" + " respond!"); @@ -563,7 +571,7 @@ public final class CameraExtensionCharacteristics { try { for (int extensionType : EXTENSION_LIST) { - if (isExtensionSupported(mCameraId, extensionType, mChars)) { + if (isExtensionSupported(mCameraId, extensionType, mCharacteristicsMapNative)) { ret.add(extensionType); } } @@ -597,18 +605,18 @@ public final class CameraExtensionCharacteristics { } try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } if (areAdvancedExtensionsSupported()) { IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); return extender.isPostviewAvailable(); } else { Pair extenders = initializeExtension(extension); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); return extenders.second.isPostviewAvailable(); } } catch (RemoteException e) { @@ -655,7 +663,7 @@ public final class CameraExtensionCharacteristics { } try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } @@ -664,7 +672,7 @@ public final class CameraExtensionCharacteristics { sz.width = captureSize.getWidth(); sz.height = captureSize.getHeight(); - StreamConfigurationMap streamMap = mChars.get( + StreamConfigurationMap streamMap = mCharacteristicsMap.get(mCameraId).get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); if (areAdvancedExtensionsSupported()) { @@ -676,13 +684,13 @@ public final class CameraExtensionCharacteristics { throw new IllegalArgumentException("Unsupported format: " + format); } IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); return generateSupportedSizes(extender.getSupportedPostviewResolutions( sz), format, streamMap); } else { Pair extenders = initializeExtension(extension); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); if ((extenders.second.getCaptureProcessor() == null) || !isPostviewAvailable(extension)) { // Extensions that don't implement any capture processor @@ -754,22 +762,23 @@ public final class CameraExtensionCharacteristics { } try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } - StreamConfigurationMap streamMap = mChars.get( + StreamConfigurationMap streamMap = mCharacteristicsMap.get(mCameraId).get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); if (areAdvancedExtensionsSupported()) { IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); return generateSupportedSizes( extender.getSupportedPreviewOutputResolutions(mCameraId), ImageFormat.PRIVATE, streamMap); } else { Pair extenders = initializeExtension(extension); - extenders.first.init(mCameraId, mChars.getNativeMetadata()); + extenders.first.init(mCameraId, + mCharacteristicsMapNative.get(mCameraId)); return generateSupportedSizes(extenders.first.getSupportedResolutions(), ImageFormat.PRIVATE, streamMap); } @@ -811,11 +820,11 @@ public final class CameraExtensionCharacteristics { } try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } - StreamConfigurationMap streamMap = mChars.get( + StreamConfigurationMap streamMap = mCharacteristicsMap.get(mCameraId).get( CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); if (areAdvancedExtensionsSupported()) { switch(format) { @@ -826,14 +835,14 @@ public final class CameraExtensionCharacteristics { throw new IllegalArgumentException("Unsupported format: " + format); } IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); return generateSupportedSizes(extender.getSupportedCaptureOutputResolutions( mCameraId), format, streamMap); } else { if (format == ImageFormat.YUV_420_888) { Pair extenders = initializeExtension(extension); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); if (extenders.second.getCaptureProcessor() == null) { // Extensions that don't implement any capture processor are limited to // JPEG only! @@ -844,7 +853,7 @@ public final class CameraExtensionCharacteristics { } else if (format == ImageFormat.JPEG) { Pair extenders = initializeExtension(extension); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); if (extenders.second.getCaptureProcessor() != null) { // The framework will perform the additional encoding pass on the // processed YUV_420 buffers. @@ -900,7 +909,7 @@ public final class CameraExtensionCharacteristics { } try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } @@ -910,7 +919,7 @@ public final class CameraExtensionCharacteristics { sz.height = captureOutputSize.getHeight(); if (areAdvancedExtensionsSupported()) { IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); LatencyRange latencyRange = extender.getEstimatedCaptureLatencyRange(mCameraId, sz, format); if (latencyRange != null) { @@ -919,7 +928,7 @@ public final class CameraExtensionCharacteristics { } else { Pair extenders = initializeExtension(extension); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); if ((format == ImageFormat.YUV_420_888) && (extenders.second.getCaptureProcessor() == null) ){ // Extensions that don't implement any capture processor are limited to @@ -965,18 +974,18 @@ public final class CameraExtensionCharacteristics { } try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } if (areAdvancedExtensionsSupported()) { IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); return extender.isCaptureProcessProgressAvailable(); } else { Pair extenders = initializeExtension(extension); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); return extenders.second.isCaptureProcessProgressAvailable(); } } catch (RemoteException e) { @@ -1012,20 +1021,20 @@ public final class CameraExtensionCharacteristics { HashSet ret = new HashSet<>(); try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } CameraMetadataNative captureRequestMeta = null; if (areAdvancedExtensionsSupported()) { IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); captureRequestMeta = extender.getAvailableCaptureRequestKeys(mCameraId); } else { Pair extenders = initializeExtension(extension); - extenders.second.onInit(mCameraId, mChars.getNativeMetadata()); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.onInit(mCameraId, mCharacteristicsMapNative.get(mCameraId)); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); captureRequestMeta = extenders.second.getAvailableCaptureRequestKeys(); extenders.second.onDeInit(); } @@ -1090,20 +1099,20 @@ public final class CameraExtensionCharacteristics { HashSet ret = new HashSet<>(); try { - if (!isExtensionSupported(mCameraId, extension, mChars)) { + if (!isExtensionSupported(mCameraId, extension, mCharacteristicsMapNative)) { throw new IllegalArgumentException("Unsupported extension"); } CameraMetadataNative captureResultMeta = null; if (areAdvancedExtensionsSupported()) { IAdvancedExtenderImpl extender = initializeAdvancedExtension(extension); - extender.init(mCameraId); + extender.init(mCameraId, mCharacteristicsMapNative); captureResultMeta = extender.getAvailableCaptureResultKeys(mCameraId); } else { Pair extenders = initializeExtension(extension); - extenders.second.onInit(mCameraId, mChars.getNativeMetadata()); - extenders.second.init(mCameraId, mChars.getNativeMetadata()); + extenders.second.onInit(mCameraId, mCharacteristicsMapNative.get(mCameraId)); + extenders.second.init(mCameraId, mCharacteristicsMapNative.get(mCameraId)); captureResultMeta = extenders.second.getAvailableCaptureResultKeys(); extenders.second.onDeInit(); } diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java index 73dd50945289e..c6fc69efb85cf 100644 --- a/core/java/android/hardware/camera2/CameraManager.java +++ b/core/java/android/hardware/camera2/CameraManager.java @@ -694,7 +694,10 @@ public final class CameraManager { public CameraExtensionCharacteristics getCameraExtensionCharacteristics( @NonNull String cameraId) throws CameraAccessException { CameraCharacteristics chars = getCameraCharacteristics(cameraId); - return new CameraExtensionCharacteristics(mContext, cameraId, chars); + Map characteristicsMap = getPhysicalIdToCharsMap(chars); + characteristicsMap.put(cameraId, chars); + + return new CameraExtensionCharacteristics(mContext, cameraId, characteristicsMap); } private Map getPhysicalIdToCharsMap( diff --git a/core/java/android/hardware/camera2/extension/IAdvancedExtenderImpl.aidl b/core/java/android/hardware/camera2/extension/IAdvancedExtenderImpl.aidl index c9b7ea139cb90..101442f28c293 100644 --- a/core/java/android/hardware/camera2/extension/IAdvancedExtenderImpl.aidl +++ b/core/java/android/hardware/camera2/extension/IAdvancedExtenderImpl.aidl @@ -15,6 +15,8 @@ */ package android.hardware.camera2.extension; +import android.hardware.camera2.impl.CameraMetadataNative; + import android.hardware.camera2.extension.ISessionProcessorImpl; import android.hardware.camera2.extension.LatencyRange; import android.hardware.camera2.extension.Size; @@ -24,8 +26,8 @@ import android.hardware.camera2.impl.CameraMetadataNative; /** @hide */ interface IAdvancedExtenderImpl { - boolean isExtensionAvailable(in String cameraId); - void init(in String cameraId); + boolean isExtensionAvailable(in String cameraId, in Map charsMap); + void init(in String cameraId, in Map charsMap); LatencyRange getEstimatedCaptureLatencyRange(in String cameraId, in Size outputSize, int format); @nullable List getSupportedPreviewOutputResolutions(in String cameraId); diff --git a/core/java/android/hardware/camera2/extension/ISessionProcessorImpl.aidl b/core/java/android/hardware/camera2/extension/ISessionProcessorImpl.aidl index 2af1df9e1a7ef..13b93a8c5e922 100644 --- a/core/java/android/hardware/camera2/extension/ISessionProcessorImpl.aidl +++ b/core/java/android/hardware/camera2/extension/ISessionProcessorImpl.aidl @@ -15,6 +15,8 @@ */ package android.hardware.camera2.extension; +import android.hardware.camera2.impl.CameraMetadataNative; + import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.extension.CameraSessionConfig; import android.hardware.camera2.extension.ICaptureCallback; @@ -26,7 +28,8 @@ import android.hardware.camera2.extension.OutputSurface; /** @hide */ interface ISessionProcessorImpl { - CameraSessionConfig initSession(in String cameraId, in OutputSurface previewSurface, + CameraSessionConfig initSession(in String cameraId, + in Map charsMap, in OutputSurface previewSurface, in OutputSurface imageCaptureSurface, in OutputSurface postviewSurface); void deInitSession(); void onCaptureSessionStart(IRequestProcessorImpl requestProcessor); diff --git a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java index cfade5532df76..10753faace983 100644 --- a/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraAdvancedExtensionSessionImpl.java @@ -29,7 +29,6 @@ import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraDevice; import android.hardware.camera2.CameraExtensionCharacteristics; import android.hardware.camera2.CameraExtensionSession; -import android.hardware.camera2.CameraManager; import android.hardware.camera2.CaptureFailure; import android.hardware.camera2.CaptureRequest; import android.hardware.camera2.CaptureResult; @@ -78,6 +77,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes private final Executor mExecutor; private final CameraDevice mCameraDevice; + private final Map mCharacteristicsMap; private final long mExtensionClientId; private final Handler mHandler; private final HandlerThread mHandlerThread; @@ -109,6 +109,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes @RequiresPermission(android.Manifest.permission.CAMERA) public static CameraAdvancedExtensionSessionImpl createCameraAdvancedExtensionSession( @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice, + @NonNull Map characteristicsMap, @NonNull Context ctx, @NonNull ExtensionSessionConfiguration config, int sessionId) throws CameraAccessException, RemoteException { long clientId = CameraExtensionCharacteristics.registerClient(ctx); @@ -117,13 +118,13 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes } String cameraId = cameraDevice.getId(); - CameraManager manager = ctx.getSystemService(CameraManager.class); - CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId); CameraExtensionCharacteristics extensionChars = new CameraExtensionCharacteristics(ctx, - cameraId, chars); + cameraId, characteristicsMap); + Map characteristicsMapNative = + CameraExtensionUtils.getCharacteristicsMapNative(characteristicsMap); if (!CameraExtensionCharacteristics.isExtensionSupported(cameraDevice.getId(), - config.getExtension(), chars)) { + config.getExtension(), characteristicsMapNative)) { throw new UnsupportedOperationException("Unsupported extension type: " + config.getExtension()); } @@ -198,11 +199,12 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes IAdvancedExtenderImpl extender = CameraExtensionCharacteristics.initializeAdvancedExtension( config.getExtension()); - extender.init(cameraId); + extender.init(cameraId, characteristicsMapNative); CameraAdvancedExtensionSessionImpl ret = new CameraAdvancedExtensionSessionImpl(clientId, - extender, cameraDevice, repeatingRequestSurface, burstCaptureSurface, - postviewSurface, config.getStateCallback(), config.getExecutor(), sessionId); + extender, cameraDevice, characteristicsMapNative, repeatingRequestSurface, + burstCaptureSurface, postviewSurface, config.getStateCallback(), + config.getExecutor(), sessionId); ret.initialize(); return ret; @@ -210,14 +212,16 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes private CameraAdvancedExtensionSessionImpl(long extensionClientId, @NonNull IAdvancedExtenderImpl extender, - @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice, + @NonNull CameraDeviceImpl cameraDevice, + Map characteristicsMap, @Nullable Surface repeatingRequestSurface, @Nullable Surface burstCaptureSurface, @Nullable Surface postviewSurface, - @NonNull CameraExtensionSession.StateCallback callback, @NonNull Executor executor, + @NonNull StateCallback callback, @NonNull Executor executor, int sessionId) { mExtensionClientId = extensionClientId; mAdvancedExtender = extender; mCameraDevice = cameraDevice; + mCharacteristicsMap = characteristicsMap; mCallbacks = callback; mExecutor = executor; mClientRepeatingRequestSurface = repeatingRequestSurface; @@ -247,7 +251,7 @@ public final class CameraAdvancedExtensionSessionImpl extends CameraExtensionSes mSessionProcessor = mAdvancedExtender.getSessionProcessor(); CameraSessionConfig sessionConfig = mSessionProcessor.initSession(mCameraDevice.getId(), - previewSurface, captureSurface, postviewSurface); + mCharacteristicsMap, previewSurface, captureSurface, postviewSurface); List outputConfigs = sessionConfig.outputConfigs; ArrayList outputList = new ArrayList<>(); for (CameraOutputConfig output : outputConfigs) { diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java index cb1efe8c2b552..42b27c802b97f 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -2508,14 +2508,19 @@ public class CameraDeviceImpl extends CameraDevice @Override public void createExtensionSession(ExtensionSessionConfiguration extensionConfiguration) throws CameraAccessException { + HashMap characteristicsMap = new HashMap<>( + mPhysicalIdsToChars); + characteristicsMap.put(mCameraId, mCharacteristics); try { if (CameraExtensionCharacteristics.areAdvancedExtensionsSupported()) { mCurrentAdvancedExtensionSession = CameraAdvancedExtensionSessionImpl.createCameraAdvancedExtensionSession( - this, mContext, extensionConfiguration, mNextSessionId++); + this, characteristicsMap, mContext, extensionConfiguration, + mNextSessionId++); } else { mCurrentExtensionSession = CameraExtensionSessionImpl.createCameraExtensionSession( - this, mContext, extensionConfiguration, mNextSessionId++); + this, characteristicsMap, mContext, extensionConfiguration, + mNextSessionId++); } } catch (RemoteException e) { throw new CameraAccessException(CameraAccessException.CAMERA_ERROR); diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java index 9c878c78855ba..48f18c9d23877 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionSessionImpl.java @@ -129,6 +129,7 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { @RequiresPermission(android.Manifest.permission.CAMERA) public static CameraExtensionSessionImpl createCameraExtensionSession( @NonNull android.hardware.camera2.impl.CameraDeviceImpl cameraDevice, + @NonNull Map characteristicsMap, @NonNull Context ctx, @NonNull ExtensionSessionConfiguration config, int sessionId) @@ -139,13 +140,12 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { } String cameraId = cameraDevice.getId(); - CameraManager manager = ctx.getSystemService(CameraManager.class); - CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId); CameraExtensionCharacteristics extensionChars = new CameraExtensionCharacteristics(ctx, - cameraId, chars); + cameraId, characteristicsMap); if (!CameraExtensionCharacteristics.isExtensionSupported(cameraDevice.getId(), - config.getExtension(), chars)) { + config.getExtension(), + CameraExtensionUtils.getCharacteristicsMapNative(characteristicsMap))) { throw new UnsupportedOperationException("Unsupported extension type: " + config.getExtension()); } @@ -222,10 +222,10 @@ public final class CameraExtensionSessionImpl extends CameraExtensionSession { } } - extenders.first.init(cameraId, chars.getNativeMetadata()); - extenders.first.onInit(cameraId, chars.getNativeMetadata()); - extenders.second.init(cameraId, chars.getNativeMetadata()); - extenders.second.onInit(cameraId, chars.getNativeMetadata()); + extenders.first.init(cameraId, characteristicsMap.get(cameraId).getNativeMetadata()); + extenders.first.onInit(cameraId, characteristicsMap.get(cameraId).getNativeMetadata()); + extenders.second.init(cameraId, characteristicsMap.get(cameraId).getNativeMetadata()); + extenders.second.onInit(cameraId, characteristicsMap.get(cameraId).getNativeMetadata()); CameraExtensionSessionImpl session = new CameraExtensionSessionImpl( extenders.second, diff --git a/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java b/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java index 08111c5f38745..f4fc472accbe8 100644 --- a/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java +++ b/core/java/android/hardware/camera2/impl/CameraExtensionUtils.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.graphics.ImageFormat; import android.graphics.PixelFormat; import android.hardware.HardwareBuffer; +import android.hardware.camera2.CameraCharacteristics; import android.hardware.camera2.CameraExtensionCharacteristics; import android.hardware.camera2.params.OutputConfiguration; import android.hardware.camera2.params.StreamConfigurationMap; @@ -34,6 +35,7 @@ import android.view.Surface; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.RejectedExecutionException; @@ -169,4 +171,13 @@ public final class CameraExtensionUtils { return null; } + + public static Map getCharacteristicsMapNative( + Map charsMap) { + HashMap ret = new HashMap<>(); + for (Map.Entry entry : charsMap.entrySet()) { + ret.put(entry.getKey(), entry.getValue().getNativeMetadata()); + } + return ret; + } } diff --git a/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java b/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java index 1298f638b01c3..f31ca8178eb67 100644 --- a/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java +++ b/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java @@ -151,7 +151,6 @@ public class CameraExtensionsProxyService extends Service { (EXTENSIONS_VERSION.startsWith(RESULTS_VERSION_PREFIX) || EXTENSIONS_VERSION.startsWith(LATENCY_VERSION_PREFIX)); - private HashMap mCharacteristicsHashMap = new HashMap<>(); private HashMap mMetadataVendorIdMap = new HashMap<>(); private CameraManager mCameraManager; @@ -501,7 +500,6 @@ public class CameraExtensionsProxyService extends Service { if (cameraIds != null) { for (String cameraId : cameraIds) { CameraCharacteristics chars = mCameraManager.getCameraCharacteristics(cameraId); - mCharacteristicsHashMap.put(cameraId, chars); Object thisClass = CameraCharacteristics.Key.class; Class> keyClass = (Class>)thisClass; @@ -554,6 +552,15 @@ public class CameraExtensionsProxyService extends Service { return ret; } + private static Map getCharacteristicsMap( + Map charsMap) { + HashMap ret = new HashMap<>(); + for (Map.Entry entry : charsMap.entrySet()) { + ret.put(entry.getKey(), new CameraCharacteristics(entry.getValue())); + } + return ret; + } + private static List initializeParcelable( Map> sizes) { if (sizes == null) { @@ -734,13 +741,15 @@ public class CameraExtensionsProxyService extends Service { } @Override - public boolean isExtensionAvailable(String cameraId) { - return mAdvancedExtender.isExtensionAvailable(cameraId, mCharacteristicsHashMap); + public boolean isExtensionAvailable(String cameraId, + Map charsMapNative) { + return mAdvancedExtender.isExtensionAvailable(cameraId, + getCharacteristicsMap(charsMapNative)); } @Override - public void init(String cameraId) { - mAdvancedExtender.init(cameraId, mCharacteristicsHashMap); + public void init(String cameraId, Map charsMapNative) { + mAdvancedExtender.init(cameraId, getCharacteristicsMap(charsMapNative)); } @Override @@ -1192,7 +1201,8 @@ public class CameraExtensionsProxyService extends Service { } @Override - public CameraSessionConfig initSession(String cameraId, OutputSurface previewSurface, + public CameraSessionConfig initSession(String cameraId, + Map charsMapNative, OutputSurface previewSurface, OutputSurface imageCaptureSurface, OutputSurface postviewSurface) { OutputSurfaceImplStub outputPreviewSurfaceImpl = new OutputSurfaceImplStub(previewSurface); @@ -1211,10 +1221,12 @@ public class CameraExtensionsProxyService extends Service { outputPostviewSurfaceImpl); sessionConfig = mSessionProcessor.initSession(cameraId, - mCharacteristicsHashMap, getApplicationContext(), outputSurfaceConfigs); + getCharacteristicsMap(charsMapNative), + getApplicationContext(), outputSurfaceConfigs); } else { sessionConfig = mSessionProcessor.initSession(cameraId, - mCharacteristicsHashMap, getApplicationContext(), outputPreviewSurfaceImpl, + getCharacteristicsMap(charsMapNative), + getApplicationContext(), outputPreviewSurfaceImpl, outputImageCaptureSurfaceImpl, null /*imageAnalysisSurfaceConfig*/); }