1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "metadata_utils.h"
17 #include <securec.h>
18 #include "metadata_log.h"
19
20 static constexpr uint32_t MAX_SUPPORTED_TAGS = 1000;
21 static constexpr uint32_t MAX_SUPPORTED_ITEMS = 2000;
22 static constexpr uint32_t MAX_ITEM_CAPACITY = (1000 * 10);
23 static constexpr uint32_t MAX_DATA_CAPACITY = (1000 * 10 * 10);
24
25 namespace OHOS::Camera {
WriteMetadataDataToVec(const camera_metadata_item_t & entry,std::vector<uint8_t> & cameraAbility)26 void MetadataUtils::WriteMetadataDataToVec(const camera_metadata_item_t &entry, std::vector<uint8_t>& cameraAbility)
27 {
28 if (entry.data_type == META_TYPE_BYTE) {
29 for (size_t i = 0; i < entry.count; i++) {
30 WriteData<int8_t>(*(entry.data.u8 + i), cameraAbility);
31 }
32 } else if (entry.data_type == META_TYPE_INT32) {
33 for (size_t i = 0; i < entry.count; i++) {
34 WriteData<int32_t>(*(entry.data.i32 + i), cameraAbility);
35 }
36 } else if (entry.data_type == META_TYPE_FLOAT) {
37 for (size_t i = 0; i < entry.count; i++) {
38 WriteData<float>(*(entry.data.f + i), cameraAbility);
39 }
40 } else if (entry.data_type == META_TYPE_INT64) {
41 for (size_t i = 0; i < entry.count; i++) {
42 WriteData<int64_t>(*(entry.data.i64 + i), cameraAbility);
43 }
44 } else if (entry.data_type == META_TYPE_DOUBLE) {
45 for (size_t i = 0; i < entry.count; i++) {
46 WriteData<double>(*(entry.data.d + i), cameraAbility);
47 }
48 } else if (entry.data_type == META_TYPE_RATIONAL) {
49 for (size_t i = 0; i < entry.count; i++) {
50 WriteData<int32_t>((*(entry.data.r + i)).numerator, cameraAbility);
51 WriteData<int32_t>((*(entry.data.r + i)).denominator, cameraAbility);
52 }
53 }
54 }
55
ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> & metadata,std::vector<uint8_t> & cameraAbility)56 bool MetadataUtils::ConvertMetadataToVec(const std::shared_ptr<CameraMetadata> &metadata,
57 std::vector<uint8_t>& cameraAbility)
58 {
59 if (metadata == nullptr) {
60 METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: metadata is null!");
61 return false;
62 }
63
64 common_metadata_header_t *meta = metadata->get();
65 if (meta == nullptr) {
66 WriteData<uint32_t>(0, cameraAbility);
67 METADATA_WARNING_LOG("MetadataUtils::ConvertMetadataToVec: tagCount is 0!");
68 return true;
69 }
70
71 uint32_t tagCount = GetCameraMetadataItemCount(meta);
72 if (tagCount > MAX_SUPPORTED_TAGS) {
73 METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: tagCount out of range: %u", tagCount);
74 return false;
75 }
76
77 uint32_t itemCapacity = GetCameraMetadataItemCapacity(meta);
78 if (itemCapacity > MAX_ITEM_CAPACITY) {
79 METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: itemCapacity out of range: %u", itemCapacity);
80 return false;
81 }
82
83 uint32_t dataCapacity = GetCameraMetadataDataSize(meta);
84 if (dataCapacity > MAX_DATA_CAPACITY) {
85 METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: dataCapacity out of range: %u", dataCapacity);
86 return false;
87 }
88
89 WriteData<uint32_t>(tagCount, cameraAbility);
90 WriteData<uint32_t>(itemCapacity, cameraAbility);
91 WriteData<uint32_t>(dataCapacity, cameraAbility);
92 for (uint32_t i = 0; i < tagCount; i++) {
93 camera_metadata_item_t item;
94 int ret = GetCameraMetadataItem(meta, i, &item);
95 if (ret != CAM_META_SUCCESS) {
96 METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: get meta item failed!");
97 return false;
98 }
99
100 if (item.count > MAX_SUPPORTED_ITEMS) {
101 METADATA_ERR_LOG("MetadataUtils::ConvertMetadataToVec: item.count out of range:%u", item.count);
102 return false;
103 }
104 WriteData<uint32_t>(item.index, cameraAbility);
105 WriteData<uint32_t>(item.item, cameraAbility);
106 WriteData<uint32_t>(item.data_type, cameraAbility);
107 WriteData<uint32_t>(item.count, cameraAbility);
108
109 WriteMetadataDataToVec(item, cameraAbility);
110 }
111 return true;
112 }
113
EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> & metadata,MessageParcel & data)114 bool MetadataUtils::EncodeCameraMetadata(const std::shared_ptr<CameraMetadata> &metadata,
115 MessageParcel &data)
116 {
117 if (metadata == nullptr) {
118 return false;
119 }
120
121 bool bRet = true;
122 uint32_t tagCount = 0;
123 common_metadata_header_t *meta = metadata->get();
124 if (meta != nullptr) {
125 tagCount = GetCameraMetadataItemCount(meta);
126 bRet = bRet && data.WriteUint32(tagCount);
127 bRet = bRet && data.WriteUint32(GetCameraMetadataItemCapacity(meta));
128 bRet = bRet && data.WriteUint32(GetCameraMetadataDataSize(meta));
129 for (uint32_t i = 0; i < tagCount; i++) {
130 camera_metadata_item_t item;
131 int ret = GetCameraMetadataItem(meta, i, &item);
132 if (ret != CAM_META_SUCCESS) {
133 return false;
134 }
135
136 bRet = bRet && data.WriteUint32(item.index);
137 bRet = bRet && data.WriteUint32(item.item);
138 bRet = bRet && data.WriteUint32(item.data_type);
139 bRet = bRet && data.WriteUint32(item.count);
140 bRet = bRet && MetadataUtils::WriteMetadata(item, data);
141 }
142 } else {
143 bRet = data.WriteUint32(tagCount);
144 }
145 return bRet;
146 }
147
ReadMetadataDataFromVec(int32_t & index,camera_metadata_item_t & entry,const std::vector<uint8_t> & cameraAbility)148 void MetadataUtils::ReadMetadataDataFromVec(int32_t &index, camera_metadata_item_t &entry,
149 const std::vector<uint8_t>& cameraAbility)
150 {
151 if (entry.data_type == META_TYPE_BYTE) {
152 entry.data.u8 = new(std::nothrow) uint8_t[entry.count];
153 if (entry.data.u8 != nullptr) {
154 for (size_t i = 0; i < entry.count; i++) {
155 ReadData<uint8_t>(entry.data.u8[i], index, cameraAbility);
156 }
157 }
158 } else if (entry.data_type == META_TYPE_INT32) {
159 entry.data.i32 = new(std::nothrow) int32_t[entry.count];
160 if (entry.data.i32 != nullptr) {
161 for (size_t i = 0; i < entry.count; i++) {
162 ReadData<int32_t>(entry.data.i32[i], index, cameraAbility);
163 }
164 }
165 } else if (entry.data_type == META_TYPE_FLOAT) {
166 entry.data.f = new(std::nothrow) float[entry.count];
167 if (entry.data.f != nullptr) {
168 for (size_t i = 0; i < entry.count; i++) {
169 ReadData<float>(entry.data.f[i], index, cameraAbility);
170 }
171 }
172 } else if (entry.data_type == META_TYPE_INT64) {
173 entry.data.i64 = new(std::nothrow) int64_t[entry.count];
174 if (entry.data.i64 != nullptr) {
175 for (size_t i = 0; i < entry.count; i++) {
176 ReadData<int64_t>(entry.data.i64[i], index, cameraAbility);
177 }
178 }
179 } else if (entry.data_type == META_TYPE_DOUBLE) {
180 entry.data.d = new(std::nothrow) double[entry.count];
181 if (entry.data.d != nullptr) {
182 for (size_t i = 0; i < entry.count; i++) {
183 ReadData<double>(entry.data.d[i], index, cameraAbility);
184 }
185 }
186 } else if (entry.data_type == META_TYPE_RATIONAL) {
187 entry.data.r = new(std::nothrow) camera_rational_t[entry.count];
188 if (entry.data.r != nullptr) {
189 for (size_t i = 0; i < entry.count; i++) {
190 ReadData<int32_t>(entry.data.r[i].numerator, index, cameraAbility);
191 ReadData<int32_t>(entry.data.r[i].denominator, index, cameraAbility);
192 }
193 }
194 }
195 }
196
ConvertVecToMetadata(const std::vector<uint8_t> & cameraAbility,std::shared_ptr<CameraMetadata> & metadata)197 void MetadataUtils::ConvertVecToMetadata(const std::vector<uint8_t>& cameraAbility,
198 std::shared_ptr<CameraMetadata> &metadata)
199 {
200 int32_t index = 0;
201 uint32_t tagCount = 0;
202 uint32_t itemCapacity = 0;
203 uint32_t dataCapacity = 0;
204
205 ReadData<uint32_t>(tagCount, index, cameraAbility);
206 if (tagCount > MAX_SUPPORTED_TAGS) {
207 METADATA_ERR_LOG("MetadataUtils::ConvertVecToMetadata: tagCount out of range: %u", tagCount);
208 return;
209 }
210 ReadData<uint32_t>(itemCapacity, index, cameraAbility);
211 if (itemCapacity > MAX_ITEM_CAPACITY) {
212 METADATA_ERR_LOG("MetadataUtils::ConvertVecToMetadata: itemCapacity out of range: %u", itemCapacity);
213 return;
214 }
215 ReadData<uint32_t>(dataCapacity, index, cameraAbility);
216 if (dataCapacity > MAX_DATA_CAPACITY) {
217 METADATA_ERR_LOG("MetadataUtils::ConvertVecToMetadata: dataCapacity out of range: %u", dataCapacity);
218 return;
219 }
220
221 std::vector<camera_metadata_item_t> items;
222 for (uint32_t i = 0; i < tagCount; i++) {
223 camera_metadata_item_t item;
224 ReadData<uint32_t>(item.index, index, cameraAbility);
225 ReadData<uint32_t>(item.item, index, cameraAbility);
226 ReadData<uint32_t>(item.data_type, index, cameraAbility);
227 ReadData<uint32_t>(item.count, index, cameraAbility);
228 if (item.count > MAX_SUPPORTED_ITEMS) {
229 METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata item.count out of range:%u", item.count);
230 return;
231 }
232 ReadMetadataDataFromVec(index, item, cameraAbility);
233 items.push_back(item);
234 }
235
236 metadata = std::make_shared<CameraMetadata>(itemCapacity, dataCapacity);
237 common_metadata_header_t *meta = metadata->get();
238 for (auto &item_ : items) {
239 void *buffer = nullptr;
240 MetadataUtils::ItemDataToBuffer(item_, &buffer);
241 (void)AddCameraMetadataItem(meta, item_.item, buffer, item_.count);
242 FreeMetadataBuffer(item_);
243 }
244 }
245
DecodeCameraMetadata(MessageParcel & data,std::shared_ptr<CameraMetadata> & metadata)246 void MetadataUtils::DecodeCameraMetadata(MessageParcel &data, std::shared_ptr<CameraMetadata> &metadata)
247 {
248 uint32_t tagCount = data.ReadUint32();
249 uint32_t itemCapacity = data.ReadUint32();
250 uint32_t dataCapacity = data.ReadUint32();
251
252 if (tagCount > MAX_SUPPORTED_TAGS) {
253 tagCount = MAX_SUPPORTED_TAGS;
254 METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata tagCount is more than supported value");
255 }
256
257 if (itemCapacity > MAX_ITEM_CAPACITY) {
258 itemCapacity = MAX_ITEM_CAPACITY;
259 METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata itemCapacity is more than supported value");
260 }
261
262 if (dataCapacity > MAX_DATA_CAPACITY) {
263 dataCapacity = MAX_DATA_CAPACITY;
264 METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata dataCapacity is more than supported value");
265 }
266
267 std::vector<camera_metadata_item_t> items;
268 for (uint32_t i = 0; i < tagCount; i++) {
269 camera_metadata_item_t item;
270 item.index = data.ReadUint32();
271 item.item = data.ReadUint32();
272 item.data_type = data.ReadUint32();
273 item.count = data.ReadUint32();
274 if (item.count > MAX_SUPPORTED_ITEMS) {
275 item.count = MAX_SUPPORTED_ITEMS;
276 METADATA_ERR_LOG("MetadataUtils::DecodeCameraMetadata item.count is more than supported value");
277 }
278 MetadataUtils::ReadMetadata(item, data);
279 items.push_back(item);
280 }
281
282 metadata = std::make_shared<CameraMetadata>(itemCapacity, dataCapacity);
283 common_metadata_header_t *meta = metadata->get();
284 for (auto &item_ : items) {
285 void *buffer = nullptr;
286 MetadataUtils::ItemDataToBuffer(item_, &buffer);
287 (void)AddCameraMetadataItem(meta, item_.item, buffer, item_.count);
288 FreeMetadataBuffer(item_);
289 }
290 }
291
WriteMetadata(const camera_metadata_item_t & item,MessageParcel & data)292 bool MetadataUtils::WriteMetadata(const camera_metadata_item_t &item, MessageParcel &data)
293 {
294 bool bRet = false;
295 size_t i;
296 if (item.data_type == META_TYPE_BYTE) {
297 std::vector<uint8_t> byteBuffers;
298 for (i = 0; i < item.count; i++) {
299 byteBuffers.push_back(*(item.data.u8 + i));
300 }
301 bRet = data.WriteUInt8Vector(byteBuffers);
302 } else if (item.data_type == META_TYPE_INT32) {
303 std::vector<int32_t> int32Buffers;
304 for (i = 0; i < item.count; i++) {
305 int32Buffers.push_back(*(item.data.i32 + i));
306 }
307 bRet = data.WriteInt32Vector(int32Buffers);
308 } else if (item.data_type == META_TYPE_FLOAT) {
309 std::vector<float> floatBuffers;
310 for (i = 0; i < item.count; i++) {
311 floatBuffers.push_back(*(item.data.f + i));
312 }
313 bRet = data.WriteFloatVector(floatBuffers);
314 } else if (item.data_type == META_TYPE_UINT32) {
315 std::vector<uint32_t> uInt32Buffers;
316 for (i = 0; i < item.count; i++) {
317 uInt32Buffers.push_back(*(item.data.ui32 + i));
318 }
319 bRet = data.WriteUInt32Vector(uInt32Buffers);
320 } else if (item.data_type == META_TYPE_INT64) {
321 std::vector<int64_t> int64Buffers;
322 for (i = 0; i < item.count; i++) {
323 int64Buffers.push_back(*(item.data.i64 + i));
324 }
325 bRet = data.WriteInt64Vector(int64Buffers);
326 } else if (item.data_type == META_TYPE_DOUBLE) {
327 std::vector<double> doubleBuffers;
328 for (i = 0; i < item.count; i++) {
329 doubleBuffers.push_back(*(item.data.d + i));
330 }
331 bRet = data.WriteDoubleVector(doubleBuffers);
332 } else if (item.data_type == META_TYPE_RATIONAL) {
333 std::vector<int32_t> rationalBuffers;
334 for (i = 0; i < item.count; i++) {
335 rationalBuffers.push_back((*(item.data.r + i)).numerator);
336 rationalBuffers.push_back((*(item.data.r + i)).denominator);
337 }
338 bRet = data.WriteInt32Vector(rationalBuffers);
339 }
340
341 return bRet;
342 }
343
EncodeToString(std::shared_ptr<CameraMetadata> metadata)344 std::string MetadataUtils::EncodeToString(std::shared_ptr<CameraMetadata> metadata)
345 {
346 int32_t ret;
347 const int32_t headerLength = sizeof(common_metadata_header_t);
348 const int32_t itemLen = sizeof(camera_metadata_item_entry_t);
349 const int32_t itemFixedLen = static_cast<int32_t>(offsetof(camera_metadata_item_entry_t, data));
350
351 if (metadata == nullptr || metadata->get() == nullptr) {
352 METADATA_ERR_LOG("MetadataUtils::EncodeToString Metadata is invalid");
353 return {};
354 }
355
356 common_metadata_header_t *meta = metadata->get();
357 int32_t encodeDataLen = headerLength + (itemLen * meta->item_count) + meta->data_count;
358 std::string s(encodeDataLen, '\0');
359 char *encodeData = &s[0];
360 ret = memcpy_s(encodeData, encodeDataLen, meta, headerLength);
361 if (ret != EOK) {
362 METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for metadata header");
363 return {};
364 }
365 encodeData += headerLength;
366 encodeDataLen -= headerLength;
367 camera_metadata_item_entry_t *item = GetMetadataItems(meta);
368 for (uint32_t index = 0; index < meta->item_count; index++, item++) {
369 ret = memcpy_s(encodeData, encodeDataLen, item, itemFixedLen);
370 if (ret != EOK) {
371 METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for item fixed fields");
372 return {};
373 }
374 encodeData += itemFixedLen;
375 encodeDataLen -= itemFixedLen;
376 int32_t dataLen = itemLen - itemFixedLen;
377 ret = memcpy_s(encodeData, encodeDataLen, &(item->data), dataLen);
378 if (ret != EOK) {
379 METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for item data field");
380 return {};
381 }
382 encodeData += dataLen;
383 encodeDataLen -= dataLen;
384 }
385
386 if (meta->data_count != 0) {
387 ret = memcpy_s(encodeData, encodeDataLen, GetMetadataData(meta), meta->data_count);
388 if (ret != EOK) {
389 METADATA_ERR_LOG("MetadataUtils::EncodeToString Failed to copy memory for data");
390 return {};
391 }
392 encodeData += meta->data_count;
393 }
394 METADATA_DEBUG_LOG("MetadataUtils::EncodeToString Calculated length: %{public}d, encoded length: %{public}d",
395 s.capacity(), (encodeData - &s[0]));
396
397 return s;
398 }
399
DecodeFromString(std::string setting)400 std::shared_ptr<CameraMetadata> MetadataUtils::DecodeFromString(std::string setting)
401 {
402 uint32_t ret;
403 uint32_t totalLen = setting.capacity();
404 const uint32_t headerLength = sizeof(common_metadata_header_t);
405 const uint32_t itemLen = sizeof(camera_metadata_item_entry_t);
406 const uint32_t itemFixedLen = offsetof(camera_metadata_item_entry_t, data);
407
408 if (totalLen < headerLength) {
409 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Length is less than metadata header length");
410 return {};
411 }
412
413 char *decodeData = &setting[0];
414 common_metadata_header_t header;
415 ret = memcpy_s(&header, headerLength, decodeData, headerLength);
416 if (ret != EOK) {
417 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for metadata header");
418 return {};
419 }
420 std::shared_ptr<CameraMetadata> metadata
421 = std::make_shared<CameraMetadata>(header.item_capacity, header.data_capacity);
422 common_metadata_header_t *meta = metadata->get();
423 if (!meta) {
424 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to get metadata header");
425 return {};
426 }
427 ret = memcpy_s(meta, headerLength, &header, headerLength);
428 if (ret != EOK) {
429 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for metadata header");
430 return {};
431 }
432 decodeData += headerLength;
433 camera_metadata_item_entry_t *item = GetMetadataItems(meta);
434 for (uint32_t index = 0; index < meta->item_count; index++, item++) {
435 if (totalLen < ((decodeData - &setting[0]) + itemLen)) {
436 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed at item index: %{public}d", index);
437 return {};
438 }
439 ret = memcpy_s(item, itemFixedLen, decodeData, itemFixedLen);
440 if (ret != EOK) {
441 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for item fixed fields");
442 return {};
443 }
444 decodeData += itemFixedLen;
445 uint32_t dataLen = itemLen - itemFixedLen;
446 ret = memcpy_s(&(item->data), dataLen, decodeData, dataLen);
447 if (ret != EOK) {
448 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for item data field");
449 return {};
450 }
451 decodeData += dataLen;
452 }
453
454 if (meta->data_count != 0) {
455 if (totalLen < static_cast<uint32_t>(((decodeData - &setting[0]) + meta->data_count))) {
456 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed at data copy");
457 return {};
458 }
459 ret = memcpy_s(GetMetadataData(meta), meta->data_count, decodeData, meta->data_count);
460 if (ret != EOK) {
461 METADATA_ERR_LOG("MetadataUtils::DecodeFromString Failed to copy memory for data");
462 return {};
463 }
464 decodeData += meta->data_count;
465 }
466
467 METADATA_DEBUG_LOG("MetadataUtils::DecodeFromString String length: %{public}d, Decoded length: %{public}d",
468 setting.capacity(), (decodeData - &setting[0]));
469 return metadata;
470 }
471
ReadMetadata(camera_metadata_item_t & item,MessageParcel & data)472 bool MetadataUtils::ReadMetadata(camera_metadata_item_t &item, MessageParcel &data)
473 {
474 size_t i, j;
475 if (item.data_type == META_TYPE_BYTE) {
476 std::vector<uint8_t> byteBuffers;
477 data.ReadUInt8Vector(&byteBuffers);
478 item.data.u8 = new(std::nothrow) uint8_t[item.count];
479 if (item.data.u8 != nullptr) {
480 for (i = 0; i < item.count && i < byteBuffers.size(); i++) {
481 item.data.u8[i] = byteBuffers.at(i);
482 }
483 }
484 } else if (item.data_type == META_TYPE_INT32) {
485 std::vector<int32_t> int32Buffers;
486 data.ReadInt32Vector(&int32Buffers);
487 item.data.i32 = new(std::nothrow) int32_t[item.count];
488 if (item.data.i32 != nullptr) {
489 for (i = 0; i < item.count && i < int32Buffers.size(); i++) {
490 item.data.i32[i] = int32Buffers.at(i);
491 }
492 }
493 } else if (item.data_type == META_TYPE_FLOAT) {
494 std::vector<float> floatBuffers;
495 data.ReadFloatVector(&floatBuffers);
496 item.data.f = new(std::nothrow) float[item.count];
497 if (item.data.f != nullptr) {
498 for (i = 0; i < item.count && i < floatBuffers.size(); i++) {
499 item.data.f[i] = floatBuffers.at(i);
500 }
501 }
502 } else if (item.data_type == META_TYPE_UINT32) {
503 std::vector<uint32_t> uInt32Buffers;
504 data.ReadUInt32Vector(&uInt32Buffers);
505 item.data.ui32 = new(std::nothrow) uint32_t[item.count];
506 if (item.data.ui32 != nullptr) {
507 for (i = 0; i < item.count && i < uInt32Buffers.size(); i++) {
508 item.data.ui32[i] = uInt32Buffers.at(i);
509 }
510 }
511 } else if (item.data_type == META_TYPE_INT64) {
512 std::vector<int64_t> int64uBffers;
513 data.ReadInt64Vector(&int64uBffers);
514 item.data.i64 = new(std::nothrow) int64_t[item.count];
515 if (item.data.i64 != nullptr) {
516 for (i = 0; i < item.count && i < int64uBffers.size(); i++) {
517 item.data.i64[i] = int64uBffers.at(i);
518 }
519 }
520 } else if (item.data_type == META_TYPE_DOUBLE) {
521 std::vector<double> doubleBuffers;
522 data.ReadDoubleVector(&doubleBuffers);
523 item.data.d = new(std::nothrow) double[item.count];
524 if (item.data.d != nullptr) {
525 for (i = 0; i < item.count && i < doubleBuffers.size(); i++) {
526 item.data.d[i] = doubleBuffers.at(i);
527 }
528 }
529 } else if (item.data_type == META_TYPE_RATIONAL) {
530 std::vector<int32_t> rationalBuffers;
531 data.ReadInt32Vector(&rationalBuffers);
532 item.data.r = new(std::nothrow) camera_rational_t[item.count];
533 if (item.data.r != nullptr) {
534 for (i = 0, j = 0;
535 i < item.count && j < static_cast<size_t>(rationalBuffers.size() - 1);
536 i++, j += INDEX_COUNTER) {
537 item.data.r[i].numerator = rationalBuffers.at(j);
538 item.data.r[i].denominator = rationalBuffers.at(j + 1);
539 }
540 }
541 }
542 return true;
543 }
544
ItemDataToBuffer(const camera_metadata_item_t & item,void ** buffer)545 void MetadataUtils::ItemDataToBuffer(const camera_metadata_item_t &item, void **buffer)
546 {
547 if (buffer == nullptr) {
548 METADATA_ERR_LOG("MetadataUtils::ItemDataToBuffer buffer is null");
549 return;
550 }
551 if (item.data_type == META_TYPE_BYTE) {
552 *buffer = reinterpret_cast<void *>(item.data.u8);
553 } else if (item.data_type == META_TYPE_INT32) {
554 *buffer = reinterpret_cast<void *>(item.data.i32);
555 } else if (item.data_type == META_TYPE_FLOAT) {
556 *buffer = reinterpret_cast<void *>(item.data.f);
557 } else if (item.data_type == META_TYPE_UINT32) {
558 *buffer = reinterpret_cast<void *>(item.data.ui32);
559 } else if (item.data_type == META_TYPE_INT64) {
560 *buffer = reinterpret_cast<void *>(item.data.i64);
561 } else if (item.data_type == META_TYPE_DOUBLE) {
562 *buffer = reinterpret_cast<void *>(item.data.d);
563 } else if (item.data_type == META_TYPE_RATIONAL) {
564 *buffer = reinterpret_cast<void *>(item.data.r);
565 }
566 }
567
FreeMetadataBuffer(camera_metadata_item_t & entry)568 void MetadataUtils::FreeMetadataBuffer(camera_metadata_item_t &entry)
569 {
570 if (entry.data_type == META_TYPE_BYTE) {
571 if (entry.data.u8 != nullptr) {
572 delete[] entry.data.u8;
573 }
574 } else if (entry.data_type == META_TYPE_INT32) {
575 if (entry.data.i32 != nullptr) {
576 delete[] entry.data.i32;
577 }
578 } else if (entry.data_type == META_TYPE_FLOAT) {
579 if (entry.data.f != nullptr) {
580 delete[] entry.data.f;
581 }
582 } else if (entry.data_type == META_TYPE_INT64) {
583 if (entry.data.i64 != nullptr) {
584 delete[] entry.data.i64;
585 }
586 } else if (entry.data_type == META_TYPE_UINT32) {
587 if (entry.data.ui32 != nullptr) {
588 delete[] entry.data.ui32;
589 }
590 } else if (entry.data_type == META_TYPE_DOUBLE) {
591 if (entry.data.d != nullptr) {
592 delete[] entry.data.d;
593 }
594 } else if (entry.data_type == META_TYPE_RATIONAL) {
595 if (entry.data.r != nullptr) {
596 delete[] entry.data.r;
597 }
598 }
599 }
600 } // Camera
601