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