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