• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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