diff --git a/camera/common/1.0/default/VendorTagDescriptor.cpp b/camera/common/1.0/default/VendorTagDescriptor.cpp index 052bf5be60..d2bee85daf 100644 --- a/camera/common/1.0/default/VendorTagDescriptor.cpp +++ b/camera/common/1.0/default/VendorTagDescriptor.cpp @@ -176,6 +176,93 @@ void VendorTagDescriptor::dump(int fd, int verbosity, int indentation) const { } +int VendorTagDescriptorCache::getTagCount(metadata_vendor_id_t id) const { + int ret = 0; + auto desc = mVendorMap.find(id); + if (desc != mVendorMap.end()) { + ret = desc->second->getTagCount(); + } else { + ALOGE("%s: Vendor descriptor id is missing!", __func__); + } + + return ret; +} + +void VendorTagDescriptorCache::getTagArray(uint32_t* tagArray, metadata_vendor_id_t id) const { + auto desc = mVendorMap.find(id); + if (desc != mVendorMap.end()) { + desc->second->getTagArray(tagArray); + } else { + ALOGE("%s: Vendor descriptor id is missing!", __func__); + } +} + +const char* VendorTagDescriptorCache::getSectionName(uint32_t tag, metadata_vendor_id_t id) const { + const char* ret = nullptr; + auto desc = mVendorMap.find(id); + if (desc != mVendorMap.end()) { + ret = desc->second->getSectionName(tag); + } else { + ALOGE("%s: Vendor descriptor id is missing!", __func__); + } + + return ret; +} + +const char* VendorTagDescriptorCache::getTagName(uint32_t tag, metadata_vendor_id_t id) const { + const char* ret = nullptr; + auto desc = mVendorMap.find(id); + if (desc != mVendorMap.end()) { + ret = desc->second->getTagName(tag); + } else { + ALOGE("%s: Vendor descriptor id is missing!", __func__); + } + + return ret; +} + +int VendorTagDescriptorCache::getTagType(uint32_t tag, metadata_vendor_id_t id) const { + int ret = 0; + auto desc = mVendorMap.find(id); + if (desc != mVendorMap.end()) { + ret = desc->second->getTagType(tag); + } else { + ALOGE("%s: Vendor descriptor id is missing!", __func__); + } + + return ret; +} + +void VendorTagDescriptorCache::dump(int fd, int verbosity, int indentation) const { + for (const auto& desc : mVendorMap) { + desc.second->dump(fd, verbosity, indentation); + } +} + +int32_t VendorTagDescriptorCache::addVendorDescriptor( + metadata_vendor_id_t id, sp desc) { + auto entry = mVendorMap.find(id); + if (entry != mVendorMap.end()) { + ALOGE("%s: Vendor descriptor with same id already present!", __func__); + return BAD_VALUE; + } + + mVendorMap.emplace(id, desc); + return NO_ERROR; +} + +int32_t VendorTagDescriptorCache::getVendorTagDescriptor( + metadata_vendor_id_t id, + sp* desc /*out*/) { + auto entry = mVendorMap.find(id); + if (entry == mVendorMap.end()) { + return NAME_NOT_FOUND; + } + + *desc = entry->second; + + return NO_ERROR; +} } // namespace params } // namespace camera2 @@ -192,10 +279,17 @@ static const char* vendor_tag_descriptor_get_section_name(const vendor_tag_ops_t static const char* vendor_tag_descriptor_get_tag_name(const vendor_tag_ops_t* v, uint32_t tag); static int vendor_tag_descriptor_get_tag_type(const vendor_tag_ops_t* v, uint32_t tag); +static int vendor_tag_descriptor_cache_get_tag_count(metadata_vendor_id_t id); +static void vendor_tag_descriptor_cache_get_all_tags(uint32_t* tagArray, metadata_vendor_id_t id); +static const char* vendor_tag_descriptor_cache_get_section_name(uint32_t tag, + metadata_vendor_id_t id); +static const char* vendor_tag_descriptor_cache_get_tag_name(uint32_t tag, metadata_vendor_id_t id); +static int vendor_tag_descriptor_cache_get_tag_type(uint32_t tag, metadata_vendor_id_t id); } /* extern "C" */ static Mutex sLock; static sp sGlobalVendorTagDescriptor; +static sp sGlobalVendorTagDescriptorCache; status_t VendorTagDescriptor::createDescriptorFromOps(const vendor_tag_ops_t* vOps, /*out*/ @@ -310,6 +404,39 @@ sp VendorTagDescriptor::getGlobalVendorTagDescriptor() { return sGlobalVendorTagDescriptor; } +status_t VendorTagDescriptorCache::setAsGlobalVendorTagCache( + const sp& cache) { + status_t res = OK; + Mutex::Autolock al(sLock); + sGlobalVendorTagDescriptorCache = cache; + + struct vendor_tag_cache_ops* opsPtr = NULL; + if (cache != NULL) { + opsPtr = &(cache->mVendorCacheOps); + opsPtr->get_tag_count = vendor_tag_descriptor_cache_get_tag_count; + opsPtr->get_all_tags = vendor_tag_descriptor_cache_get_all_tags; + opsPtr->get_section_name = vendor_tag_descriptor_cache_get_section_name; + opsPtr->get_tag_name = vendor_tag_descriptor_cache_get_tag_name; + opsPtr->get_tag_type = vendor_tag_descriptor_cache_get_tag_type; + } + if ((res = set_camera_metadata_vendor_cache_ops(opsPtr)) != OK) { + ALOGE("%s: Could not set vendor tag cache, received error %s (%d).", __FUNCTION__, + strerror(-res), res); + } + return res; +} + +void VendorTagDescriptorCache::clearGlobalVendorTagCache() { + Mutex::Autolock al(sLock); + set_camera_metadata_vendor_cache_ops(NULL); + sGlobalVendorTagDescriptorCache.clear(); +} + +sp VendorTagDescriptorCache::getGlobalVendorTagCache() { + Mutex::Autolock al(sLock); + return sGlobalVendorTagDescriptorCache; +} + extern "C" { int vendor_tag_descriptor_get_tag_count(const vendor_tag_ops_t* /*v*/) { @@ -357,6 +484,50 @@ int vendor_tag_descriptor_get_tag_type(const vendor_tag_ops_t* /*v*/, uint32_t t return sGlobalVendorTagDescriptor->getTagType(tag); } +int vendor_tag_descriptor_cache_get_tag_count(metadata_vendor_id_t id) { + Mutex::Autolock al(sLock); + if (sGlobalVendorTagDescriptorCache == NULL) { + ALOGE("%s: Vendor tag descriptor cache not initialized.", __FUNCTION__); + return VENDOR_TAG_COUNT_ERR; + } + return sGlobalVendorTagDescriptorCache->getTagCount(id); +} + +void vendor_tag_descriptor_cache_get_all_tags(uint32_t* tagArray, metadata_vendor_id_t id) { + Mutex::Autolock al(sLock); + if (sGlobalVendorTagDescriptorCache == NULL) { + ALOGE("%s: Vendor tag descriptor cache not initialized.", __FUNCTION__); + } + sGlobalVendorTagDescriptorCache->getTagArray(tagArray, id); +} + +const char* vendor_tag_descriptor_cache_get_section_name(uint32_t tag, metadata_vendor_id_t id) { + Mutex::Autolock al(sLock); + if (sGlobalVendorTagDescriptorCache == NULL) { + ALOGE("%s: Vendor tag descriptor cache not initialized.", __FUNCTION__); + return VENDOR_SECTION_NAME_ERR; + } + return sGlobalVendorTagDescriptorCache->getSectionName(tag, id); +} + +const char* vendor_tag_descriptor_cache_get_tag_name(uint32_t tag, metadata_vendor_id_t id) { + Mutex::Autolock al(sLock); + if (sGlobalVendorTagDescriptorCache == NULL) { + ALOGE("%s: Vendor tag descriptor cache not initialized.", __FUNCTION__); + return VENDOR_TAG_NAME_ERR; + } + return sGlobalVendorTagDescriptorCache->getTagName(tag, id); +} + +int vendor_tag_descriptor_cache_get_tag_type(uint32_t tag, metadata_vendor_id_t id) { + Mutex::Autolock al(sLock); + if (sGlobalVendorTagDescriptorCache == NULL) { + ALOGE("%s: Vendor tag descriptor cache not initialized.", __FUNCTION__); + return VENDOR_TAG_NAME_ERR; + } + return sGlobalVendorTagDescriptorCache->getTagType(tag, id); +} + } /* extern "C" */ } // namespace helper diff --git a/camera/common/1.0/default/include/VendorTagDescriptor.h b/camera/common/1.0/default/include/VendorTagDescriptor.h index a040540edb..0f54db52d1 100644 --- a/camera/common/1.0/default/include/VendorTagDescriptor.h +++ b/camera/common/1.0/default/include/VendorTagDescriptor.h @@ -157,6 +157,81 @@ class VendorTagDescriptor : }; +} /* namespace helper */ +} /* namespace V1_0 */ +} /* namespace common */ +} /* namespace camera */ + +namespace camera2 { +namespace params { + +class VendorTagDescriptorCache { + public: + typedef android::hardware::camera::common::V1_0::helper::VendorTagDescriptor + VendorTagDescriptor; + VendorTagDescriptorCache(){}; + int32_t addVendorDescriptor(metadata_vendor_id_t id, sp desc); + + int32_t getVendorTagDescriptor(metadata_vendor_id_t id, sp* desc /*out*/); + + // Returns the number of vendor tags defined. + int getTagCount(metadata_vendor_id_t id) const; + + // Returns an array containing the id's of vendor tags defined. + void getTagArray(uint32_t* tagArray, metadata_vendor_id_t id) const; + + // Returns the section name string for a given vendor tag id. + const char* getSectionName(uint32_t tag, metadata_vendor_id_t id) const; + + // Returns the tag name string for a given vendor tag id. + const char* getTagName(uint32_t tag, metadata_vendor_id_t id) const; + + // Returns the tag type for a given vendor tag id. + int getTagType(uint32_t tag, metadata_vendor_id_t id) const; + + /** + * Dump the currently configured vendor tags to a file descriptor. + */ + void dump(int fd, int verbosity, int indentation) const; + + protected: + std::unordered_map> mVendorMap; + struct vendor_tag_cache_ops mVendorCacheOps; +}; + +} /* namespace params */ +} /* namespace camera2 */ + +namespace camera { +namespace common { +namespace V1_0 { +namespace helper { + +class VendorTagDescriptorCache + : public ::android::hardware::camera2::params::VendorTagDescriptorCache, + public LightRefBase { + public: + /** + * Sets the global vendor tag descriptor cache to use for this process. + * Camera metadata operations that access vendor tags will use the + * vendor tag definitions set this way. + * + * Returns OK on success, or a negative error code. + */ + static status_t setAsGlobalVendorTagCache(const sp& cache); + + /** + * Returns the global vendor tag cache used by this process. + * This will contain NULL if no vendor tags are defined. + */ + static sp getGlobalVendorTagCache(); + + /** + * Clears the global vendor tag cache used by this process. + */ + static void clearGlobalVendorTagCache(); +}; + } // namespace helper } // namespace V1_0 } // namespace common