1 /*
2 * Copyright (c) 2021-2022 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 "camera_metadata_operator.h"
17 #include <cstring>
18 #include <securec.h>
19 #include "camera_metadata_item_info.h"
20 #include "metadata_log.h"
21
22 namespace OHOS::Camera {
23 const int METADATA_HEADER_DATA_SIZE = 4;
24
AlignTo(uint32_t val,uint32_t alignment)25 uint32_t AlignTo(uint32_t val, uint32_t alignment)
26 {
27 return (((uintptr_t)(val) + ((alignment) - 1)) & ~((alignment) - 1));
28 }
29
MaxAlignment(uint32_t dataAlignment,uint32_t metadataAlignment)30 uint32_t MaxAlignment(uint32_t dataAlignment, uint32_t metadataAlignment)
31 {
32 return ((dataAlignment > metadataAlignment) ? dataAlignment : metadataAlignment);
33 }
34
GetMetadataData(const common_metadata_header_t * metadataHeader)35 uint8_t *GetMetadataData(const common_metadata_header_t *metadataHeader)
36 {
37 if (!metadataHeader) {
38 METADATA_ERR_LOG("GetMetadataData metadataHeader is null");
39 return nullptr;
40 }
41 return (uint8_t *)metadataHeader + metadataHeader->data_start;
42 }
43
GetMetadataItems(const common_metadata_header_t * metadataHeader)44 camera_metadata_item_entry_t *GetMetadataItems(const common_metadata_header_t *metadataHeader)
45 {
46 return reinterpret_cast<camera_metadata_item_entry_t *>(
47 (reinterpret_cast<uint8_t *>(const_cast<common_metadata_header_t *>(metadataHeader)) +
48 metadataHeader->items_start));
49 }
50
FillCameraMetadata(common_metadata_header_t * buffer,size_t memoryRequired,uint32_t itemCapacity,uint32_t dataCapacity)51 common_metadata_header_t *FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired,
52 uint32_t itemCapacity, uint32_t dataCapacity)
53 {
54 METADATA_DEBUG_LOG("FillCameraMetadata start");
55 if (buffer == nullptr) {
56 METADATA_ERR_LOG("FillCameraMetadata buffer is null");
57 return nullptr;
58 }
59
60 common_metadata_header_t *metadataHeader = static_cast<common_metadata_header_t *>(buffer);
61 metadataHeader->version = CURRENT_CAMERA_METADATA_VERSION;
62 metadataHeader->size = memoryRequired;
63 metadataHeader->item_count = 0;
64 metadataHeader->item_capacity = itemCapacity;
65 metadataHeader->items_start = AlignTo(sizeof(common_metadata_header_t), ITEM_ALIGNMENT);
66 metadataHeader->data_count = 0;
67 metadataHeader->data_capacity = dataCapacity;
68 size_t dataUnaligned = reinterpret_cast<uint8_t *>(GetMetadataItems(metadataHeader) +
69 metadataHeader->item_capacity) - reinterpret_cast<uint8_t *>(metadataHeader);
70 metadataHeader->data_start = AlignTo(dataUnaligned, DATA_ALIGNMENT);
71
72 METADATA_DEBUG_LOG("FillCameraMetadata end");
73 return metadataHeader;
74 }
75
CalculateCameraMetadataMemoryRequired(uint32_t itemCount,uint32_t dataCount)76 size_t CalculateCameraMetadataMemoryRequired(uint32_t itemCount, uint32_t dataCount)
77 {
78 METADATA_DEBUG_LOG("CalculateCameraMetadataMemoryRequired start");
79 size_t memoryRequired = sizeof(common_metadata_header_t);
80 memoryRequired = AlignTo(memoryRequired, ITEM_ALIGNMENT);
81
82 memoryRequired += sizeof(camera_metadata_item_entry_t[itemCount]);
83 memoryRequired = AlignTo(memoryRequired, DATA_ALIGNMENT);
84
85 memoryRequired += sizeof(uint8_t[dataCount]);
86 memoryRequired = AlignTo(memoryRequired, METADATA_PACKET_ALIGNMENT);
87
88 METADATA_DEBUG_LOG("CalculateCameraMetadataMemoryRequired memoryRequired: %{public}zu", memoryRequired);
89 METADATA_DEBUG_LOG("CalculateCameraMetadataMemoryRequired end");
90 return memoryRequired;
91 }
92
AllocateCameraMetadataBuffer(uint32_t item_capacity,uint32_t data_capacity)93 common_metadata_header_t *AllocateCameraMetadataBuffer(uint32_t item_capacity, uint32_t data_capacity)
94 {
95 METADATA_DEBUG_LOG("AllocateCameraMetadataBuffer start");
96 METADATA_DEBUG_LOG("AllocateCameraMetadataBuffer item_capacity: %{public}u, data_capacity: %{public}u",
97 item_capacity, data_capacity);
98 size_t memoryRequired = CalculateCameraMetadataMemoryRequired(item_capacity, data_capacity);
99 void *buffer = calloc(1, memoryRequired);
100 if (buffer == nullptr) {
101 METADATA_ERR_LOG("AllocateCameraMetadataBuffer memory allocation failed");
102 return reinterpret_cast<common_metadata_header_t *>(buffer);
103 }
104
105 common_metadata_header_t *metadataHeader = FillCameraMetadata(reinterpret_cast<common_metadata_header_t *>(buffer),
106 memoryRequired,
107 item_capacity, data_capacity);
108 if (metadataHeader == nullptr) {
109 METADATA_ERR_LOG("AllocateCameraMetadataBuffer metadataHeader is null");
110 free(buffer);
111 }
112
113 METADATA_DEBUG_LOG("AllocateCameraMetadataBuffer end");
114 return metadataHeader;
115 }
116
GetMetadataSection(uint32_t itemSection,uint32_t * section)117 int32_t GetMetadataSection(uint32_t itemSection, uint32_t *section)
118 {
119 METADATA_DEBUG_LOG("GetMetadataSection start");
120 if (itemSection < OHOS_CAMERA_PROPERTIES ||
121 itemSection >= OHOS_ABILITY_SECTION_END) {
122 METADATA_ERR_LOG("GetMetadataSection itemSection is not valid");
123 return CAM_META_FAILURE;
124 }
125
126 int32_t ret = CAM_META_SUCCESS;
127 switch (itemSection) {
128 case OHOS_CAMERA_PROPERTIES:
129 *section = OHOS_SECTION_CAMERA_PROPERTIES;
130 break;
131 case OHOS_CAMERA_SENSOR:
132 *section = OHOS_SECTION_CAMERA_SENSOR;
133 break;
134 case OHOS_CAMERA_SENSOR_INFO:
135 *section = OHOS_SECTION_CAMERA_SENSOR_INFO;
136 break;
137 case OHOS_CAMERA_STATISTICS:
138 *section = OHOS_SECTION_CAMERA_STATISTICS;
139 break;
140 case OHOS_DEVICE_CONTROL:
141 *section = OHOS_SECTION_CAMERA_CONTROL;
142 break;
143 case OHOS_DEVICE_EXPOSURE:
144 *section = OHOS_SECTION_DEVICE_EXPOSURE;
145 break;
146 case OHOS_DEVICE_FOCUS:
147 *section = OHOS_SECTION_DEVICE_FOCUS;
148 break;
149 case OHOS_DEVICE_FLASH:
150 *section = OHOS_SECTION_DEVICE_FLASH;
151 break;
152 case OHOS_DEVICE_ZOOM:
153 *section = OHOS_SECTION_DEVICE_ZOOM;
154 break;
155 case OHOS_STREAM_ABILITY:
156 *section = OHOS_SECTION_STREAM_ABILITY;
157 break;
158 case OHOS_STREAM_JPEG:
159 *section = OHOS_SECTION_STREAM_JPEG;
160 break;
161 case OHOS_STREAM_VIDEO:
162 *section = OHOS_SECTION_STREAM_VIDEO;
163 break;
164 default:
165 METADATA_ERR_LOG("GetMetadataSection item section is not defined");
166 ret = CAM_META_FAILURE;
167 break;
168 }
169
170 METADATA_DEBUG_LOG("GetMetadataSection end");
171 return ret;
172 }
173
GetCameraMetadataItemType(uint32_t item,uint32_t * dataType)174 int32_t GetCameraMetadataItemType(uint32_t item, uint32_t *dataType)
175 {
176 METADATA_DEBUG_LOG("GetCameraMetadataItemType start");
177 if (dataType == nullptr) {
178 METADATA_ERR_LOG("GetCameraMetadataItemType dataType is null");
179 return CAM_META_INVALID_PARAM;
180 }
181 uint32_t section;
182 int32_t ret = GetMetadataSection(item >> BITWISE_SHIFT_16, §ion);
183 if (ret != CAM_META_SUCCESS) {
184 METADATA_ERR_LOG("GetCameraMetadataItemType section is not valid");
185 return ret;
186 }
187
188 if (item >= g_ohosCameraSectionBounds[section][1]) {
189 METADATA_ERR_LOG("GetCameraMetadataItemType item is not in section bound");
190 return CAM_META_FAILURE;
191 }
192
193 uint32_t itemIndex = item & 0xFFFF;
194 if (g_ohosItemInfo[section][itemIndex].item_type < META_TYPE_BYTE) {
195 METADATA_ERR_LOG("GetCameraMetadataItemType item is not initialized");
196 return CAM_META_FAILURE;
197 }
198
199 *dataType = g_ohosItemInfo[section][itemIndex].item_type;
200
201 METADATA_DEBUG_LOG("GetCameraMetadataItemType end");
202 return CAM_META_SUCCESS;
203 }
204
GetCameraMetadataItemName(uint32_t item)205 const char *GetCameraMetadataItemName(uint32_t item)
206 {
207 METADATA_DEBUG_LOG("GetCameraMetadataItemName start");
208 METADATA_DEBUG_LOG("GetCameraMetadataItemName item: %{public}u", item);
209 uint32_t section;
210 int32_t ret = GetMetadataSection(item >> BITWISE_SHIFT_16, §ion);
211 if (ret != CAM_META_SUCCESS) {
212 METADATA_ERR_LOG("GetCameraMetadataItemName section is not valid");
213 return nullptr;
214 }
215
216 if (item >= g_ohosCameraSectionBounds[section][1]) {
217 METADATA_ERR_LOG("GetCameraMetadataItemName item is not in section bound");
218 return nullptr;
219 }
220
221 uint32_t itemIndex = item & 0xFFFF;
222 METADATA_DEBUG_LOG("GetCameraMetadataItemName end");
223 return g_ohosItemInfo[section][itemIndex].item_name;
224 }
225
CalculateCameraMetadataItemDataSize(uint32_t type,size_t dataCount)226 size_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t dataCount)
227 {
228 METADATA_DEBUG_LOG("CalculateCameraMetadataItemDataSize start");
229 if (type < META_TYPE_BYTE || type >= META_NUM_TYPES) {
230 METADATA_ERR_LOG("CalculateCameraMetadataItemDataSize invalid type");
231 return 0;
232 }
233
234 size_t dataBytes = dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[type];
235
236 METADATA_DEBUG_LOG("CalculateCameraMetadataItemDataSize end");
237 return (dataBytes <= METADATA_HEADER_DATA_SIZE) ? 0 : AlignTo(dataBytes, DATA_ALIGNMENT);
238 }
239
AddCameraMetadataItem(common_metadata_header_t * dst,uint32_t item,const void * data,size_t dataCount)240 int AddCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, size_t dataCount)
241 {
242 METADATA_DEBUG_LOG("AddCameraMetadataItem start");
243 const char *name = GetCameraMetadataItemName(item);
244 if (name == nullptr) {
245 name = "<unknown>";
246 }
247 METADATA_DEBUG_LOG("AddCameraMetadataItem item id: %{public}u, name: %{public}s, "
248 "dataCount: %{public}zu", item, name, dataCount);
249
250 if (dst == nullptr) {
251 METADATA_ERR_LOG("AddCameraMetadataItem common_metadata_header_t is null");
252 return CAM_META_INVALID_PARAM;
253 }
254
255 if (!dataCount || data == nullptr) {
256 METADATA_ERR_LOG("AddCameraMetadataItem data is not valid. item: %{public}u, "
257 "dataCount: %{public}zu", item, dataCount);
258 return CAM_META_INVALID_PARAM;
259 }
260
261 if (dst->item_count == dst->item_capacity) {
262 METADATA_ERR_LOG("AddCameraMetadataItem item_capacity limit reached. "
263 "item_count: %{public}d, item_capacity: %{public}d",
264 dst->item_count, dst->item_capacity);
265 return CAM_META_ITEM_CAP_EXCEED;
266 }
267
268 uint32_t dataType;
269 int32_t ret = GetCameraMetadataItemType(item, &dataType);
270 if (ret != CAM_META_SUCCESS) {
271 METADATA_ERR_LOG("AddCameraMetadataItem invalid item type");
272 return CAM_META_INVALID_PARAM;
273 }
274
275 size_t dataBytes =
276 CalculateCameraMetadataItemDataSize(dataType, dataCount);
277 if (dataBytes + dst->data_count > dst->data_capacity) {
278 METADATA_ERR_LOG("AddCameraMetadataItem data_capacity limit reached");
279 return CAM_META_DATA_CAP_EXCEED;
280 }
281
282 size_t dataPayloadBytes =
283 dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[dataType];
284 camera_metadata_item_entry_t *metadataItem = GetMetadataItems(dst) + dst->item_count;
285 ret = memset_s(metadataItem, sizeof(camera_metadata_item_entry_t), 0, sizeof(camera_metadata_item_entry_t));
286 if (ret != EOK) {
287 METADATA_ERR_LOG("AddCameraMetadataItem: memset_s failed");
288 return CAM_META_FAILURE;
289 }
290 metadataItem->item = item;
291 metadataItem->data_type = dataType;
292 metadataItem->count = dataCount;
293
294 if (dataBytes == 0) {
295 ret = memcpy_s(metadataItem->data.value, dataPayloadBytes, data, dataPayloadBytes);
296 if (ret != EOK) {
297 METADATA_ERR_LOG("AddCameraMetadataItem memory copy failed");
298 return CAM_META_FAILURE;
299 }
300 } else {
301 metadataItem->data.offset = dst->data_count;
302 ret = memcpy_s(GetMetadataData(dst) + metadataItem->data.offset, dataPayloadBytes, data,
303 dataPayloadBytes);
304 if (ret != EOK) {
305 METADATA_ERR_LOG("AddCameraMetadataItem memory copy failed");
306 return CAM_META_FAILURE;
307 }
308 dst->data_count += dataBytes;
309 }
310 dst->item_count++;
311
312 METADATA_DEBUG_LOG("AddCameraMetadataItem end");
313 return CAM_META_SUCCESS;
314 }
315
GetCameraMetadataItem(const common_metadata_header_t * src,uint32_t index,camera_metadata_item_t * item)316 int GetCameraMetadataItem(const common_metadata_header_t *src, uint32_t index, camera_metadata_item_t *item)
317 {
318 METADATA_DEBUG_LOG("GetCameraMetadataItem start");
319 if (src == nullptr || item == nullptr) {
320 METADATA_ERR_LOG("GetCameraMetadataItem src or item is null");
321 return CAM_META_INVALID_PARAM;
322 }
323
324 int32_t ret = memset_s(item, sizeof(camera_metadata_item_t), 0, sizeof(camera_metadata_item_t));
325 if (ret != EOK) {
326 METADATA_ERR_LOG("GetCameraMetadataItem: memset_s failed");
327 return CAM_META_FAILURE;
328 }
329 if (index >= src->item_count) {
330 METADATA_ERR_LOG("GetCameraMetadataItem index is greater than item count");
331 return CAM_META_INVALID_PARAM;
332 }
333
334 camera_metadata_item_entry_t *localItem = GetMetadataItems(src) + index;
335
336 item->index = index;
337 item->item = localItem->item;
338 item->data_type = localItem->data_type;
339 item->count = localItem->count;
340
341 size_t dataBytes = CalculateCameraMetadataItemDataSize(localItem->data_type, localItem->count);
342 if (dataBytes == 0) {
343 item->data.u8 = localItem->data.value;
344 } else {
345 item->data.u8 = GetMetadataData(src) + localItem->data.offset;
346 }
347
348 METADATA_DEBUG_LOG("GetCameraMetadataItem end");
349 return CAM_META_SUCCESS;
350 }
351
FindCameraMetadataItemIndex(const common_metadata_header_t * src,uint32_t item,uint32_t * idx)352 int FindCameraMetadataItemIndex(const common_metadata_header_t *src, uint32_t item, uint32_t *idx)
353 {
354 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex start");
355 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex item: %{public}u", item);
356 if (src == nullptr || idx == nullptr) {
357 METADATA_ERR_LOG("FindCameraMetadataItemIndex src or index is null");
358 return CAM_META_INVALID_PARAM;
359 }
360
361 camera_metadata_item_entry_t *searchItem = GetMetadataItems(src);
362 uint32_t index;
363 for (index = 0; index < src->item_count; index++, searchItem++) {
364 if (searchItem->item == item) {
365 break;
366 }
367 }
368
369 if (index == src->item_count) {
370 METADATA_ERR_LOG("FindCameraMetadataItemIndex item: %{public}u not found", item);
371 return CAM_META_ITEM_NOT_FOUND;
372 }
373
374 *idx = index;
375 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex index: %{public}u", index);
376 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex end");
377 return CAM_META_SUCCESS;
378 }
379
FindCameraMetadataItem(const common_metadata_header_t * src,uint32_t item,camera_metadata_item_t * metadataItem)380 int FindCameraMetadataItem(const common_metadata_header_t *src, uint32_t item, camera_metadata_item_t *metadataItem)
381 {
382 uint32_t index = 0;
383 const char *name = GetCameraMetadataItemName(item);
384 if (name == nullptr) {
385 name = "<unknown>";
386 }
387 METADATA_DEBUG_LOG("FindCameraMetadataItem item id: %{public}u, name: %{public}s", item, name);
388 int ret = FindCameraMetadataItemIndex(src, item, &index);
389 if (ret != CAM_META_SUCCESS) {
390 return ret;
391 }
392
393 return GetCameraMetadataItem(src, index, metadataItem);
394 }
395
SetOffset(camera_metadata_item_entry_t * metadataItems,camera_metadata_item_entry_t * item,size_t oldItemSize)396 void SetOffset(camera_metadata_item_entry_t *metadataItems, camera_metadata_item_entry_t *item, size_t oldItemSize)
397 {
398 if (CalculateCameraMetadataItemDataSize(metadataItems->data_type, metadataItems->count) > 0 &&
399 metadataItems->data.offset > item->data.offset) {
400 metadataItems->data.offset -= oldItemSize;
401 }
402 }
403
MetadataExpandItemMem(common_metadata_header_t * dst,camera_metadata_item_entry_t * item,size_t oldItemSize)404 int MetadataExpandItemMem(common_metadata_header_t *dst, camera_metadata_item_entry_t *item,
405 size_t oldItemSize)
406 {
407 if (item == nullptr || dst == nullptr) {
408 METADATA_ERR_LOG("MetadataExpandItemMem item is null or dst is null");
409 return CAM_META_INVALID_PARAM;
410 }
411 uint8_t *start = GetMetadataData(dst) + item->data.offset;
412 uint8_t *end = start + oldItemSize;
413 size_t length = dst->data_count - item->data.offset - oldItemSize;
414 if (length != 0) {
415 int32_t ret = memmove_s(start, length, end, length);
416 if (ret != EOK) {
417 METADATA_ERR_LOG("MetadataExpandItemMem memory move failed");
418 return CAM_META_FAILURE;
419 }
420 }
421 dst->data_count -= oldItemSize;
422
423 camera_metadata_item_entry_t *metadataItems = GetMetadataItems(dst);
424 for (uint32_t i = 0; i < dst->item_count; i++, ++metadataItems) {
425 SetOffset(metadataItems, item, oldItemSize);
426 }
427
428 return CAM_META_SUCCESS;
429 }
430
UpdateCameraMetadataItemByIndex(common_metadata_header_t * dst,uint32_t index,const void * data,uint32_t dataCount,camera_metadata_item_t * updatedItem)431 int UpdateCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index, const void *data, uint32_t dataCount,
432 camera_metadata_item_t *updatedItem)
433 {
434 METADATA_DEBUG_LOG("UpdateCameraMetadataItemByIndex start");
435 if ((dst == nullptr) || (index >= dst->item_count)) {
436 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex dst is null or invalid index");
437 return CAM_META_INVALID_PARAM;
438 }
439
440 if (!dataCount || data == nullptr) {
441 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex data is not valid. "
442 "dataCount: %{public}u", dataCount);
443 return CAM_META_INVALID_PARAM;
444 }
445
446 int32_t ret = CAM_META_SUCCESS;
447 camera_metadata_item_entry_t *item = GetMetadataItems(dst) + index;
448 size_t dataSize = CalculateCameraMetadataItemDataSize(item->data_type, dataCount);
449 size_t dataPayloadSize = dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[item->data_type];
450
451 size_t oldItemSize = CalculateCameraMetadataItemDataSize(item->data_type, item->count);
452 if (dataSize != oldItemSize) {
453 if (dst->data_capacity < (dst->data_count + dataSize - oldItemSize)) {
454 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex data_capacity limit reached");
455 return CAM_META_DATA_CAP_EXCEED;
456 }
457
458 if (oldItemSize != 0) {
459 ret = MetadataExpandItemMem(dst, item, oldItemSize);
460 if (ret != CAM_META_SUCCESS) {
461 return ret;
462 }
463 }
464
465 if (dataSize != 0) {
466 item->data.offset = dst->data_count;
467 ret = memcpy_s(GetMetadataData(dst) + item->data.offset, dataPayloadSize, data, dataPayloadSize);
468 if (ret != EOK) {
469 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex memory copy failed");
470 return CAM_META_FAILURE;
471 }
472 dst->data_count += dataSize;
473 }
474 } else if (dataSize != 0) {
475 ret = memcpy_s(GetMetadataData(dst) + item->data.offset, dataPayloadSize, data, dataPayloadSize);
476 if (ret != EOK) {
477 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex memory copy failed");
478 return CAM_META_FAILURE;
479 }
480 }
481
482 if (dataSize == 0) {
483 ret = memcpy_s(item->data.value, dataPayloadSize, data, dataPayloadSize);
484 if (ret != EOK) {
485 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex memory copy failed");
486 return CAM_META_FAILURE;
487 }
488 }
489
490 item->count = dataCount;
491 if (updatedItem != nullptr) {
492 ret = GetCameraMetadataItem(dst, index, updatedItem);
493 if (ret != CAM_META_SUCCESS) {
494 return ret;
495 }
496 }
497
498 METADATA_DEBUG_LOG("UpdateCameraMetadataItemByIndex end");
499 return CAM_META_SUCCESS;
500 }
501
UpdateCameraMetadataItem(common_metadata_header_t * dst,uint32_t item,const void * data,uint32_t dataCount,camera_metadata_item_t * updatedItem)502 int UpdateCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data,
503 uint32_t dataCount, camera_metadata_item_t *updatedItem)
504 {
505 METADATA_DEBUG_LOG("UpdateCameraMetadataItem item id: %{public}u, dataCount: %{public}u", item, dataCount);
506 const char *name = GetCameraMetadataItemName(item);
507 if (name == nullptr) {
508 name = "<unknown>";
509 }
510 METADATA_DEBUG_LOG("UpdateCameraMetadataItem item id: %{public}u, name: %{public}s, "
511 "dataCount: %{public}u", item, name, dataCount);
512 if (!dataCount || data == nullptr) {
513 METADATA_ERR_LOG("UpdateCameraMetadataItem data is not valid. item: %{public}u, "
514 "dataCount: %{public}u", item, dataCount);
515 return CAM_META_INVALID_PARAM;
516 }
517
518 uint32_t index = 0;
519 int32_t ret = FindCameraMetadataItemIndex(dst, item, &index);
520 if (ret != CAM_META_SUCCESS) {
521 return ret;
522 }
523
524 return UpdateCameraMetadataItemByIndex(dst, index, data, dataCount, updatedItem);
525 }
526
DeleteCameraMetadataItemByIndex(common_metadata_header_t * dst,uint32_t index)527 int DeleteCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index)
528 {
529 METADATA_DEBUG_LOG("DeleteCameraMetadataItemByIndex start");
530 if (dst == nullptr) {
531 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex dst is null");
532 return CAM_META_INVALID_PARAM;
533 }
534
535 if (index >= dst->item_count) {
536 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex item not valid");
537 return CAM_META_INVALID_PARAM;
538 }
539
540 int32_t ret = CAM_META_SUCCESS;
541 camera_metadata_item_entry_t *itemToDelete = GetMetadataItems(dst) + index;
542 size_t dataBytes = CalculateCameraMetadataItemDataSize(itemToDelete->data_type, itemToDelete->count);
543 if (dataBytes > 0) {
544 uint8_t *start = GetMetadataData(dst) + itemToDelete->data.offset;
545 uint8_t *end = start + dataBytes;
546 size_t length = dst->data_count - itemToDelete->data.offset - dataBytes;
547 if (length != 0) {
548 ret = memmove_s(start, length, end, length);
549 if (ret != EOK) {
550 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex memory move failed");
551 return CAM_META_FAILURE;
552 }
553 }
554 dst->data_count -= dataBytes;
555
556 camera_metadata_item_entry_t *metadataItems = GetMetadataItems(dst);
557 for (uint32_t i = 0; i < dst->item_count; i++, ++metadataItems) {
558 if (CalculateCameraMetadataItemDataSize(
559 metadataItems->data_type, metadataItems->count) > 0 &&
560 metadataItems->data.offset > itemToDelete->data.offset) {
561 metadataItems->data.offset -= dataBytes;
562 }
563 }
564 }
565
566 uint64_t length = sizeof(camera_metadata_item_entry_t) * (dst->item_count - index - 1);
567 if (length != 0) {
568 ret = memmove_s(itemToDelete, length, itemToDelete + 1, length);
569 if (ret != EOK) {
570 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex memory move failed");
571 return CAM_META_FAILURE;
572 }
573 }
574 dst->item_count -= 1;
575 METADATA_DEBUG_LOG("DeleteCameraMetadataItemByIndex end");
576 return CAM_META_SUCCESS;
577 }
578
DeleteCameraMetadataItem(common_metadata_header_t * dst,uint32_t item)579 int DeleteCameraMetadataItem(common_metadata_header_t *dst, uint32_t item)
580 {
581 METADATA_DEBUG_LOG("DeleteCameraMetadataItem item: %{public}u", item);
582 uint32_t index = 0;
583 int32_t ret = FindCameraMetadataItemIndex(dst, item, &index);
584 if (ret != CAM_META_SUCCESS) {
585 return ret;
586 }
587
588 return DeleteCameraMetadataItemByIndex(dst, index);
589 }
590
FreeCameraMetadataBuffer(common_metadata_header_t * dst)591 void FreeCameraMetadataBuffer(common_metadata_header_t *dst)
592 {
593 if (dst != nullptr) {
594 free(dst);
595 }
596 }
597
GetCameraMetadataItemCount(const common_metadata_header_t * metadataHeader)598 uint32_t GetCameraMetadataItemCount(const common_metadata_header_t *metadataHeader)
599 {
600 if (!metadataHeader) {
601 METADATA_ERR_LOG("GetCameraMetadataItemCount::metadataHeader is null");
602 return 0;
603 }
604 return metadataHeader->item_count;
605 }
606
GetCameraMetadataItemCapacity(const common_metadata_header_t * metadataHeader)607 uint32_t GetCameraMetadataItemCapacity(const common_metadata_header_t *metadataHeader)
608 {
609 if (!metadataHeader) {
610 METADATA_ERR_LOG("GetCameraMetadataItemCapacity::metadataHeader is null");
611 return 0;
612 }
613 return metadataHeader->item_capacity;
614 }
615
GetCameraMetadataDataSize(const common_metadata_header_t * metadataHeader)616 uint32_t GetCameraMetadataDataSize(const common_metadata_header_t *metadataHeader)
617 {
618 if (metadataHeader == nullptr) {
619 METADATA_ERR_LOG("GetCameraMetadataDataSize::metadataHeader is null");
620 return 0;
621 }
622 return metadataHeader->data_capacity;
623 }
624
CopyCameraMetadataItems(common_metadata_header_t * newMetadata,const common_metadata_header_t * oldMetadata)625 int32_t CopyCameraMetadataItems(common_metadata_header_t *newMetadata, const common_metadata_header_t *oldMetadata)
626 {
627 if (newMetadata == nullptr || oldMetadata == nullptr) {
628 return CAM_META_INVALID_PARAM;
629 }
630
631 int32_t ret;
632 if (oldMetadata->item_count != 0) {
633 ret = memcpy_s(GetMetadataItems(newMetadata), sizeof(camera_metadata_item_entry_t[oldMetadata->item_count]),
634 GetMetadataItems(oldMetadata), sizeof(camera_metadata_item_entry_t[oldMetadata->item_count]));
635 if (ret != EOK) {
636 METADATA_ERR_LOG("CopyCameraMetadataItems memory copy failed");
637 return CAM_META_FAILURE;
638 }
639 }
640
641 if (oldMetadata->data_count != 0) {
642 ret = memcpy_s(GetMetadataData(newMetadata), sizeof(uint8_t[oldMetadata->data_count]),
643 GetMetadataData(oldMetadata), sizeof(uint8_t[oldMetadata->data_count]));
644 if (ret != EOK) {
645 METADATA_ERR_LOG("CopyCameraMetadataItems memory copy failed");
646 return CAM_META_FAILURE;
647 }
648 }
649
650 newMetadata->item_count = oldMetadata->item_count;
651 newMetadata->data_count = oldMetadata->data_count;
652
653 return CAM_META_SUCCESS;
654 }
655 } // Camera
656
657