camera2 vndk: Add ACameraMananger_getTagFromName.

In some situations, clients of the vndk might need to be able to query
tags at runtime, based on tag names. For example, when client hals are
de-coupled from the camera HAL.

Bug: 131093919

Test: AImageReaderVendorTest
Test: Modify AImageReaderVendorTest to retrieve vendor tags given their
      names, using ACameraMetadata_getTagFromName

Change-Id: I1cdec5b154037185e99d29be2c6890e4fdc4a32a
Signed-off-by: Jayant Chowdhary <jchowdhary@google.com>
gugelfrei
Jayant Chowdhary 5 years ago
parent 48601f013a
commit b16194d50f

@ -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,

@ -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

@ -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

@ -22,6 +22,8 @@
#include "ACameraMetadata.h"
#include "ndk_vendor/impl/ACameraDevice.h"
#include "utils.h"
#include <CameraMetadata.h>
#include <camera_metadata_hidden.h>
#include <utils/Vector.h>
#include <cutils/properties.h>
@ -587,6 +589,26 @@ ACameraManager::openCamera(
return ACAMERA_OK;
}
camera_status_t
ACameraManager::getTagFromName(const char *cameraId, const char *name, uint32_t *tag) {
sp<ACameraMetadata> 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<VendorTagDescriptorCache> vtCache = VendorTagDescriptorCache::getGlobalVendorTagCache();
sp<VendorTagDescriptor> 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() {
}

@ -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 {

@ -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) {

Loading…
Cancel
Save