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