1 /*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <system/camera_metadata.h>
18 #include "Metadata.h"
19
20 //#define LOG_NDEBUG 0
21 #define LOG_TAG "VendorTags"
22 #include <cutils/log.h>
23
24 #define ATRACE_TAG (ATRACE_TAG_CAMERA | ATRACE_TAG_HAL)
25 #include <utils/Trace.h>
26
27 #include "VendorTags.h"
28
29 namespace default_camera_hal {
30
31 // Internal representations of vendor tags for convenience.
32 // Other classes must access this data via public interfaces.
33 // Structured to be easy to extend and contain complexity.
34 namespace {
35 // Describes a single vendor tag entry
36 struct Entry {
37 const char* name;
38 uint8_t type;
39 };
40 // Describes a vendor tag section
41 struct Section {
42 const char* name;
43 uint32_t start;
44 uint32_t end;
45 const Entry* tags;
46 };
47
48 // Entry arrays for each section
49 const Entry DemoWizardry[demo_wizardry_end - demo_wizardry_start] = {
50 [demo_wizardry_dimension_size - demo_wizardry_start] =
51 {"dimensionSize", TYPE_INT32},
52 [demo_wizardry_dimensions - demo_wizardry_start] =
53 {"dimensions", TYPE_INT32},
54 [demo_wizardry_familiar - demo_wizardry_start] =
55 {"familiar", TYPE_BYTE},
56 [demo_wizardry_fire - demo_wizardry_start] =
57 {"fire", TYPE_RATIONAL}
58 };
59
60 const Entry DemoSorcery[demo_sorcery_end - demo_sorcery_start] = {
61 [demo_sorcery_difficulty - demo_sorcery_start] =
62 {"difficulty", TYPE_INT64},
63 [demo_sorcery_light - demo_sorcery_start] =
64 {"light", TYPE_BYTE}
65 };
66
67 const Entry DemoMagic[demo_magic_end - demo_magic_start] = {
68 [demo_magic_card_trick - demo_magic_start] =
69 {"cardTrick", TYPE_DOUBLE},
70 [demo_magic_levitation - demo_magic_start] =
71 {"levitation", TYPE_FLOAT}
72 };
73
74 // Array of all sections
75 const Section DemoSections[DEMO_SECTION_COUNT] = {
76 [DEMO_WIZARDRY] = { "demo.wizardry",
77 demo_wizardry_start,
78 demo_wizardry_end,
79 DemoWizardry },
80 [DEMO_SORCERY] = { "demo.sorcery",
81 demo_sorcery_start,
82 demo_sorcery_end,
83 DemoSorcery },
84 [DEMO_MAGIC] = { "demo.magic",
85 demo_magic_start,
86 demo_magic_end,
87 DemoMagic }
88 };
89
90 // Get a static handle to a specific vendor tag section
getSection(uint32_t tag)91 const Section* getSection(uint32_t tag)
92 {
93 uint32_t section = (tag - vendor_section_start) >> 16;
94
95 if (tag < vendor_section_start) {
96 ALOGE("%s: Tag 0x%x before vendor section", __func__, tag);
97 return NULL;
98 }
99
100 if (section >= DEMO_SECTION_COUNT) {
101 ALOGE("%s: Tag 0x%x after vendor section", __func__, tag);
102 return NULL;
103 }
104
105 return &DemoSections[section];
106 }
107
108 // Get a static handle to a specific vendor tag entry
getEntry(uint32_t tag)109 const Entry* getEntry(uint32_t tag)
110 {
111 const Section* section = getSection(tag);
112 int index;
113
114 if (section == NULL)
115 return NULL;
116
117 if (tag >= section->end) {
118 ALOGE("%s: Tag 0x%x outside section", __func__, tag);
119 return NULL;
120 }
121
122 index = tag - section->start;
123 return §ion->tags[index];
124 }
125 } // namespace
126
VendorTags()127 VendorTags::VendorTags()
128 : mTagCount(0)
129 {
130 for (int i = 0; i < DEMO_SECTION_COUNT; i++) {
131 mTagCount += DemoSections[i].end - DemoSections[i].start;
132 }
133 }
134
~VendorTags()135 VendorTags::~VendorTags()
136 {
137 }
138
getTagCount(const vendor_tag_ops_t * ops)139 int VendorTags::getTagCount(const vendor_tag_ops_t* ops)
140 {
141 return mTagCount;
142 }
143
getAllTags(const vendor_tag_ops_t * ops,uint32_t * tag_array)144 void VendorTags::getAllTags(const vendor_tag_ops_t* ops, uint32_t* tag_array)
145 {
146 if (tag_array == NULL) {
147 ALOGE("%s: NULL tag_array", __func__);
148 return;
149 }
150
151 for (int i = 0; i < DEMO_SECTION_COUNT; i++) {
152 for (uint32_t tag = DemoSections[i].start;
153 tag < DemoSections[i].end; tag++) {
154 *tag_array++ = tag;
155 }
156 }
157 }
158
getSectionName(const vendor_tag_ops_t * ops,uint32_t tag)159 const char* VendorTags::getSectionName(const vendor_tag_ops_t* ops, uint32_t tag)
160 {
161 const Section* section = getSection(tag);
162
163 if (section == NULL)
164 return NULL;
165
166 return section->name;
167 }
168
getTagName(const vendor_tag_ops_t * ops,uint32_t tag)169 const char* VendorTags::getTagName(const vendor_tag_ops_t* ops, uint32_t tag)
170 {
171 const Entry* entry = getEntry(tag);
172
173 if (entry == NULL)
174 return NULL;
175
176 return entry->name;
177 }
178
getTagType(const vendor_tag_ops_t * ops,uint32_t tag)179 int VendorTags::getTagType(const vendor_tag_ops_t* ops, uint32_t tag)
180 {
181 const Entry* entry = getEntry(tag);
182
183 if (entry == NULL)
184 return -1;
185
186 return entry->type;
187 }
188 } // namespace default_camera_hal
189