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