/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef ANDROID_SERVERS_CAMERA_CAMERAPROVIDERINFO_TEMPLATEDH #define ANDROID_SERVERS_CAMERA_CAMERAPROVIDERINFO_TEMPLATEDH #include "common/CameraProviderManager.h" namespace android { template status_t IdlVendorTagDescriptor::createDescriptorFromIdl( const VendorTagSectionVectorType& vts, sp& descriptor) { int tagCount = 0; for (size_t s = 0; s < vts.size(); s++) { tagCount += vts[s].tags.size(); } if (tagCount < 0 || tagCount > INT32_MAX) { ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount); return BAD_VALUE; } Vector tagArray; LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount, "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount); sp desc = new IdlVendorTagDescriptor(); desc->mTagCount = tagCount; SortedVector sections; KeyedVector tagToSectionMap; int idx = 0; for (size_t s = 0; s < vts.size(); s++) { const VendorTagSectionType& section = vts[s]; const char *sectionName = section.sectionName.c_str(); if (sectionName == NULL) { ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s); return BAD_VALUE; } String8 sectionString(sectionName); sections.add(sectionString); for (size_t j = 0; j < section.tags.size(); j++) { uint32_t tag = section.tags[j].tagId; if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); return BAD_VALUE; } tagArray.editItemAt(idx++) = section.tags[j].tagId; const char *tagName = section.tags[j].tagName.c_str(); if (tagName == NULL) { ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag); return BAD_VALUE; } desc->mTagToNameMap.add(tag, String8(tagName)); tagToSectionMap.add(tag, sectionString); int tagType = (int) section.tags[j].tagType; if (tagType < 0 || tagType >= NUM_TYPES) { ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); return BAD_VALUE; } desc->mTagToTypeMap.add(tag, tagType); } } desc->mSections = sections; for (size_t i = 0; i < tagArray.size(); ++i) { uint32_t tag = tagArray[i]; String8 sectionString = tagToSectionMap.valueFor(tag); // Set up tag to section index map ssize_t index = sections.indexOf(sectionString); LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index); desc->mTagToSectionMap.add(tag, static_cast(index)); // Set up reverse mapping ssize_t reverseIndex = -1; if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) { KeyedVector* nameMapper = new KeyedVector(); reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper); } desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag); } descriptor = std::move(desc); return OK; } } // namespace android #endif