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