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