• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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, &section);
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, &section);
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