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, §ion);
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, §ion);
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