diff --git a/camera/ndk/Android.bp b/camera/ndk/Android.bp index d96f4039e9..77868567c9 100644 --- a/camera/ndk/Android.bp +++ b/camera/ndk/Android.bp @@ -64,6 +64,10 @@ cc_library_shared { "-Wextra", "-Werror", ], + // TODO: jchowdhary@, use header_libs instead b/131165718 + include_dirs: [ + "system/media/private/camera/include", + ], export_include_dirs: ["include"], export_shared_lib_headers: [ "libnativewindow", @@ -123,6 +127,10 @@ cc_library_shared { "android.hardware.camera.common@1.0-helper", "libarect", ], + // TODO: jchowdhary@, use header_libs instead b/131165718 + include_dirs: [ + "system/media/private/camera/include", + ], product_variables: { pdk: { enabled: false, diff --git a/camera/ndk/NdkCameraManager.cpp b/camera/ndk/NdkCameraManager.cpp index 23d01efcac..3d231a8107 100644 --- a/camera/ndk/NdkCameraManager.cpp +++ b/camera/ndk/NdkCameraManager.cpp @@ -190,3 +190,17 @@ camera_status_t ACameraManager_openCamera( } return mgr->openCamera(cameraId, callback, device); } + +#ifdef __ANDROID_VNDK__ +EXPORT +camera_status_t ACameraManager_getTagFromName(ACameraManager *mgr, const char* cameraId, + const char *name, /*out*/uint32_t *tag) { + ATRACE_CALL(); + if (mgr == nullptr || cameraId == nullptr || name == nullptr) { + ALOGE("%s: invalid argument! mgr %p cameraId %p name %p", + __FUNCTION__, mgr, cameraId, name); + return ACAMERA_ERROR_INVALID_PARAMETER; + } + return mgr->getTagFromName(cameraId, name, tag); +} +#endif diff --git a/camera/ndk/include/camera/NdkCameraManager.h b/camera/ndk/include/camera/NdkCameraManager.h index 5c810bbc5d..2cc8a9743b 100644 --- a/camera/ndk/include/camera/NdkCameraManager.h +++ b/camera/ndk/include/camera/NdkCameraManager.h @@ -374,6 +374,23 @@ camera_status_t ACameraManager_unregisterExtendedAvailabilityCallback( ACameraManager* manager, const ACameraManager_ExtendedAvailabilityCallbacks* callback) __INTRODUCED_IN(29); +#ifdef __ANDROID_VNDK__ +/** + * Retrieve the tag value, given the tag name and camera id. + * This method is device specific since some metadata might be defined by device manufacturers + * and might only be accessible for specific cameras. + * @param manager The {@link ACameraManager} of interest. + * @param cameraId The cameraId, which is used to query camera characteristics. + * @param name The name of the tag being queried. + * @param tag The output tag assigned by this method. + * + * @return ACAMERA_OK only if the function call was successful. + */ +camera_status_t ACameraManager_getTagFromName(ACameraManager *manager, const char* cameraId, + const char *name, /*out*/uint32_t *tag) + __INTRODUCED_IN(29); +#endif + #endif /* __ANDROID_API__ >= 29 */ __END_DECLS diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.cpp b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp index 575ee9dd6f..70c887acea 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraManager.cpp +++ b/camera/ndk/ndk_vendor/impl/ACameraManager.cpp @@ -22,6 +22,8 @@ #include "ACameraMetadata.h" #include "ndk_vendor/impl/ACameraDevice.h" #include "utils.h" +#include +#include #include #include @@ -587,6 +589,26 @@ ACameraManager::openCamera( return ACAMERA_OK; } +camera_status_t +ACameraManager::getTagFromName(const char *cameraId, const char *name, uint32_t *tag) { + sp rawChars; + camera_status_t ret = getCameraCharacteristics(cameraId, &rawChars); + if (ret != ACAMERA_OK) { + ALOGE("%s, Cannot retrieve camera characteristics for camera id %s", __FUNCTION__, + cameraId); + return ACAMERA_ERROR_METADATA_NOT_FOUND; + } + const CameraMetadata& metadata = rawChars->getInternalData(); + const camera_metadata_t *rawMetadata = metadata.getAndLock(); + metadata_vendor_id_t vendorTagId = get_camera_metadata_vendor_id(rawMetadata); + metadata.unlock(rawMetadata); + sp vtCache = VendorTagDescriptorCache::getGlobalVendorTagCache(); + sp vTags = nullptr; + vtCache->getVendorTagDescriptor(vendorTagId, &vTags); + status_t status= metadata.getTagFromName(name, vTags.get(), tag); + return status == OK ? ACAMERA_OK : ACAMERA_ERROR_METADATA_NOT_FOUND; +} + ACameraManager::~ACameraManager() { } diff --git a/camera/ndk/ndk_vendor/impl/ACameraManager.h b/camera/ndk/ndk_vendor/impl/ACameraManager.h index df6935336f..2c62d44b0f 100644 --- a/camera/ndk/ndk_vendor/impl/ACameraManager.h +++ b/camera/ndk/ndk_vendor/impl/ACameraManager.h @@ -204,6 +204,7 @@ struct ACameraManager { camera_status_t openCamera(const char* cameraId, ACameraDevice_StateCallbacks* callback, /*out*/ACameraDevice** device); + camera_status_t getTagFromName(const char *cameraId, const char *name, uint32_t *tag); private: enum { diff --git a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp index 7368775711..37de30ab01 100644 --- a/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp +++ b/camera/ndk/ndk_vendor/tests/AImageReaderVendorTest.cpp @@ -799,6 +799,15 @@ TEST_F(AImageReaderVendorTest, CreateWindowNativeHandle) { bool isBC = isCapabilitySupported(staticMetadata, ACAMERA_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE); + uint32_t namedTag = 0; + // Test that ACameraMetadata_getTagFromName works as expected for public tag + // names + camera_status_t status = ACameraManager_getTagFromName(mCameraManager, cameraId, + "android.control.aeMode", &namedTag); + + ASSERT_EQ(status, ACAMERA_OK); + ASSERT_EQ(namedTag, ACAMERA_CONTROL_AE_MODE); + ACameraMetadata_free(staticMetadata); if (!isBC) {