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