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