VendorTagDescriptor.cpp revision f51fca277eb5b86bd0b2e3fc90ecb2b63089de29
1d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk/* 2d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Copyright (C) 2014 The Android Open Source Project 3d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * 4d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 5d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * you may not use this file except in compliance with the License. 6d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * You may obtain a copy of the License at 7d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * 8d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * http://www.apache.org/licenses/LICENSE-2.0 9d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * 10d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * Unless required by applicable law or agreed to in writing, software 11d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 12d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * See the License for the specific language governing permissions and 14d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk * limitations under the License. 15d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk */ 16d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 17f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk#define LOG_TAG "VendorTagDescriptor" 18d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 19d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <binder/Parcel.h> 20d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <utils/Errors.h> 21d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <utils/Log.h> 22d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <utils/Mutex.h> 23d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <utils/Vector.h> 24f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk#include <utils/SortedVector.h> 25d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <system/camera_metadata.h> 26d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <camera_metadata_hidden.h> 27d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 28d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include "camera/VendorTagDescriptor.h" 29d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 30f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk#include <stdio.h> 31d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk#include <string.h> 32d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 33d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunknamespace android { 34d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 35d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkextern "C" { 36d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 37d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkstatic int vendor_tag_descriptor_get_tag_count(const vendor_tag_ops_t* v); 38d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkstatic void vendor_tag_descriptor_get_all_tags(const vendor_tag_ops_t* v, uint32_t* tagArray); 39d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkstatic const char* vendor_tag_descriptor_get_section_name(const vendor_tag_ops_t* v, uint32_t tag); 40d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkstatic const char* vendor_tag_descriptor_get_tag_name(const vendor_tag_ops_t* v, uint32_t tag); 41d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkstatic int vendor_tag_descriptor_get_tag_type(const vendor_tag_ops_t* v, uint32_t tag); 42d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 43d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} /* extern "C" */ 44d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 45d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 46d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkstatic Mutex sLock; 47d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkstatic sp<VendorTagDescriptor> sGlobalVendorTagDescriptor; 48d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 49d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalanamespace hardware { 50d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalanamespace camera2 { 51d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalanamespace params { 52f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 53f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben BrunkVendorTagDescriptor::~VendorTagDescriptor() { 54f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk size_t len = mReverseMapping.size(); 55f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk for (size_t i = 0; i < len; ++i) { 56f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk delete mReverseMapping[i]; 57f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 58f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk} 59d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 60d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville TalvalaVendorTagDescriptor::VendorTagDescriptor() : 61d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagCount(0), 6202bf03287652923b5bb5316667b065423565d6b4Eino-Ville Talvala mVendorOps() { 63d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} 64f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 65d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville TalvalaVendorTagDescriptor::VendorTagDescriptor(const VendorTagDescriptor& src) { 66d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala copyFrom(src); 67d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} 68f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 69d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville TalvalaVendorTagDescriptor& VendorTagDescriptor::operator=(const VendorTagDescriptor& rhs) { 70d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala copyFrom(rhs); 71d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return *this; 72d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} 73f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 74d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalavoid VendorTagDescriptor::copyFrom(const VendorTagDescriptor& src) { 75d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (this == &src) return; 76f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 77d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala size_t len = mReverseMapping.size(); 78d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala for (size_t i = 0; i < len; ++i) { 79d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala delete mReverseMapping[i]; 80d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 81d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mReverseMapping.clear(); 82d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 83d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala len = src.mReverseMapping.size(); 84d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // Have to copy KeyedVectors inside mReverseMapping 85d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala for (size_t i = 0; i < len; ++i) { 86d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 87d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala *nameMapper = *(src.mReverseMapping.valueAt(i)); 88d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mReverseMapping.add(src.mReverseMapping.keyAt(i), nameMapper); 89f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 90d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // Everything else is simple 91d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagToNameMap = src.mTagToNameMap; 92d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagToSectionMap = src.mTagToSectionMap; 93d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagToTypeMap = src.mTagToTypeMap; 94d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mSections = src.mSections; 95d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagCount = src.mTagCount; 96d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mVendorOps = src.mVendorOps; 97d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 98d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 99f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvalastatus_t VendorTagDescriptor::readFromParcel(const android::Parcel* parcel) { 100d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk status_t res = OK; 101d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (parcel == NULL) { 102d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: parcel argument was NULL.", __FUNCTION__); 103d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return BAD_VALUE; 104d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 105d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 106d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk int32_t tagCount = 0; 107d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if ((res = parcel->readInt32(&tagCount)) != OK) { 108d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: could not read tag count from parcel", __FUNCTION__); 109d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return res; 110d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 111d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 112d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (tagCount < 0 || tagCount > INT32_MAX) { 113d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: tag count %d from vendor ops is invalid.", __FUNCTION__, tagCount); 114d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return BAD_VALUE; 115d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 116d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 117d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagCount = tagCount; 118d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 119f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk uint32_t tag, sectionIndex; 120f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk uint32_t maxSectionIndex = 0; 121d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk int32_t tagType; 122f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk Vector<uint32_t> allTags; 123d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk for (int32_t i = 0; i < tagCount; ++i) { 124d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if ((res = parcel->readInt32(reinterpret_cast<int32_t*>(&tag))) != OK) { 125d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: could not read tag id from parcel for index %d", __FUNCTION__, i); 126d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk break; 127d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 128d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { 129d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); 130d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk res = BAD_VALUE; 131d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk break; 132d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 133d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if ((res = parcel->readInt32(&tagType)) != OK) { 134d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: could not read tag type from parcel for tag %d", __FUNCTION__, tag); 135d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk break; 136d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 137d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (tagType < 0 || tagType >= NUM_TYPES) { 138d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); 139d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk res = BAD_VALUE; 140d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk break; 141d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 142d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk String8 tagName = parcel->readString8(); 143d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (tagName.isEmpty()) { 144d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: parcel tag name was NULL for tag %d.", __FUNCTION__, tag); 145d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk res = NOT_ENOUGH_DATA; 146d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk break; 147d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 148f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 149f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if ((res = parcel->readInt32(reinterpret_cast<int32_t*>(§ionIndex))) != OK) { 150f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk ALOGE("%s: could not read section index for tag %d.", __FUNCTION__, tag); 151d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk break; 152d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 153d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 154f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk maxSectionIndex = (maxSectionIndex >= sectionIndex) ? maxSectionIndex : sectionIndex; 155f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 156f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk allTags.add(tag); 157d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagToNameMap.add(tag, tagName); 158d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagToSectionMap.add(tag, sectionIndex); 159d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mTagToTypeMap.add(tag, tagType); 160d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 161d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 162d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (res != OK) { 163d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return res; 164d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 165d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 1660c629a3857c31bee6fa39ba7a9a8cbcabeb383fdGaurav Batra size_t sectionCount = 0; 167f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (tagCount > 0) { 168f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if ((res = parcel->readInt32(reinterpret_cast<int32_t*>(§ionCount))) != OK) { 169f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk ALOGE("%s: could not read section count for.", __FUNCTION__); 170f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return res; 171f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 172f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (sectionCount < (maxSectionIndex + 1)) { 1731a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzyn ALOGE("%s: Incorrect number of sections defined, received %zu, needs %d.", 174f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk __FUNCTION__, sectionCount, (maxSectionIndex + 1)); 175f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return BAD_VALUE; 176f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 177d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala LOG_ALWAYS_FATAL_IF(mSections.setCapacity(sectionCount) <= 0, 1789181b9f4bb53af203c090eff6d1af67d1f7c8770Zhijun He "Vector capacity must be positive"); 179f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk for (size_t i = 0; i < sectionCount; ++i) { 180f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk String8 sectionName = parcel->readString8(); 181f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (sectionName.isEmpty()) { 1821a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzyn ALOGE("%s: parcel section name was NULL for section %zu.", 1831a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzyn __FUNCTION__, i); 184f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return NOT_ENOUGH_DATA; 185f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 186d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mSections.add(sectionName); 187f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 188f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 189f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 1901a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzyn LOG_ALWAYS_FATAL_IF(static_cast<size_t>(tagCount) != allTags.size(), 1911a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzyn "tagCount must be the same as allTags size"); 192f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk // Set up reverse mapping 193f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk for (size_t i = 0; i < static_cast<size_t>(tagCount); ++i) { 194f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk uint32_t tag = allTags[i]; 195311f99eade1222575bc65a2fcbd9f9a5a40d2024Chih-Hung Hsieh const String8& sectionString = mSections[mTagToSectionMap.valueFor(tag)]; 196f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 197f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk ssize_t reverseIndex = -1; 198d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if ((reverseIndex = mReverseMapping.indexOfKey(sectionString)) < 0) { 199f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 200d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala reverseIndex = mReverseMapping.add(sectionString, nameMapper); 201f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 202d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala mReverseMapping[reverseIndex]->add(mTagToNameMap.valueFor(tag), tag); 203f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 204f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 205d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return res; 206d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 207d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 208d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkint VendorTagDescriptor::getTagCount() const { 209d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk size_t size = mTagToNameMap.size(); 210d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (size == 0) { 211d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_TAG_COUNT_ERR; 212d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 213d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return size; 214d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 215d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 216d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkvoid VendorTagDescriptor::getTagArray(uint32_t* tagArray) const { 217d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk size_t size = mTagToNameMap.size(); 218d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk for (size_t i = 0; i < size; ++i) { 219d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk tagArray[i] = mTagToNameMap.keyAt(i); 220d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 221d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 222d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 223d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkconst char* VendorTagDescriptor::getSectionName(uint32_t tag) const { 224d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ssize_t index = mTagToSectionMap.indexOfKey(tag); 225d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (index < 0) { 226d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_SECTION_NAME_ERR; 227d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 228f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return mSections[mTagToSectionMap.valueAt(index)].string(); 229d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 230d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 231d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkconst char* VendorTagDescriptor::getTagName(uint32_t tag) const { 232d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ssize_t index = mTagToNameMap.indexOfKey(tag); 233d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (index < 0) { 234d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_TAG_NAME_ERR; 235d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 236d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return mTagToNameMap.valueAt(index).string(); 237d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 238d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 239d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkint VendorTagDescriptor::getTagType(uint32_t tag) const { 240d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ssize_t index = mTagToNameMap.indexOfKey(tag); 241d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (index < 0) { 242d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_TAG_TYPE_ERR; 243d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 244d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return mTagToTypeMap.valueFor(tag); 245d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 246d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 247f51fca277eb5b86bd0b2e3fc90ecb2b63089de29Eino-Ville Talvalastatus_t VendorTagDescriptor::writeToParcel(android::Parcel* parcel) const { 248d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk status_t res = OK; 249d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (parcel == NULL) { 250d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: parcel argument was NULL.", __FUNCTION__); 251d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return BAD_VALUE; 252d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 253d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 254d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if ((res = parcel->writeInt32(mTagCount)) != OK) { 255d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return res; 256d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 257d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 258d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk size_t size = mTagToNameMap.size(); 259f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk uint32_t tag, sectionIndex; 260d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk int32_t tagType; 261d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk for (size_t i = 0; i < size; ++i) { 262d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk tag = mTagToNameMap.keyAt(i); 263d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk String8 tagName = mTagToNameMap[i]; 264f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk sectionIndex = mTagToSectionMap.valueFor(tag); 265d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk tagType = mTagToTypeMap.valueFor(tag); 266d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if ((res = parcel->writeInt32(tag)) != OK) break; 267d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if ((res = parcel->writeInt32(tagType)) != OK) break; 268d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if ((res = parcel->writeString8(tagName)) != OK) break; 269f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if ((res = parcel->writeInt32(sectionIndex)) != OK) break; 270f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 271f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 272f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk size_t numSections = mSections.size(); 273f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (numSections > 0) { 274f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if ((res = parcel->writeInt32(numSections)) != OK) return res; 275f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk for (size_t i = 0; i < numSections; ++i) { 276f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if ((res = parcel->writeString8(mSections[i])) != OK) return res; 277f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 278d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 279d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 280d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return res; 281d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 282d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 2834d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvalaconst SortedVector<String8>* VendorTagDescriptor::getAllSectionNames() const { 2844d453830b6a8fb7571a88a9a241eabd50a483c44Eino-Ville Talvala return &mSections; 285f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk} 286f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 2875404ee174dd6b5e312d3a97bc63c2bc8d142012bChih-Hung Hsiehstatus_t VendorTagDescriptor::lookupTag(const String8& name, const String8& section, /*out*/uint32_t* tag) const { 288f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk ssize_t index = mReverseMapping.indexOfKey(section); 289f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (index < 0) { 290f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk ALOGE("%s: Section '%s' does not exist.", __FUNCTION__, section.string()); 291f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return BAD_VALUE; 292f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 293f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 294f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk ssize_t nameIndex = mReverseMapping[index]->indexOfKey(name); 295f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (nameIndex < 0) { 296f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk ALOGE("%s: Tag name '%s' does not exist.", __FUNCTION__, name.string()); 297f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return BAD_VALUE; 298f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 299f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 300f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (tag != NULL) { 301f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk *tag = mReverseMapping[index]->valueAt(nameIndex); 302f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 303f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return OK; 304f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk} 305f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 306f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunkvoid VendorTagDescriptor::dump(int fd, int verbosity, int indentation) const { 307f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 308f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk size_t size = mTagToNameMap.size(); 309f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (size == 0) { 31087cebadd48710e42474756fc3513df678de045ceElliott Hughes dprintf(fd, "%*sDumping configured vendor tag descriptors: None set\n", 311f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk indentation, ""); 312f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk return; 313f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 314f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 31587cebadd48710e42474756fc3513df678de045ceElliott Hughes dprintf(fd, "%*sDumping configured vendor tag descriptors: %zu entries\n", 316f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk indentation, "", size); 317f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk for (size_t i = 0; i < size; ++i) { 318f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk uint32_t tag = mTagToNameMap.keyAt(i); 319f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 320f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk if (verbosity < 1) { 32187cebadd48710e42474756fc3513df678de045ceElliott Hughes dprintf(fd, "%*s0x%x\n", indentation + 2, "", tag); 322f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk continue; 323f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 324f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk String8 name = mTagToNameMap.valueAt(i); 325f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk uint32_t sectionId = mTagToSectionMap.valueFor(tag); 326f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk String8 sectionName = mSections[sectionId]; 327f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk int type = mTagToTypeMap.valueFor(tag); 328f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk const char* typeName = (type >= 0 && type < NUM_TYPES) ? 329f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk camera_metadata_type_names[type] : "UNKNOWN"; 33087cebadd48710e42474756fc3513df678de045ceElliott Hughes dprintf(fd, "%*s0x%x (%s) with type %d (%s) defined in section %s\n", indentation + 2, 331f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk "", tag, name.string(), type, typeName, sectionName.string()); 332f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk } 333f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 334f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk} 335f81648ec38ff63f1f35516fa27c1c24d846e9ba5Ruben Brunk 336d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} // namespace params 337d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} // namespace camera2 338d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} // namespace hardware 339d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 340d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 341d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalastatus_t VendorTagDescriptor::createDescriptorFromOps(const vendor_tag_ops_t* vOps, 342d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala /*out*/ 343d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<VendorTagDescriptor>& descriptor) { 344d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (vOps == NULL) { 345d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: vendor_tag_ops argument was NULL.", __FUNCTION__); 346d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return BAD_VALUE; 347d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 348d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 349d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int tagCount = vOps->get_tag_count(vOps); 350d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (tagCount < 0 || tagCount > INT32_MAX) { 351d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: tag count %d from vendor ops is invalid.", __FUNCTION__, tagCount); 352d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return BAD_VALUE; 353d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 354d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 355d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala Vector<uint32_t> tagArray; 356d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount, 357d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount); 358d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 359d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala vOps->get_all_tags(vOps, /*out*/tagArray.editArray()); 360d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 361d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sp<VendorTagDescriptor> desc = new VendorTagDescriptor(); 362d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala desc->mTagCount = tagCount; 363d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 364d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala SortedVector<String8> sections; 365d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala KeyedVector<uint32_t, String8> tagToSectionMap; 366d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 367d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala for (size_t i = 0; i < static_cast<size_t>(tagCount); ++i) { 368d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala uint32_t tag = tagArray[i]; 369d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { 370d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); 371d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return BAD_VALUE; 372d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 373d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const char *tagName = vOps->get_tag_name(vOps, tag); 374d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (tagName == NULL) { 375d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag); 376d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return BAD_VALUE; 377d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 378d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala desc->mTagToNameMap.add(tag, String8(tagName)); 379d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala const char *sectionName = vOps->get_section_name(vOps, tag); 380d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (sectionName == NULL) { 381d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: no section name defined for vendor tag %d.", __FUNCTION__, tag); 382d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return BAD_VALUE; 383d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 384d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 385d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala String8 sectionString(sectionName); 386d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 387d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala sections.add(sectionString); 388d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala tagToSectionMap.add(tag, sectionString); 389d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 390d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala int tagType = vOps->get_tag_type(vOps, tag); 391d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if (tagType < 0 || tagType >= NUM_TYPES) { 392d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); 393d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return BAD_VALUE; 394d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 395d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala desc->mTagToTypeMap.add(tag, tagType); 396d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 397d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 398d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala desc->mSections = sections; 399d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 400d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala for (size_t i = 0; i < static_cast<size_t>(tagCount); ++i) { 401d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala uint32_t tag = tagArray[i]; 402d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala String8 sectionString = tagToSectionMap.valueFor(tag); 403d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 404d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // Set up tag to section index map 405d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ssize_t index = sections.indexOf(sectionString); 406d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index); 407d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index)); 408d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 409d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala // Set up reverse mapping 410d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala ssize_t reverseIndex = -1; 411d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) { 412d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 413d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper); 414d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 415d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag); 416d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala } 417d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 418d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala descriptor = desc; 419d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala return OK; 420d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala} 421d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 422e1445da74730473a66a3ae8414e940aebfe6585dIgor Murashkinstatus_t VendorTagDescriptor::setAsGlobalVendorTagDescriptor(const sp<VendorTagDescriptor>& desc) { 423d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk status_t res = OK; 424d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 425d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk sGlobalVendorTagDescriptor = desc; 426d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 427d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk vendor_tag_ops_t* opsPtr = NULL; 428d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (desc != NULL) { 429d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk opsPtr = &(desc->mVendorOps); 430d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk opsPtr->get_tag_count = vendor_tag_descriptor_get_tag_count; 431d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk opsPtr->get_all_tags = vendor_tag_descriptor_get_all_tags; 432d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk opsPtr->get_section_name = vendor_tag_descriptor_get_section_name; 433d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk opsPtr->get_tag_name = vendor_tag_descriptor_get_tag_name; 434d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk opsPtr->get_tag_type = vendor_tag_descriptor_get_tag_type; 435d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 436d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if((res = set_camera_metadata_vendor_ops(opsPtr)) != OK) { 437d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: Could not set vendor tag descriptor, received error %s (%d)." 438d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk , __FUNCTION__, strerror(-res), res); 439d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 440d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return res; 441d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 442d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 443d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkvoid VendorTagDescriptor::clearGlobalVendorTagDescriptor() { 444d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 445d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk set_camera_metadata_vendor_ops(NULL); 446d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk sGlobalVendorTagDescriptor.clear(); 447d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 448d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 449d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunksp<VendorTagDescriptor> VendorTagDescriptor::getGlobalVendorTagDescriptor() { 450d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 451d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return sGlobalVendorTagDescriptor; 452d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 453d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 454d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunkextern "C" { 455d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 4561a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzynint vendor_tag_descriptor_get_tag_count(const vendor_tag_ops_t* /*v*/) { 457d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 458d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (sGlobalVendorTagDescriptor == NULL) { 459d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: Vendor tag descriptor not initialized.", __FUNCTION__); 460d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_TAG_COUNT_ERR; 461d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 462d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return sGlobalVendorTagDescriptor->getTagCount(); 463d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 464d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 4651a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzynvoid vendor_tag_descriptor_get_all_tags(const vendor_tag_ops_t* /*v*/, uint32_t* tagArray) { 466d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 467d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (sGlobalVendorTagDescriptor == NULL) { 468d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: Vendor tag descriptor not initialized.", __FUNCTION__); 469d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return; 470d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 471d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk sGlobalVendorTagDescriptor->getTagArray(tagArray); 472d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 473d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 4741a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzynconst char* vendor_tag_descriptor_get_section_name(const vendor_tag_ops_t* /*v*/, uint32_t tag) { 475d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 476d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (sGlobalVendorTagDescriptor == NULL) { 477d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: Vendor tag descriptor not initialized.", __FUNCTION__); 478d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_SECTION_NAME_ERR; 479d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 480d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return sGlobalVendorTagDescriptor->getSectionName(tag); 481d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 482d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 4831a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzynconst char* vendor_tag_descriptor_get_tag_name(const vendor_tag_ops_t* /*v*/, uint32_t tag) { 484d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 485d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (sGlobalVendorTagDescriptor == NULL) { 486d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: Vendor tag descriptor not initialized.", __FUNCTION__); 487d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_TAG_NAME_ERR; 488d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 489d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return sGlobalVendorTagDescriptor->getTagName(tag); 490d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 491d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 4921a93f0cbb99fc5a59c92bd913f29409022ae236dMark Salyzynint vendor_tag_descriptor_get_tag_type(const vendor_tag_ops_t* /*v*/, uint32_t tag) { 493d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk Mutex::Autolock al(sLock); 494d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk if (sGlobalVendorTagDescriptor == NULL) { 495d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk ALOGE("%s: Vendor tag descriptor not initialized.", __FUNCTION__); 496d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return VENDOR_TAG_TYPE_ERR; 497d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk } 498d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk return sGlobalVendorTagDescriptor->getTagType(tag); 499d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} 500d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk 501d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} /* extern "C" */ 502d1176ef16677b6c94fb893edb6a864cdccc0b190Ruben Brunk} /* namespace android */ 503