diff options
| author | 2021-07-08 20:20:19 +0000 | |
|---|---|---|
| committer | 2021-07-08 20:20:19 +0000 | |
| commit | 2d5d1676ffc209481a6e467372aa24f7ceea02c4 (patch) | |
| tree | 06a868172c08f29a13460e72db312e22e4c161d2 | |
| parent | 14fe934578135a1b9a5f42e3ade65b15f7155839 (diff) | |
| parent | 07d8600a359699d71fcc6d630ba606aa462a56d7 (diff) | |
Merge "Camera: Set metadata vendor id in extension proxy service" into sc-dev
3 files changed, 94 insertions, 27 deletions
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java index e23bf78d6e76..09fe1020ea59 100644 --- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java +++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java @@ -1884,6 +1884,8 @@ public class CameraMetadataNative implements Parcelable { private static native int nativeGetEntryCount(long ptr); @FastNative private static native long nativeGetBufferSize(long ptr); + @FastNative + private static native void nativeSetVendorId(long ptr, long vendorId); @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @FastNative @@ -1929,6 +1931,15 @@ public class CameraMetadataNative implements Parcelable { } /** + * Set the native metadata vendor id. + * + * @hide + */ + public void setVendorId(long vendorId) { + nativeSetVendorId(mMetadataPtr, vendorId); + } + + /** * @hide */ public int getEntryCount() { diff --git a/core/jni/android_hardware_camera2_CameraMetadata.cpp b/core/jni/android_hardware_camera2_CameraMetadata.cpp index 5c9999dc0c85..5293c583cfd0 100644 --- a/core/jni/android_hardware_camera2_CameraMetadata.cpp +++ b/core/jni/android_hardware_camera2_CameraMetadata.cpp @@ -16,6 +16,7 @@ */ // #define LOG_NDEBUG 0 +#include <memory> #define LOG_TAG "CameraMetadata-JNI" #include <utils/Errors.h> #include <utils/Log.h> @@ -162,6 +163,8 @@ struct Helpers { extern "C" { +static void CameraMetadata_setVendorId(JNIEnv* env, jclass thiz, jlong ptr, + jlong vendorId); static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong ptr, jclass keyType); static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, @@ -596,6 +599,9 @@ static void CameraMetadata_writeToParcel(JNIEnv *env, jclass thiz, jobject parce static const JNINativeMethod gCameraMetadataMethods[] = { // static methods + { "nativeSetVendorId", + "(JJ)V", + (void *)CameraMetadata_setVendorId }, { "nativeGetTagFromKey", "(Ljava/lang/String;J)I", (void *)CameraMetadata_getTagFromKey }, @@ -870,6 +876,27 @@ static jobject CameraMetadata_getAllVendorKeys(JNIEnv* env, jclass thiz, jlong p return arrayList; } +static void CameraMetadata_setVendorId(JNIEnv *env, jclass thiz, jlong ptr, + jlong vendorId) { + ALOGV("%s", __FUNCTION__); + + CameraMetadata* metadata = CameraMetadata_getPointerThrow(env, ptr); + + if (metadata == NULL) { + ALOGW("%s: Returning early due to exception being thrown", + __FUNCTION__); + return; + } + if (metadata->isEmpty()) { + std::unique_ptr<CameraMetadata> emptyBuffer = std::make_unique<CameraMetadata>(10); + metadata->swap(*emptyBuffer); + } + + camera_metadata_t *meta = const_cast<camera_metadata_t *>(metadata->getAndLock()); + set_camera_metadata_vendor_id(meta, vendorId); + metadata->unlock(meta); +} + static jint CameraMetadata_getTagFromKey(JNIEnv *env, jclass thiz, jstring keyName, jlong vendorId) { ScopedUtfChars keyScoped(env, keyName); diff --git a/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java b/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java index ab3643c2a911..561d079cb984 100644 --- a/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java +++ b/packages/services/CameraExtensionsProxy/src/com/android/cameraextensions/CameraExtensionsProxyService.java @@ -134,6 +134,7 @@ public class CameraExtensionsProxyService extends Service { (!EXTENSIONS_VERSION.startsWith(NON_INIT_VERSION_PREFIX)); private HashMap<String, CameraCharacteristics> mCharacteristicsHashMap = new HashMap<>(); + private HashMap<String, Long> mMetadataVendorIdMap = new HashMap<>(); private static boolean checkForAdvancedAPI() { if (EXTENSIONS_PRESENT && EXTENSIONS_VERSION.startsWith(ADVANCED_VERSION_PREFIX)) { @@ -464,8 +465,16 @@ public class CameraExtensionsProxyService extends Service { String [] cameraIds = manager.getCameraIdListNoLazy(); if (cameraIds != null) { for (String cameraId : cameraIds) { - mCharacteristicsHashMap.put(cameraId, - manager.getCameraCharacteristics(cameraId)); + CameraCharacteristics chars = manager.getCameraCharacteristics(cameraId); + mCharacteristicsHashMap.put(cameraId, chars); + Object thisClass = CameraCharacteristics.Key.class; + Class<CameraCharacteristics.Key<?>> keyClass = + (Class<CameraCharacteristics.Key<?>>)thisClass; + ArrayList<CameraCharacteristics.Key<?>> vendorKeys = + chars.getNativeMetadata().getAllVendorKeys(keyClass); + if ((vendorKeys != null) && !vendorKeys.isEmpty()) { + mMetadataVendorIdMap.put(cameraId, vendorKeys.get(0).getVendorId()); + } } } } catch (CameraAccessException e) { @@ -529,13 +538,16 @@ public class CameraExtensionsProxyService extends Service { return ret; } - private static CameraMetadataNative initializeParcelableMetadata( - List<Pair<CaptureRequest.Key, Object>> paramList) { + private CameraMetadataNative initializeParcelableMetadata( + List<Pair<CaptureRequest.Key, Object>> paramList, String cameraId) { if (paramList == null) { return null; } CameraMetadataNative ret = new CameraMetadataNative(); + if (mMetadataVendorIdMap.containsKey(cameraId)) { + ret.setVendorId(mMetadataVendorIdMap.get(cameraId)); + } for (Pair<CaptureRequest.Key, Object> param : paramList) { ret.set(param.first, param.second); } @@ -543,13 +555,16 @@ public class CameraExtensionsProxyService extends Service { return ret; } - private static CameraMetadataNative initializeParcelableMetadata( - Map<CaptureRequest.Key<?>, Object> paramMap) { + private CameraMetadataNative initializeParcelableMetadata( + Map<CaptureRequest.Key<?>, Object> paramMap, String cameraId) { if (paramMap == null) { return null; } CameraMetadataNative ret = new CameraMetadataNative(); + if (mMetadataVendorIdMap.containsKey(cameraId)) { + ret.setVendorId(mMetadataVendorIdMap.get(cameraId)); + } for (Map.Entry<CaptureRequest.Key<?>, Object> param : paramMap.entrySet()) { ret.set(((CaptureRequest.Key) param.getKey()), param.getValue()); } @@ -557,8 +572,8 @@ public class CameraExtensionsProxyService extends Service { return ret; } - private static android.hardware.camera2.extension.CaptureStageImpl initializeParcelable( - androidx.camera.extensions.impl.CaptureStageImpl captureStage) { + private android.hardware.camera2.extension.CaptureStageImpl initializeParcelable( + androidx.camera.extensions.impl.CaptureStageImpl captureStage, String cameraId) { if (captureStage == null) { return null; } @@ -566,12 +581,13 @@ public class CameraExtensionsProxyService extends Service { android.hardware.camera2.extension.CaptureStageImpl ret = new android.hardware.camera2.extension.CaptureStageImpl(); ret.id = captureStage.getId(); - ret.parameters = initializeParcelableMetadata(captureStage.getParameters()); + ret.parameters = initializeParcelableMetadata(captureStage.getParameters(), cameraId); return ret; } - private Request initializeParcelable(RequestProcessorImpl.Request request, int requestId) { + private Request initializeParcelable(RequestProcessorImpl.Request request, int requestId, + String cameraId) { Request ret = new Request(); ret.targetOutputConfigIds = new ArrayList<>(); for (int id : request.getTargetOutputConfigIds()) { @@ -580,7 +596,7 @@ public class CameraExtensionsProxyService extends Service { ret.targetOutputConfigIds.add(configId); } ret.templateId = request.getTemplateId(); - ret.parameters = initializeParcelableMetadata(request.getParameters()); + ret.parameters = initializeParcelableMetadata(request.getParameters(), cameraId); ret.requestId = requestId; return ret; } @@ -933,9 +949,11 @@ public class CameraExtensionsProxyService extends Service { private class RequestProcessorStub implements RequestProcessorImpl { private final IRequestProcessorImpl mRequestProcessor; + private final String mCameraId; - public RequestProcessorStub(IRequestProcessorImpl requestProcessor) { + public RequestProcessorStub(IRequestProcessorImpl requestProcessor, String cameraId) { mRequestProcessor = requestProcessor; + mCameraId = cameraId; } @Override @@ -964,7 +982,7 @@ public class CameraExtensionsProxyService extends Service { new ArrayList<>(); int requestId = 0; for (Request request : requests) { - captureRequests.add(initializeParcelable(request, requestId)); + captureRequests.add(initializeParcelable(request, requestId, mCameraId)); requestId++; } @@ -982,7 +1000,8 @@ public class CameraExtensionsProxyService extends Service { try { ArrayList<Request> requests = new ArrayList<>(); requests.add(request); - return mRequestProcessor.setRepeating(initializeParcelable(request, 0), + return mRequestProcessor.setRepeating( + initializeParcelable(request, 0, mCameraId), new RequestCallbackStub(requests, callback)); } catch (RemoteException e) { Log.e(TAG, "Failed to submit repeating request due to remote exception!"); @@ -1012,6 +1031,7 @@ public class CameraExtensionsProxyService extends Service { private class SessionProcessorImplStub extends ISessionProcessorImpl.Stub { private final SessionProcessorImpl mSessionProcessor; + private String mCameraId = null; public SessionProcessorImplStub(SessionProcessorImpl sessionProcessor) { mSessionProcessor = sessionProcessor; @@ -1074,7 +1094,8 @@ public class CameraExtensionsProxyService extends Service { } ret.sessionTemplateId = sessionConfig.getSessionTemplateId(); ret.sessionParameter = initializeParcelableMetadata( - sessionConfig.getSessionParameters()); + sessionConfig.getSessionParameters(), cameraId); + mCameraId = cameraId; return ret; } @@ -1086,7 +1107,8 @@ public class CameraExtensionsProxyService extends Service { @Override public void onCaptureSessionStart(IRequestProcessorImpl requestProcessor) { - mSessionProcessor.onCaptureSessionStart(new RequestProcessorStub(requestProcessor)); + mSessionProcessor.onCaptureSessionStart( + new RequestProcessorStub(requestProcessor, mCameraId)); } @Override @@ -1143,6 +1165,7 @@ public class CameraExtensionsProxyService extends Service { private class PreviewExtenderImplStub extends IPreviewExtenderImpl.Stub { private final PreviewExtenderImpl mPreviewExtender; + private String mCameraId = null; public PreviewExtenderImplStub(PreviewExtenderImpl previewExtender) { mPreviewExtender = previewExtender; @@ -1150,6 +1173,7 @@ public class CameraExtensionsProxyService extends Service { @Override public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) { + mCameraId = cameraId; mPreviewExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics), CameraExtensionsProxyService.this); } @@ -1161,17 +1185,17 @@ public class CameraExtensionsProxyService extends Service { @Override public CaptureStageImpl onPresetSession() { - return initializeParcelable(mPreviewExtender.onPresetSession()); + return initializeParcelable(mPreviewExtender.onPresetSession(), mCameraId); } @Override public CaptureStageImpl onEnableSession() { - return initializeParcelable(mPreviewExtender.onEnableSession()); + return initializeParcelable(mPreviewExtender.onEnableSession(), mCameraId); } @Override public CaptureStageImpl onDisableSession() { - return initializeParcelable(mPreviewExtender.onDisableSession()); + return initializeParcelable(mPreviewExtender.onDisableSession(), mCameraId); } @Override @@ -1187,7 +1211,7 @@ public class CameraExtensionsProxyService extends Service { @Override public CaptureStageImpl getCaptureStage() { - return initializeParcelable(mPreviewExtender.getCaptureStage()); + return initializeParcelable(mPreviewExtender.getCaptureStage(), mCameraId); } @Override @@ -1230,7 +1254,7 @@ public class CameraExtensionsProxyService extends Service { } if (processor != null) { - return new RequestUpdateProcessorImplStub(processor); + return new RequestUpdateProcessorImplStub(processor, mCameraId); } return null; @@ -1251,6 +1275,7 @@ public class CameraExtensionsProxyService extends Service { private class ImageCaptureExtenderImplStub extends IImageCaptureExtenderImpl.Stub { private final ImageCaptureExtenderImpl mImageExtender; + private String mCameraId = null; public ImageCaptureExtenderImplStub(ImageCaptureExtenderImpl imageExtender) { mImageExtender = imageExtender; @@ -1260,6 +1285,7 @@ public class CameraExtensionsProxyService extends Service { public void onInit(String cameraId, CameraMetadataNative cameraCharacteristics) { mImageExtender.onInit(cameraId, new CameraCharacteristics(cameraCharacteristics), CameraExtensionsProxyService.this); + mCameraId = cameraId; } @Override @@ -1269,17 +1295,17 @@ public class CameraExtensionsProxyService extends Service { @Override public CaptureStageImpl onPresetSession() { - return initializeParcelable(mImageExtender.onPresetSession()); + return initializeParcelable(mImageExtender.onPresetSession(), mCameraId); } @Override public CaptureStageImpl onEnableSession() { - return initializeParcelable(mImageExtender.onEnableSession()); + return initializeParcelable(mImageExtender.onEnableSession(), mCameraId); } @Override public CaptureStageImpl onDisableSession() { - return initializeParcelable(mImageExtender.onDisableSession()); + return initializeParcelable(mImageExtender.onDisableSession(), mCameraId); } @Override @@ -1312,7 +1338,7 @@ public class CameraExtensionsProxyService extends Service { ArrayList<android.hardware.camera2.extension.CaptureStageImpl> ret = new ArrayList<>(); for (androidx.camera.extensions.impl.CaptureStageImpl stage : captureStages) { - ret.add(initializeParcelable(stage)); + ret.add(initializeParcelable(stage, mCameraId)); } return ret; @@ -1428,9 +1454,12 @@ public class CameraExtensionsProxyService extends Service { private class RequestUpdateProcessorImplStub extends IRequestUpdateProcessorImpl.Stub { private final RequestUpdateProcessorImpl mProcessor; + private final String mCameraId; - public RequestUpdateProcessorImplStub(RequestUpdateProcessorImpl processor) { + public RequestUpdateProcessorImplStub(RequestUpdateProcessorImpl processor, + String cameraId) { mProcessor = processor; + mCameraId = cameraId; } @Override @@ -1451,7 +1480,7 @@ public class CameraExtensionsProxyService extends Service { @Override public CaptureStageImpl process(CameraMetadataNative result, int sequenceId) { return initializeParcelable( - mProcessor.process(new TotalCaptureResult(result, sequenceId))); + mProcessor.process(new TotalCaptureResult(result, sequenceId)), mCameraId); } } |