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*>(&sectionIndex))) != 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*>(&sectionCount))) != 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