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 693b5e085d8a4..bf4a20dfcae0f 100644 --- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java @@ -2517,14 +2517,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*/); }