1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "camera_metadata_info.h"
17 #include <securec.h>
18 #include "metadata_log.h"
19 #include <dlfcn.h>
20 #include <memory>
21 #include <vector>
22 #include <map>
23 #include "camera_metadata_item_info.h"
24 #include "camera_vendor_tag.h"
25
26 namespace OHOS::Camera {
27 static CameraVendorTag* g_vendorTagImpl = nullptr;
28 const char* g_exampleVendorTagLib = "libcamera_example_vendor_tag_impl.z.so";
29 const char* g_vendorTagLib = "libcamera_vendor_tag_impl.z.so";
30 const int METADATA_HEADER_DATA_SIZE = 4;
31 const std::vector<uint32_t> g_metadataTags = {
32 OHOS_ABILITY_CAMERA_POSITION,
33 OHOS_ABILITY_CAMERA_TYPE,
34 OHOS_ABILITY_CAMERA_CONNECTION_TYPE,
35 OHOS_ABILITY_MEMORY_TYPE,
36 OHOS_ABILITY_FPS_RANGES,
37 OHOS_ABILITY_FLASH_AVAILABLE,
38 OHOS_CAMERA_STREAM_ID,
39 OHOS_ABILITY_SKETCH_ENABLE_RATIO,
40 OHOS_ABILITY_SKETCH_REFERENCE_FOV_RATIO,
41 OHOS_ABILITY_AVAILABLE_COLOR_SPACES,
42
43 OHOS_SENSOR_EXPOSURE_TIME,
44 OHOS_SENSOR_COLOR_CORRECTION_GAINS,
45 OHOS_SENSOR_ORIENTATION,
46 OHOS_ABILITY_MUTE_MODES,
47 OHOS_CONTROL_MUTE_MODE,
48
49 OHOS_SENSOR_INFO_ACTIVE_ARRAY_SIZE,
50 OHOS_SENSOR_INFO_SENSITIVITY_RANGE,
51 OHOS_SENSOR_INFO_MAX_FRAME_DURATION,
52 OHOS_SENSOR_INFO_PHYSICAL_SIZE,
53 OHOS_SENSOR_INFO_PIXEL_ARRAY_SIZE,
54 OHOS_SENSOR_INFO_TIMESTAMP,
55
56 OHOS_STATISTICS_FACE_DETECT_MODE,
57 OHOS_STATISTICS_FACE_DETECT_SWITCH,
58 OHOS_STATISTICS_FACE_DETECT_MAX_NUM,
59 OHOS_STATISTICS_HISTOGRAM_MODE,
60 OHOS_STATISTICS_FACE_IDS,
61 OHOS_STATISTICS_FACE_LANDMARKS,
62 OHOS_STATISTICS_FACE_RECTANGLES,
63 OHOS_STATISTICS_FACE_SCORES,
64
65 OHOS_CONTROL_AE_ANTIBANDING_MODE,
66 OHOS_CONTROL_AE_EXPOSURE_COMPENSATION,
67 OHOS_CONTROL_AE_LOCK,
68 OHOS_CONTROL_AE_MODE,
69 OHOS_CONTROL_AE_REGIONS,
70 OHOS_CONTROL_AE_TARGET_FPS_RANGE,
71 OHOS_CONTROL_FPS_RANGES,
72 OHOS_CONTROL_AF_MODE,
73 OHOS_CONTROL_AF_REGIONS,
74 OHOS_CONTROL_AF_TRIGGER,
75 OHOS_CONTROL_AF_TRIGGER_ID,
76 OHOS_CONTROL_AF_STATE,
77 OHOS_CONTROL_AWB_LOCK,
78 OHOS_CONTROL_AWB_MODE,
79 OHOS_CONTROL_AWB_REGIONS,
80 OHOS_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES,
81 OHOS_CONTROL_AE_AVAILABLE_MODES,
82 OHOS_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES,
83 OHOS_CONTROL_AE_COMPENSATION_RANGE,
84 OHOS_CONTROL_AE_COMPENSATION_STEP,
85 OHOS_CONTROL_AF_AVAILABLE_MODES,
86 OHOS_CONTROL_AWB_AVAILABLE_MODES,
87 OHOS_CONTROL_CAPTURE_MIRROR_SUPPORTED,
88 OHOS_CONTROL_CAPTURE_MIRROR,
89 OHOS_CONTROL_FOCUS_STATE,
90 OHOS_CONTROL_METER_POINT,
91 OHOS_CONTROL_METER_MODE,
92 OHOS_CONTROL_EXPOSURE_STATE,
93
94 // Camera device image acquisition related
95 OHOS_ABILITY_DEVICE_AVAILABLE_EXPOSUREMODES,
96 OHOS_CONTROL_EXPOSUREMODE,
97 OHOS_ABILITY_EXPOSURE_MODES,
98 OHOS_CONTROL_EXPOSURE_MODE,
99 OHOS_ABILITY_METER_MODES,
100
101 OHOS_ABILITY_DEVICE_AVAILABLE_FOCUSMODES,
102 OHOS_CONTROL_FOCUSMODE,
103 OHOS_ABILITY_FOCUS_MODES,
104 OHOS_CONTROL_FOCUS_MODE,
105 OHOS_ABILITY_FOCAL_LENGTH,
106
107 OHOS_ABILITY_DEVICE_AVAILABLE_FLASHMODES,
108 OHOS_CONTROL_FLASHMODE,
109 OHOS_ABILITY_FLASH_MODES,
110 OHOS_CONTROL_FLASH_MODE,
111 OHOS_CONTROL_FLASH_STATE,
112
113 OHOS_ABILITY_ZOOM_RATIO_RANGE,
114 OHOS_CONTROL_ZOOM_RATIO,
115 OHOS_CONTROL_ZOOM_CROP_REGION,
116 OHOS_ABILITY_ZOOM_CAP,
117 OHOS_ABILITY_SCENE_ZOOM_CAP,
118 OHOS_STATUS_CAMERA_CURRENT_ZOOM_RATIO,
119 OHOS_CONTROL_SMOOTH_ZOOM_RATIOS,
120 OHOS_CONTROL_PREPARE_ZOOM,
121 OHOS_ABILITY_CAMERA_ZOOM_PERFORMANCE,
122
123 // Camera flow control related
124 OHOS_ABILITY_STREAM_AVAILABLE_BASIC_CONFIGURATIONS,
125 OHOS_STREAM_AVAILABLE_FORMATS,
126 OHOS_ABILITY_STREAM_AVAILABLE_EXTEND_CONFIGURATIONS,
127
128 OHOS_JPEG_GPS_COORDINATES,
129 OHOS_JPEG_GPS_PROCESSING_METHOD,
130 OHOS_JPEG_GPS_TIMESTAMP,
131 OHOS_JPEG_ORIENTATION,
132 OHOS_JPEG_QUALITY,
133 OHOS_JPEG_THUMBNAIL_QUALITY,
134 OHOS_JPEG_THUMBNAIL_SIZE,
135 OHOS_JPEG_AVAILABLE_THUMBNAIL_SIZES,
136 OHOS_JPEG_MAX_SIZE,
137 OHOS_JPEG_SIZE,
138
139 OHOS_ABILITY_VIDEO_STABILIZATION_MODES,
140 OHOS_CONTROL_VIDEO_STABILIZATION_MODE,
141
142 // camera effects & algorithms
143 OHOS_ABILITY_SCENE_FILTER_TYPES,
144 OHOS_CONTROL_FILTER_TYPE,
145 OHOS_ABILITY_SCENE_PORTRAIT_EFFECT_TYPES,
146 OHOS_CONTROL_PORTRAIT_EFFECT_TYPE,
147 OHOS_ABILITY_SCENE_BEAUTY_TYPES,
148 OHOS_CONTROL_BEAUTY_TYPE,
149 OHOS_ABILITY_BEAUTY_AUTO_VALUES,
150 OHOS_CONTROL_BEAUTY_AUTO_VALUE,
151 OHOS_ABILITY_BEAUTY_FACE_SLENDER_VALUES,
152 OHOS_CONTROL_BEAUTY_FACE_SLENDER_VALUE,
153 OHOS_ABILITY_BEAUTY_SKIN_TONE_VALUES,
154 OHOS_CONTROL_BEAUTY_SKIN_TONE_VALUE,
155 OHOS_ABILITY_BEAUTY_SKIN_SMOOTH_VALUES,
156 OHOS_CONTROL_BEAUTY_SKIN_SMOOTH_VALUE,
157 OHOS_ABILITY_CAMERA_MACRO_SUPPORTED,
158 OHOS_CAMERA_MACRO_STATUS,
159 OHOS_CONTROL_CAMERA_MACRO,
160 OHOS_ABILITY_CAMERA_VIRTUAL_APERTURE_RANGE,
161 OHOS_CONTROL_CAMERA_VIRTUAL_APERTURE_VALUE,
162 OHOS_ABILITY_CAMERA_PHYSICAL_APERTURE_RANGE,
163 OHOS_CONTROL_CAMERA_PHYSICAL_APERTURE_VALUE,
164 OHOS_DEVICE_EXITCAMERA_EVENT,
165
166 // camera secure related
167 OHOS_CONTROL_SECURE_FACE_MODE,
168 OHOS_CONTROL_SECURE_FACE_INFO,
169 OHOS_CONTROL_SECURE_FACE_AUTH_RESULT,
170 OHOS_CONTROL_SECURE_FLASH_SEQ,
171 OHOS_CONTROL_SECURE_IR_LED_SWITCH,
172 OHOS_CONTROL_SECURE_IR_LOCKAE_SWITCH,
173
174 //XMAGE MODES
175 OHOS_ABILITY_SUPPORTED_COLOR_MODES,
176 OHOS_CONTROL_SUPPORTED_COLOR_MODES,
177 };
178
179 std::map<uint32_t, uint32_t> g_metadataSectionMap = {
180 {OHOS_CAMERA_PROPERTIES, OHOS_SECTION_CAMERA_PROPERTIES},
181 {OHOS_CAMERA_SENSOR, OHOS_SECTION_CAMERA_SENSOR},
182 {OHOS_CAMERA_SENSOR_INFO, OHOS_SECTION_CAMERA_SENSOR_INFO},
183 {OHOS_CAMERA_STATISTICS, OHOS_SECTION_CAMERA_STATISTICS},
184 {OHOS_DEVICE_CONTROL, OHOS_SECTION_CAMERA_CONTROL},
185 {OHOS_DEVICE_EXPOSURE, OHOS_SECTION_DEVICE_EXPOSURE},
186 {OHOS_DEVICE_FOCUS, OHOS_SECTION_DEVICE_FOCUS},
187 {OHOS_DEVICE_WHITE_BLANCE, OHOS_SECTION_DEVICE_WHITE},
188 {OHOS_DEVICE_FLASH, OHOS_SECTION_DEVICE_FLASH},
189 {OHOS_DEVICE_ZOOM, OHOS_SECTION_DEVICE_ZOOM},
190 {OHOS_STREAM_ABILITY, OHOS_SECTION_STREAM_ABILITY},
191 {OHOS_STREAM_JPEG, OHOS_SECTION_STREAM_JPEG},
192 {OHOS_STREAM_VIDEO, OHOS_SECTION_STREAM_VIDEO},
193 {OHOS_CAMERA_EFFECT, OHOS_SECTION_CAMERA_EFFECT},
194 {OHOS_CAMERA_SECURE, OHOS_SECTION_CAMERA_SECURE},
195 {OHOS_XMAGE_COLOR_ABILITY, OHOS_SECTION_CAMERA_XMAGE}
196 };
197
CameraMetadata(size_t itemCapacity,size_t dataCapacity)198 CameraMetadata::CameraMetadata(size_t itemCapacity, size_t dataCapacity)
199 {
200 metadata_ = AllocateCameraMetadataBuffer(itemCapacity, AlignTo(dataCapacity, DATA_ALIGNMENT));
201 }
202
~CameraMetadata()203 CameraMetadata::~CameraMetadata()
204 {
205 if (metadata_) {
206 FreeCameraMetadataBuffer(metadata_);
207 metadata_ = nullptr;
208 }
209 }
210
addEntry(uint32_t item,const void * data,size_t data_count)211 bool CameraMetadata::addEntry(uint32_t item, const void *data, size_t data_count)
212 {
213 if (metadata_ == nullptr) {
214 METADATA_ERR_LOG("metadata_ is null");
215 return false;
216 }
217
218 auto result = AddCameraMetadataItem(metadata_, item, data, data_count);
219 if (!result) {
220 return true;
221 }
222
223 if (result != CAM_META_ITEM_CAP_EXCEED && result != CAM_META_DATA_CAP_EXCEED) {
224 const char *name = GetCameraMetadataItemName(item);
225
226 if (name) {
227 METADATA_ERR_LOG("Failed to add tag. tagname = %{public}s", name);
228 } else {
229 METADATA_ERR_LOG("Failed to add unknown tag");
230 }
231 return false;
232 }
233
234 return resize_add_metadata(item, data, data_count);
235 }
236
resize_add_metadata(uint32_t item,const void * data,size_t data_count)237 bool CameraMetadata::resize_add_metadata(uint32_t item, const void *data, size_t data_count)
238 {
239 uint32_t data_type;
240
241 auto itemCapacity = GetCameraMetadataItemCapacity(metadata_);
242 auto data_capacity = GetCameraMetadataDataSize(metadata_);
243
244 int32_t ret = GetCameraMetadataItemType(item, &data_type);
245 if (ret != CAM_META_SUCCESS) {
246 METADATA_ERR_LOG("GetCameraMetadataItemType invalid item type");
247 return false;
248 }
249 size_t size = CalculateCameraMetadataItemDataSize(data_type, data_count);
250
251 common_metadata_header_t *newMetadata = AllocateCameraMetadataBuffer((itemCapacity + 1) * INDEX_COUNTER,
252 AlignTo((data_capacity + size) * INDEX_COUNTER, DATA_ALIGNMENT));
253
254 if (newMetadata == nullptr) {
255 METADATA_ERR_LOG("Failed to resize the metadata buffer");
256 return false;
257 }
258
259 auto result = CopyCameraMetadataItems(newMetadata, metadata_);
260 if (result != CAM_META_SUCCESS) {
261 METADATA_ERR_LOG("Failed to copy the old metadata to new metadata");
262 FreeCameraMetadataBuffer(newMetadata);
263 return false;
264 }
265
266 result = AddCameraMetadataItem(newMetadata, item, data, data_count);
267 if (result != CAM_META_SUCCESS) {
268 METADATA_ERR_LOG("Failed to add new entry");
269 FreeCameraMetadataBuffer(newMetadata);
270 return false;
271 }
272 replace_metadata(newMetadata);
273
274 return true;
275 }
276
replace_metadata(common_metadata_header_t * newMetadata)277 void CameraMetadata::replace_metadata(common_metadata_header_t *newMetadata)
278 {
279 if (metadata_ == newMetadata) {
280 return;
281 }
282
283 FreeCameraMetadataBuffer(metadata_);
284 metadata_ = newMetadata;
285 }
286
updateEntry(uint32_t tag,const void * data,size_t dataCount)287 bool CameraMetadata::updateEntry(uint32_t tag, const void *data, size_t dataCount)
288 {
289 if (metadata_ == nullptr) {
290 METADATA_ERR_LOG("metadata_ is null");
291 return false;
292 }
293
294 const char *name = GetCameraMetadataItemName(tag);
295 (void)name;
296 camera_metadata_item_t item;
297 int ret = FindCameraMetadataItem(metadata_, tag, &item);
298 if (ret) {
299 METADATA_ERR_LOG("Failed to update tag tagname = %{public}s : not present", (name ? name : "<unknown>"));
300 return false;
301 }
302 METADATA_INFO_LOG("updateEntry item id: %{public}d, name: %{public}s, "
303 "dataCount: %{public}zu", tag, name ? name : "<unknown>", dataCount);
304 ret = UpdateCameraMetadataItemByIndex(metadata_, item.index, data, dataCount, nullptr);
305 if (ret) {
306 const char *name_ = GetCameraMetadataItemName(tag);
307 (void)name_;
308 METADATA_ERR_LOG("Failed to update tag tagname = %{public}s", (name_ ? name_ : "<unknown>"));
309 return false;
310 }
311
312 return true;
313 }
314
get()315 common_metadata_header_t *CameraMetadata::get()
316 {
317 return metadata_;
318 }
319
get() const320 const common_metadata_header_t *CameraMetadata::get() const
321 {
322 return metadata_;
323 }
324
isValid() const325 bool CameraMetadata::isValid() const
326 {
327 return metadata_ != nullptr;
328 }
329
AlignTo(uint32_t val,uint32_t alignment)330 uint32_t CameraMetadata::AlignTo(uint32_t val, uint32_t alignment)
331 {
332 return static_cast<uint32_t>((static_cast<uintptr_t>(val) + ((alignment) - 1)) & ~((alignment) - 1));
333 }
334
MaxAlignment(uint32_t dataAlignment,uint32_t metadataAlignment)335 uint32_t CameraMetadata::MaxAlignment(uint32_t dataAlignment, uint32_t metadataAlignment)
336 {
337 return ((dataAlignment > metadataAlignment) ? dataAlignment : metadataAlignment);
338 }
339
GetMetadataData(const common_metadata_header_t * metadataHeader)340 uint8_t *CameraMetadata::GetMetadataData(const common_metadata_header_t *metadataHeader)
341 {
342 if (!metadataHeader) {
343 METADATA_ERR_LOG("GetMetadataData metadataHeader is null");
344 return nullptr;
345 }
346 return (uint8_t *)metadataHeader + metadataHeader->data_start;
347 }
348
GetMetadataItems(const common_metadata_header_t * metadataHeader)349 camera_metadata_item_entry_t *CameraMetadata::GetMetadataItems(const common_metadata_header_t *metadataHeader)
350 {
351 return reinterpret_cast<camera_metadata_item_entry_t *>(
352 (reinterpret_cast<uint8_t *>(const_cast<common_metadata_header_t *>(metadataHeader)) +
353 metadataHeader->items_start));
354 }
355
FillCameraMetadata(common_metadata_header_t * buffer,size_t memoryRequired,uint32_t itemCapacity,uint32_t dataCapacity)356 common_metadata_header_t *CameraMetadata::FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired,
357 uint32_t itemCapacity, uint32_t dataCapacity)
358 {
359 METADATA_DEBUG_LOG("FillCameraMetadata start");
360 if (buffer == nullptr) {
361 METADATA_ERR_LOG("FillCameraMetadata buffer is null");
362 return nullptr;
363 }
364
365 common_metadata_header_t *metadataHeader = static_cast<common_metadata_header_t *>(buffer);
366 metadataHeader->version = CURRENT_CAMERA_METADATA_VERSION;
367 metadataHeader->size = memoryRequired;
368 metadataHeader->item_count = 0;
369 metadataHeader->item_capacity = itemCapacity;
370 metadataHeader->items_start = AlignTo(sizeof(common_metadata_header_t), ITEM_ALIGNMENT);
371 metadataHeader->data_count = 0;
372 metadataHeader->data_capacity = dataCapacity;
373 size_t dataUnaligned = reinterpret_cast<uint8_t *>(GetMetadataItems(metadataHeader) +
374 metadataHeader->item_capacity) - reinterpret_cast<uint8_t *>(metadataHeader);
375 metadataHeader->data_start = AlignTo(dataUnaligned, DATA_ALIGNMENT);
376
377 METADATA_DEBUG_LOG("FillCameraMetadata end");
378 return metadataHeader;
379 }
380
CalculateCameraMetadataMemoryRequired(uint32_t itemCount,uint32_t dataCount)381 size_t CameraMetadata::CalculateCameraMetadataMemoryRequired(uint32_t itemCount, uint32_t dataCount)
382 {
383 METADATA_DEBUG_LOG("CalculateCameraMetadataMemoryRequired start");
384 size_t memoryRequired = sizeof(common_metadata_header_t);
385 memoryRequired = CameraMetadata::AlignTo(memoryRequired, ITEM_ALIGNMENT);
386
387 memoryRequired += sizeof(camera_metadata_item_entry_t[itemCount]);
388 memoryRequired = CameraMetadata::AlignTo(memoryRequired, DATA_ALIGNMENT);
389
390 memoryRequired += sizeof(uint8_t[dataCount]);
391 memoryRequired = CameraMetadata::AlignTo(memoryRequired, METADATA_PACKET_ALIGNMENT);
392
393 METADATA_DEBUG_LOG("CalculateCameraMetadataMemoryRequired memoryRequired: %{public}zu", memoryRequired);
394 METADATA_DEBUG_LOG("CalculateCameraMetadataMemoryRequired end");
395 return memoryRequired;
396 }
397
AllocateCameraMetadataBuffer(uint32_t item_capacity,uint32_t data_capacity)398 common_metadata_header_t *CameraMetadata::AllocateCameraMetadataBuffer(uint32_t item_capacity, uint32_t data_capacity)
399 {
400 METADATA_DEBUG_LOG("AllocateCameraMetadataBuffer start");
401 METADATA_DEBUG_LOG("AllocateCameraMetadataBuffer item_capacity: %{public}u, data_capacity: %{public}u",
402 item_capacity, data_capacity);
403 size_t memoryRequired = CalculateCameraMetadataMemoryRequired(item_capacity, data_capacity);
404 void *buffer = calloc(1, memoryRequired);
405 if (buffer == nullptr) {
406 METADATA_ERR_LOG("AllocateCameraMetadataBuffer memory allocation failed");
407 return reinterpret_cast<common_metadata_header_t *>(buffer);
408 }
409
410 common_metadata_header_t *metadataHeader = FillCameraMetadata(reinterpret_cast<common_metadata_header_t *>(buffer),
411 memoryRequired, item_capacity, data_capacity);
412 if (metadataHeader == nullptr) {
413 METADATA_ERR_LOG("AllocateCameraMetadataBuffer metadataHeader is null");
414 free(buffer);
415 }
416
417 METADATA_DEBUG_LOG("AllocateCameraMetadataBuffer end");
418 return metadataHeader;
419 }
420
421 // Load vendor tag impl
LoadVendorTagImpl()422 int32_t LoadVendorTagImpl()
423 {
424 if (g_vendorTagImpl == nullptr) {
425 void* libHandle = nullptr;
426 #ifndef CAMERA_VENDOR_TAG
427 libHandle = dlopen(g_exampleVendorTagLib, RTLD_LAZY);
428 #else
429 libHandle = dlopen(g_vendorTagLib, RTLD_LAZY);
430 #endif
431 if (libHandle == nullptr) {
432 METADATA_ERR_LOG("dlopen failed %{public}s", __func__);
433 return CAM_META_FAILURE;
434 }
435
436 CreateCameraVendorTag* createVendorTag =
437 reinterpret_cast<CreateCameraVendorTag*>(dlsym(libHandle, "CreateVendorTagImpl"));
438 if (createVendorTag == nullptr) {
439 METADATA_ERR_LOG("CreateCameraVendorTag failed %{public}s", __func__);
440 dlclose(libHandle);
441 return CAM_META_FAILURE;
442 }
443
444 g_vendorTagImpl = createVendorTag();
445 if (g_vendorTagImpl == nullptr) {
446 METADATA_ERR_LOG("createVendorTag failed %{public}s", __func__);
447 dlclose(libHandle);
448 return CAM_META_FAILURE;
449 }
450 }
451
452 return CAM_META_SUCCESS;
453 }
454
GetMetadataSection(uint32_t itemSection,uint32_t * section)455 int32_t CameraMetadata::GetMetadataSection(uint32_t itemSection, uint32_t *section)
456 {
457 METADATA_DEBUG_LOG("GetMetadataSection start");
458 if (itemSection < OHOS_CAMERA_PROPERTIES ||
459 itemSection >= OHOS_ABILITY_SECTION_END) {
460 METADATA_ERR_LOG("GetMetadataSection itemSection is not valid");
461 return CAM_META_FAILURE;
462 }
463
464 int32_t ret = CAM_META_SUCCESS;
465 auto iter = g_metadataSectionMap.find(itemSection);
466 if (iter != g_metadataSectionMap.end()) {
467 *section = iter->second;
468 } else {
469 METADATA_ERR_LOG("GetMetadataSection item section is not defined");
470 ret = CAM_META_FAILURE;
471 }
472
473 METADATA_DEBUG_LOG("GetMetadataSection end");
474 return ret;
475 }
476
GetCameraMetadataItemType(uint32_t item,uint32_t * dataType)477 int32_t CameraMetadata::GetCameraMetadataItemType(uint32_t item, uint32_t *dataType)
478 {
479 METADATA_DEBUG_LOG("GetCameraMetadataItemType start");
480 if (dataType == nullptr) {
481 METADATA_ERR_LOG("GetCameraMetadataItemType dataType is null");
482 return CAM_META_INVALID_PARAM;
483 }
484 uint32_t section;
485 uint32_t itemTag = item >> BITWISE_SHIFT_16;
486 if (itemTag >= OHOS_VENDOR_SECTION) {
487 int32_t ret = LoadVendorTagImpl();
488 if (ret != CAM_META_SUCCESS) {
489 METADATA_ERR_LOG("LoadVendorTagImpl failed");
490 return CAM_META_FAILURE;
491 }
492 *dataType = g_vendorTagImpl->GetVendorTagType(item);
493 return CAM_META_SUCCESS;
494 }
495 int32_t ret = GetMetadataSection(itemTag, §ion);
496 if (ret != CAM_META_SUCCESS) {
497 METADATA_ERR_LOG("GetCameraMetadataItemType section is not valid");
498 return ret;
499 }
500
501 if (item >= g_ohosCameraSectionBounds[section][1]) {
502 METADATA_ERR_LOG("GetCameraMetadataItemType item is not in section bound");
503 return CAM_META_FAILURE;
504 }
505
506 uint32_t itemIndex = item & 0xFFFF;
507 if (g_ohosItemInfo[section][itemIndex].item_type < META_TYPE_BYTE) {
508 METADATA_ERR_LOG("GetCameraMetadataItemType item is not initialized");
509 return CAM_META_FAILURE;
510 }
511
512 *dataType = g_ohosItemInfo[section][itemIndex].item_type;
513
514 METADATA_DEBUG_LOG("GetCameraMetadataItemType end");
515 return CAM_META_SUCCESS;
516 }
517
GetCameraMetadataItemName(uint32_t item)518 const char *CameraMetadata::GetCameraMetadataItemName(uint32_t item)
519 {
520 METADATA_DEBUG_LOG("GetCameraMetadataItemName start");
521 METADATA_DEBUG_LOG("GetCameraMetadataItemName item: %{public}u", item);
522 uint32_t section;
523 uint32_t itemTag = item >> BITWISE_SHIFT_16;
524 if (itemTag >= OHOS_VENDOR_SECTION) {
525 int32_t ret = LoadVendorTagImpl();
526 if (ret != CAM_META_SUCCESS) {
527 METADATA_ERR_LOG("LoadVendorTagImpl failed");
528 return nullptr;
529 }
530 const char* tagName = g_vendorTagImpl->GetVendorTagName(item);
531 return tagName;
532 }
533 int32_t ret = GetMetadataSection(itemTag, §ion);
534 if (ret != CAM_META_SUCCESS) {
535 METADATA_ERR_LOG("GetCameraMetadataItemName section is not valid");
536 return nullptr;
537 }
538
539 if (item >= g_ohosCameraSectionBounds[section][1]) {
540 METADATA_ERR_LOG("GetCameraMetadataItemName item is not in section bound");
541 return nullptr;
542 }
543
544 uint32_t itemIndex = item & 0xFFFF;
545 METADATA_DEBUG_LOG("GetCameraMetadataItemName end");
546 return g_ohosItemInfo[section][itemIndex].item_name;
547 }
548
CalculateCameraMetadataItemDataSize(uint32_t type,size_t dataCount)549 size_t CameraMetadata::CalculateCameraMetadataItemDataSize(uint32_t type, size_t dataCount)
550 {
551 METADATA_DEBUG_LOG("CalculateCameraMetadataItemDataSize start");
552 if (type < META_TYPE_BYTE || type >= META_NUM_TYPES) {
553 METADATA_ERR_LOG("CalculateCameraMetadataItemDataSize invalid type");
554 return 0;
555 }
556
557 size_t dataBytes = dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[type];
558
559 METADATA_DEBUG_LOG("CalculateCameraMetadataItemDataSize end");
560 return (dataBytes <= METADATA_HEADER_DATA_SIZE) ? 0 : AlignTo(dataBytes, DATA_ALIGNMENT);
561 }
562
AddCameraMetadataItemVerify(common_metadata_header_t * dst,uint32_t item,const void * data,size_t dataCount,uint32_t * dataType)563 int CameraMetadata::AddCameraMetadataItemVerify(common_metadata_header_t *dst,
564 uint32_t item, const void *data, size_t dataCount, uint32_t *dataType)
565 {
566 const char *name = GetCameraMetadataItemName(item);
567 if (name == nullptr) {
568 name = "<unknown>";
569 }
570 METADATA_DEBUG_LOG("AddCameraMetadataItemVerify item id: %{public}u, name: %{public}s, "
571 "dataCount: %{public}zu", item, name, dataCount);
572
573 if (dst == nullptr) {
574 METADATA_ERR_LOG("AddCameraMetadataItemVerify common_metadata_header_t is null");
575 return CAM_META_INVALID_PARAM;
576 }
577
578 if (!dataCount || data == nullptr) {
579 METADATA_ERR_LOG("AddCameraMetadataItemVerify data is not valid. item: %{public}u, "
580 "dataCount: %{public}zu", item, dataCount);
581 return CAM_META_INVALID_PARAM;
582 }
583
584 if (dst->item_count == dst->item_capacity) {
585 METADATA_ERR_LOG("AddCameraMetadataItemVerify item_capacity limit reached. "
586 "item_count: %{public}d, item_capacity: %{public}d", dst->item_count, dst->item_capacity);
587 return CAM_META_ITEM_CAP_EXCEED;
588 }
589
590 int32_t ret = GetCameraMetadataItemType(item, dataType);
591 if (ret != CAM_META_SUCCESS) {
592 METADATA_ERR_LOG("AddCameraMetadataItemVerify invalid item type");
593 return CAM_META_INVALID_PARAM;
594 }
595
596 return CAM_META_SUCCESS;
597 }
598
AddCameraMetadataItem(common_metadata_header_t * dst,uint32_t item,const void * data,size_t dataCount)599 int CameraMetadata::AddCameraMetadataItem(common_metadata_header_t *dst, uint32_t item,
600 const void *data, size_t dataCount)
601 {
602 METADATA_DEBUG_LOG("AddCameraMetadataItem start");
603 uint32_t dataType;
604 int32_t ret = AddCameraMetadataItemVerify(dst, item, data, dataCount, &dataType);
605 if (ret != CAM_META_SUCCESS) {
606 return ret;
607 }
608
609 size_t dataBytes = CalculateCameraMetadataItemDataSize(dataType, dataCount);
610 if (dataBytes + dst->data_count > dst->data_capacity) {
611 METADATA_ERR_LOG("AddCameraMetadataItem data_capacity limit reached");
612 return CAM_META_DATA_CAP_EXCEED;
613 }
614
615 size_t dataPayloadBytes = dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[dataType];
616 camera_metadata_item_entry_t *metadataItem = GetMetadataItems(dst) + dst->item_count;
617 ret = memset_s(metadataItem, sizeof(camera_metadata_item_entry_t), 0, sizeof(camera_metadata_item_entry_t));
618 if (ret != EOK) {
619 METADATA_ERR_LOG("AddCameraMetadataItem: memset_s failed");
620 return CAM_META_FAILURE;
621 }
622 metadataItem->item = item;
623 metadataItem->data_type = dataType;
624 metadataItem->count = dataCount;
625
626 if (dataBytes == 0) {
627 ret = memcpy_s(metadataItem->data.value, METADATA_HEADER_DATA_SIZE, data, dataPayloadBytes);
628 if (ret != EOK) {
629 METADATA_ERR_LOG("AddCameraMetadataItem memory copy failed");
630 return CAM_META_FAILURE;
631 }
632 } else {
633 metadataItem->data.offset = dst->data_count;
634 ret = memcpy_s(GetMetadataData(dst) + metadataItem->data.offset, dst->data_capacity - dst->data_count, data,
635 dataPayloadBytes);
636 if (ret != EOK) {
637 METADATA_ERR_LOG("AddCameraMetadataItem memory copy failed");
638 return CAM_META_FAILURE;
639 }
640 dst->data_count += dataBytes;
641 }
642 dst->item_count++;
643
644 METADATA_DEBUG_LOG("AddCameraMetadataItem end");
645 return CAM_META_SUCCESS;
646 }
647
GetCameraMetadataItem(const common_metadata_header_t * src,uint32_t index,camera_metadata_item_t * item)648 int CameraMetadata::GetCameraMetadataItem(const common_metadata_header_t *src, uint32_t index,
649 camera_metadata_item_t *item)
650 {
651 METADATA_DEBUG_LOG("GetCameraMetadataItem start");
652 if (src == nullptr || item == nullptr) {
653 METADATA_ERR_LOG("GetCameraMetadataItem src or item is null");
654 return CAM_META_INVALID_PARAM;
655 }
656
657 int32_t ret = memset_s(item, sizeof(camera_metadata_item_t), 0, sizeof(camera_metadata_item_t));
658 if (ret != EOK) {
659 METADATA_ERR_LOG("GetCameraMetadataItem: memset_s failed");
660 return CAM_META_FAILURE;
661 }
662 if (index >= src->item_count) {
663 METADATA_ERR_LOG("GetCameraMetadataItem index is greater than item count");
664 return CAM_META_INVALID_PARAM;
665 }
666
667 camera_metadata_item_entry_t *localItem = GetMetadataItems(src) + index;
668
669 item->index = index;
670 item->item = localItem->item;
671 item->data_type = localItem->data_type;
672 item->count = localItem->count;
673
674 size_t dataBytes = CalculateCameraMetadataItemDataSize(localItem->data_type, localItem->count);
675 if (dataBytes == 0) {
676 item->data.u8 = localItem->data.value;
677 } else {
678 item->data.u8 = GetMetadataData(src) + localItem->data.offset;
679 }
680
681 METADATA_DEBUG_LOG("GetCameraMetadataItem end");
682 return CAM_META_SUCCESS;
683 }
684
FindCameraMetadataItemIndex(const common_metadata_header_t * src,uint32_t item,uint32_t * idx)685 int CameraMetadata::FindCameraMetadataItemIndex(const common_metadata_header_t *src, uint32_t item, uint32_t *idx)
686 {
687 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex start");
688 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex item: %{public}u", item);
689 if (src == nullptr || idx == nullptr) {
690 METADATA_ERR_LOG("FindCameraMetadataItemIndex src or index is null");
691 return CAM_META_INVALID_PARAM;
692 }
693
694 camera_metadata_item_entry_t *searchItem = GetMetadataItems(src);
695 uint32_t index;
696 for (index = 0; index < src->item_count; index++, searchItem++) {
697 if (searchItem->item == item) {
698 break;
699 }
700 }
701
702 if (index == src->item_count) {
703 METADATA_ERR_LOG("FindCameraMetadataItemIndex item: %{public}u not found", item);
704 return CAM_META_ITEM_NOT_FOUND;
705 }
706
707 *idx = index;
708 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex index: %{public}u", index);
709 METADATA_DEBUG_LOG("FindCameraMetadataItemIndex end");
710 return CAM_META_SUCCESS;
711 }
712
FindCameraMetadataItem(const common_metadata_header_t * src,uint32_t item,camera_metadata_item_t * metadataItem)713 int CameraMetadata::FindCameraMetadataItem(const common_metadata_header_t *src, uint32_t item,
714 camera_metadata_item_t *metadataItem)
715 {
716 uint32_t index = 0;
717 const char *name = GetCameraMetadataItemName(item);
718 if (name == nullptr) {
719 name = "<unknown>";
720 }
721 METADATA_DEBUG_LOG("FindCameraMetadataItem item id: %{public}u, name: %{public}s", item, name);
722 int ret = FindCameraMetadataItemIndex(src, item, &index);
723 if (ret != CAM_META_SUCCESS) {
724 return ret;
725 }
726
727 return GetCameraMetadataItem(src, index, metadataItem);
728 }
729
SetOffset(camera_metadata_item_entry_t * metadataItems,camera_metadata_item_entry_t * item,size_t oldItemSize)730 void SetOffset(camera_metadata_item_entry_t *metadataItems, camera_metadata_item_entry_t *item, size_t oldItemSize)
731 {
732 if (metadataItems == nullptr) {
733 METADATA_ERR_LOG("SetOffset metadataItems is null");
734 return;
735 }
736 if (CalculateCameraMetadataItemDataSize(metadataItems->data_type, metadataItems->count) > 0 &&
737 metadataItems->data.offset > item->data.offset) {
738 metadataItems->data.offset -= oldItemSize;
739 }
740 }
741
MetadataExpandItemMem(common_metadata_header_t * dst,camera_metadata_item_entry_t * item,size_t oldItemSize)742 int CameraMetadata::MetadataExpandItemMem(common_metadata_header_t *dst, camera_metadata_item_entry_t *item,
743 size_t oldItemSize)
744 {
745 if (item == nullptr || dst == nullptr) {
746 METADATA_ERR_LOG("MetadataExpandItemMem item is null or dst is null");
747 return CAM_META_INVALID_PARAM;
748 }
749 uint8_t *start = GetMetadataData(dst) + item->data.offset;
750 uint8_t *end = start + oldItemSize;
751 size_t length = dst->data_count - item->data.offset - oldItemSize;
752 if (length != 0) {
753 int32_t ret = memmove_s(start, length, end, length);
754 if (ret != EOK) {
755 METADATA_ERR_LOG("MetadataExpandItemMem memory move failed");
756 return CAM_META_FAILURE;
757 }
758 }
759 dst->data_count -= oldItemSize;
760
761 camera_metadata_item_entry_t *metadataItems = GetMetadataItems(dst);
762 for (uint32_t i = 0; i < dst->item_count; i++, ++metadataItems) {
763 SetOffset(metadataItems, item, oldItemSize);
764 }
765
766 return CAM_META_SUCCESS;
767 }
768
UpdateameraMetadataItemSize(camera_metadata_item_entry_t * item,uint32_t dataCount,common_metadata_header_t * dst,const void * data)769 int CameraMetadata::UpdateameraMetadataItemSize(camera_metadata_item_entry_t *item, uint32_t dataCount,
770 common_metadata_header_t *dst, const void *data)
771 {
772 if (item == nullptr) {
773 METADATA_ERR_LOG("UpdateameraMetadataItemSize item is null");
774 return CAM_META_FAILURE;
775 }
776 size_t dataSize = CalculateCameraMetadataItemDataSize(item->data_type, dataCount);
777 size_t dataPayloadSize = dataCount * OHOS_CAMERA_METADATA_TYPE_SIZE[item->data_type];
778
779 size_t oldItemSize = CalculateCameraMetadataItemDataSize(item->data_type, item->count);
780
781 int32_t ret = CAM_META_SUCCESS;
782 if (dataSize != oldItemSize) {
783 if (dst->data_capacity < (dst->data_count + dataSize - oldItemSize)) {
784 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex data_capacity limit reached");
785 return CAM_META_DATA_CAP_EXCEED;
786 }
787
788 if (oldItemSize != 0) {
789 ret = MetadataExpandItemMem(dst, item, oldItemSize);
790 if (ret != CAM_META_SUCCESS) {
791 return ret;
792 }
793 }
794
795 if (dataSize != 0) {
796 item->data.offset = dst->data_count;
797 ret = memcpy_s(GetMetadataData(dst) + item->data.offset, dataPayloadSize, data, dataPayloadSize);
798 if (ret != EOK) {
799 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex memory copy failed");
800 return CAM_META_FAILURE;
801 }
802 dst->data_count += dataSize;
803 }
804 } else if (dataSize != 0) {
805 ret = memcpy_s(GetMetadataData(dst) + item->data.offset, dataPayloadSize, data, dataPayloadSize);
806 if (ret != EOK) {
807 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex memory copy failed");
808 return CAM_META_FAILURE;
809 }
810 }
811
812 if (dataSize == 0) {
813 ret = memcpy_s(item->data.value, dataPayloadSize, data, dataPayloadSize);
814 if (ret != EOK) {
815 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex memory copy failed");
816 return CAM_META_FAILURE;
817 }
818 }
819 return ret;
820 }
821
UpdateCameraMetadataItemByIndex(common_metadata_header_t * dst,uint32_t index,const void * data,uint32_t dataCount,camera_metadata_item_t * updatedItem)822 int CameraMetadata::UpdateCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index,
823 const void *data, uint32_t dataCount, camera_metadata_item_t *updatedItem)
824 {
825 METADATA_DEBUG_LOG("UpdateCameraMetadataItemByIndex start");
826 if ((dst == nullptr) || (index >= dst->item_count)) {
827 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex dst is null or invalid index");
828 return CAM_META_INVALID_PARAM;
829 }
830
831 if (!dataCount || data == nullptr) {
832 METADATA_ERR_LOG("UpdateCameraMetadataItemByIndex data is not valid. "
833 "dataCount: %{public}u", dataCount);
834 return CAM_META_INVALID_PARAM;
835 }
836
837 int32_t ret = CAM_META_SUCCESS;
838 camera_metadata_item_entry_t *item = GetMetadataItems(dst) + index;
839
840 ret = UpdateameraMetadataItemSize(item, dataCount, dst, data);
841 if (ret != CAM_META_SUCCESS) {
842 return ret;
843 }
844
845 item->count = dataCount;
846 if (updatedItem != nullptr) {
847 ret = GetCameraMetadataItem(dst, index, updatedItem);
848 if (ret != CAM_META_SUCCESS) {
849 return ret;
850 }
851 }
852
853 METADATA_DEBUG_LOG("UpdateCameraMetadataItemByIndex end");
854 return ret;
855 }
856
UpdateCameraMetadataItem(common_metadata_header_t * dst,uint32_t item,const void * data,uint32_t dataCount,camera_metadata_item_t * updatedItem)857 int CameraMetadata::UpdateCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data,
858 uint32_t dataCount, camera_metadata_item_t *updatedItem)
859 {
860 METADATA_DEBUG_LOG("UpdateCameraMetadataItem item id: %{public}u, dataCount: %{public}u", item, dataCount);
861 const char *name = GetCameraMetadataItemName(item);
862 if (name == nullptr) {
863 name = "<unknown>";
864 }
865 METADATA_DEBUG_LOG("UpdateCameraMetadataItem item id: %{public}u, name: %{public}s, "
866 "dataCount: %{public}u", item, name, dataCount);
867 if (!dataCount || data == nullptr) {
868 METADATA_ERR_LOG("UpdateCameraMetadataItem data is not valid. item: %{public}u, "
869 "dataCount: %{public}u", item, dataCount);
870 return CAM_META_INVALID_PARAM;
871 }
872
873 uint32_t index = 0;
874 int32_t ret = FindCameraMetadataItemIndex(dst, item, &index);
875 if (ret != CAM_META_SUCCESS) {
876 return ret;
877 }
878
879 return UpdateCameraMetadataItemByIndex(dst, index, data, dataCount, updatedItem);
880 }
881
DeleteCameraMetadataItemByIndex(common_metadata_header_t * dst,uint32_t index)882 int CameraMetadata::DeleteCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index)
883 {
884 METADATA_DEBUG_LOG("DeleteCameraMetadataItemByIndex start");
885 if (dst == nullptr) {
886 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex dst is null");
887 return CAM_META_INVALID_PARAM;
888 }
889
890 if (index >= dst->item_count) {
891 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex item not valid");
892 return CAM_META_INVALID_PARAM;
893 }
894
895 int32_t ret = CAM_META_SUCCESS;
896 camera_metadata_item_entry_t *itemToDelete = GetMetadataItems(dst) + index;
897 size_t dataBytes = CalculateCameraMetadataItemDataSize(itemToDelete->data_type, itemToDelete->count);
898 if (dataBytes > 0) {
899 uint8_t *start = GetMetadataData(dst) + itemToDelete->data.offset;
900 uint8_t *end = start + dataBytes;
901 size_t length = dst->data_count - itemToDelete->data.offset - dataBytes;
902 if (length != 0) {
903 ret = memmove_s(start, length, end, length);
904 if (ret != EOK) {
905 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex memory move failed");
906 return CAM_META_FAILURE;
907 }
908 }
909 dst->data_count -= dataBytes;
910
911 camera_metadata_item_entry_t *metadataItems = GetMetadataItems(dst);
912 for (uint32_t i = 0; i < dst->item_count; i++, ++metadataItems) {
913 if (CalculateCameraMetadataItemDataSize(
914 metadataItems->data_type, metadataItems->count) > 0 &&
915 metadataItems->data.offset > itemToDelete->data.offset) {
916 metadataItems->data.offset -= dataBytes;
917 }
918 }
919 }
920
921 uint64_t length = sizeof(camera_metadata_item_entry_t) * (dst->item_count - index - 1);
922 if (length != 0) {
923 ret = memmove_s(itemToDelete, length, itemToDelete + 1, length);
924 if (ret != EOK) {
925 METADATA_ERR_LOG("DeleteCameraMetadataItemByIndex memory move failed");
926 return CAM_META_FAILURE;
927 }
928 }
929 dst->item_count -= 1;
930 METADATA_DEBUG_LOG("DeleteCameraMetadataItemByIndex end");
931 return ret;
932 }
933
DeleteCameraMetadataItem(common_metadata_header_t * dst,uint32_t item)934 int CameraMetadata::DeleteCameraMetadataItem(common_metadata_header_t *dst, uint32_t item)
935 {
936 METADATA_DEBUG_LOG("DeleteCameraMetadataItem item: %{public}u", item);
937 uint32_t index = 0;
938 int32_t ret = FindCameraMetadataItemIndex(dst, item, &index);
939 if (ret != CAM_META_SUCCESS) {
940 return ret;
941 }
942
943 return DeleteCameraMetadataItemByIndex(dst, index);
944 }
945
FreeCameraMetadataBuffer(common_metadata_header_t * dst)946 void CameraMetadata::FreeCameraMetadataBuffer(common_metadata_header_t *dst)
947 {
948 if (dst != nullptr) {
949 free(dst);
950 }
951 }
952
GetCameraMetadataItemCount(const common_metadata_header_t * metadataHeader)953 uint32_t CameraMetadata::GetCameraMetadataItemCount(const common_metadata_header_t *metadataHeader)
954 {
955 if (!metadataHeader) {
956 METADATA_ERR_LOG("GetCameraMetadataItemCount::metadataHeader is null");
957 return 0;
958 }
959 return metadataHeader->item_count;
960 }
961
GetCameraMetadataItemCapacity(const common_metadata_header_t * metadataHeader)962 uint32_t CameraMetadata::GetCameraMetadataItemCapacity(const common_metadata_header_t *metadataHeader)
963 {
964 if (!metadataHeader) {
965 METADATA_ERR_LOG("GetCameraMetadataItemCapacity::metadataHeader is null");
966 return 0;
967 }
968 return metadataHeader->item_capacity;
969 }
970
GetCameraMetadataDataSize(const common_metadata_header_t * metadataHeader)971 uint32_t CameraMetadata::GetCameraMetadataDataSize(const common_metadata_header_t *metadataHeader)
972 {
973 if (metadataHeader == nullptr) {
974 METADATA_ERR_LOG("GetCameraMetadataDataSize::metadataHeader is null");
975 return 0;
976 }
977 return metadataHeader->data_capacity;
978 }
979
CopyCameraMetadataItems(common_metadata_header_t * newMetadata,const common_metadata_header_t * oldMetadata)980 int32_t CameraMetadata::CopyCameraMetadataItems(common_metadata_header_t *newMetadata,
981 const common_metadata_header_t *oldMetadata)
982 {
983 if (newMetadata == nullptr || oldMetadata == nullptr) {
984 return CAM_META_INVALID_PARAM;
985 }
986
987 int32_t ret;
988 if (oldMetadata->item_count != 0) {
989 ret = memcpy_s(GetMetadataItems(newMetadata), sizeof(camera_metadata_item_entry_t[oldMetadata->item_count]),
990 GetMetadataItems(oldMetadata), sizeof(camera_metadata_item_entry_t[oldMetadata->item_count]));
991 if (ret != EOK) {
992 METADATA_ERR_LOG("CopyCameraMetadataItems memory copy failed");
993 return CAM_META_FAILURE;
994 }
995 }
996
997 if (oldMetadata->data_count != 0) {
998 ret = memcpy_s(GetMetadataData(newMetadata), sizeof(uint8_t[oldMetadata->data_count]),
999 GetMetadataData(oldMetadata), sizeof(uint8_t[oldMetadata->data_count]));
1000 if (ret != EOK) {
1001 METADATA_ERR_LOG("CopyCameraMetadataItems memory copy failed");
1002 return CAM_META_FAILURE;
1003 }
1004 }
1005
1006 newMetadata->item_count = oldMetadata->item_count;
1007 newMetadata->data_count = oldMetadata->data_count;
1008
1009 return CAM_META_SUCCESS;
1010 }
1011
U8ItemToString(int32_t item,const camera_metadata_item_t entry)1012 std::string U8ItemToString(int32_t item, const camera_metadata_item_t entry)
1013 {
1014 std::string st = {};
1015 uint32_t count = entry.count;
1016 if (entry.data.u8 == nullptr) {
1017 METADATA_ERR_LOG("U8ItemToString: entry.data.u8 is null");
1018 return st;
1019 }
1020 std::string dataStr = std::to_string(*(entry.data.u8));
1021 for (uint32_t i = 1; i < count; i++) {
1022 if ((i % WRAP_LENGTH) == 0) {
1023 dataStr += "]\n\t[" + std::to_string(*(entry.data.u8 + i));
1024 } else {
1025 dataStr += " " + std::to_string(*(entry.data.u8 + i));
1026 }
1027 }
1028
1029 const char *name = GetCameraMetadataItemName(item);
1030 if (name == nullptr) {
1031 METADATA_ERR_LOG("U8ItemToString: get u8 item name fail!");
1032 return st;
1033 }
1034 std::string nameStr(name);
1035
1036 st = nameStr + " (" + std::to_string(entry.index) + "): " +
1037 OHOS_CAMERA_METADATA_TYPE[entry.data_type] + "[" + std::to_string(count) + "]" + "\n\t[" + dataStr + "]";
1038
1039 return st;
1040 }
1041
I32ItemToString(int32_t item,const camera_metadata_item_t entry)1042 std::string I32ItemToString(int32_t item, const camera_metadata_item_t entry)
1043 {
1044 std::string st = {};
1045 uint32_t count = entry.count;
1046 if (entry.data.i32 == nullptr) {
1047 METADATA_ERR_LOG("I32ItemToString: entry.data.i32 is null");
1048 return st;
1049 }
1050 std::string dataStr = std::to_string(*(entry.data.i32));
1051 for (uint32_t i = 1; i < count; i++) {
1052 if ((i % WRAP_LENGTH) == 0) {
1053 dataStr += "]\n\t[" + std::to_string(*(entry.data.i32 + i));
1054 } else {
1055 dataStr += " " + std::to_string(*(entry.data.i32 + i));
1056 }
1057 }
1058
1059 const char *name = GetCameraMetadataItemName(item);
1060 if (name == nullptr) {
1061 METADATA_ERR_LOG("I32ItemToString: get i32 item name fail!");
1062 return st;
1063 }
1064 std::string nameStr(name);
1065
1066 st = nameStr + " (" + std::to_string(entry.index) + "): " +
1067 OHOS_CAMERA_METADATA_TYPE[entry.data_type] + "[" + std::to_string(count) + "]" + "\n\t[" + dataStr + "]";
1068
1069 return st;
1070 }
1071
U32ItemToString(int32_t item,const camera_metadata_item_t entry)1072 std::string U32ItemToString(int32_t item, const camera_metadata_item_t entry)
1073 {
1074 std::string st = {};
1075 uint32_t count = entry.count;
1076 if (entry.data.ui32 == nullptr) {
1077 METADATA_ERR_LOG("U32ItemToString: entry.data.ui32 is null");
1078 return st;
1079 }
1080 std::string dataStr = std::to_string(*(entry.data.ui32));
1081 for (uint32_t i = 1; i < count; i++) {
1082 if ((i % WRAP_LENGTH) == 0) {
1083 dataStr += "]\n\t[" + std::to_string(*(entry.data.ui32 + i));
1084 } else {
1085 dataStr += " " + std::to_string(*(entry.data.ui32 + i));
1086 }
1087 }
1088
1089 const char *name = GetCameraMetadataItemName(item);
1090 if (name == nullptr) {
1091 METADATA_ERR_LOG("U32ItemToString: get u32 item name fail!");
1092 return st;
1093 }
1094 std::string nameStr(name);
1095
1096 st = nameStr + " (" + std::to_string(entry.index) + "): " +
1097 OHOS_CAMERA_METADATA_TYPE[entry.data_type] + "[" + std::to_string(count) + "]" + "\n\t[" + dataStr + "]";
1098
1099 return st;
1100 }
1101
I64ItemToString(int32_t item,const camera_metadata_item_t entry)1102 std::string I64ItemToString(int32_t item, const camera_metadata_item_t entry)
1103 {
1104 std::string st = {};
1105 uint32_t count = entry.count;
1106 if (entry.data.i64 == nullptr) {
1107 METADATA_ERR_LOG("I64ItemToString: entry.data.i64 is null");
1108 return st;
1109 }
1110 std::string dataStr = std::to_string(*(entry.data.i64));
1111 for (uint32_t i = 1; i < count; i++) {
1112 if ((i % WRAP_LENGTH) == 0) {
1113 dataStr += "]\n\t[" + std::to_string(*(entry.data.i64 + i));
1114 } else {
1115 dataStr += " " + std::to_string(*(entry.data.i64 + i));
1116 }
1117 }
1118
1119 const char *name = GetCameraMetadataItemName(item);
1120 if (name == nullptr) {
1121 METADATA_ERR_LOG("I64ItemToString: get i64 item name fail!");
1122 return st;
1123 }
1124 std::string nameStr(name);
1125
1126 st = nameStr + " (" + std::to_string(entry.index) + "): " +
1127 OHOS_CAMERA_METADATA_TYPE[entry.data_type] + "[" + std::to_string(count) + "]" + "\n\t[" + dataStr + "]";
1128
1129 return st;
1130 }
1131
FloatItemToString(int32_t item,const camera_metadata_item_t entry)1132 std::string FloatItemToString(int32_t item, const camera_metadata_item_t entry)
1133 {
1134 std::string st = {};
1135 uint32_t count = entry.count;
1136 if (entry.data.f == nullptr) {
1137 METADATA_ERR_LOG("FloatItemToString: entry.data.f is null");
1138 return st;
1139 }
1140 std::string dataStr = std::to_string(*(entry.data.f));
1141 for (uint32_t i = 1; i < count; i++) {
1142 if ((i % WRAP_LENGTH) == 0) {
1143 dataStr += "]\n\t[" + std::to_string(*(entry.data.f + i));
1144 } else {
1145 dataStr += " " + std::to_string(*(entry.data.f + i));
1146 }
1147 }
1148
1149 const char *name = GetCameraMetadataItemName(item);
1150 if (name == nullptr) {
1151 METADATA_ERR_LOG("FloatItemToString: get float item name fail!");
1152 return st;
1153 }
1154 std::string nameStr(name);
1155
1156 st = nameStr + " (" + std::to_string(entry.index) + "): " +
1157 OHOS_CAMERA_METADATA_TYPE[entry.data_type] + "[" + std::to_string(count) + "]" + "\n\t[" + dataStr + "]";
1158
1159 return st;
1160 }
1161
DoubleItemToString(int32_t item,const camera_metadata_item_t entry)1162 std::string DoubleItemToString(int32_t item, const camera_metadata_item_t entry)
1163 {
1164 std::string st = {};
1165 uint32_t count = entry.count;
1166 if (entry.data.d == nullptr) {
1167 METADATA_ERR_LOG("DoubleItemToString: entry.data.d is null");
1168 return st;
1169 }
1170 std::string dataStr = std::to_string(*(entry.data.d));
1171 for (uint32_t i = 1; i < count; i++) {
1172 if ((i % WRAP_LENGTH) == 0) {
1173 dataStr += "]\n\t[" + std::to_string(*(entry.data.d + i));
1174 } else {
1175 dataStr += " " + std::to_string(*(entry.data.d + i));
1176 }
1177 }
1178
1179 const char *name = GetCameraMetadataItemName(item);
1180 if (name == nullptr) {
1181 METADATA_ERR_LOG("DoubleItemToString: get double item name fail!");
1182 return st;
1183 }
1184 std::string nameStr(name);
1185
1186 st = nameStr + " (" + std::to_string(entry.index) + "): " +
1187 OHOS_CAMERA_METADATA_TYPE[entry.data_type] + "[" + std::to_string(count) + "]" + "\n\t[" + dataStr + "]";
1188
1189 return st;
1190 }
1191
RationalItemToString(int32_t item,const camera_metadata_item_t entry)1192 std::string RationalItemToString(int32_t item, const camera_metadata_item_t entry)
1193 {
1194 std::string st = {};
1195 uint32_t count = entry.count;
1196 if (entry.data.r == nullptr) {
1197 METADATA_ERR_LOG("RationalItemToString: entry.data.r is null");
1198 return st;
1199 }
1200 std::string dataStr = std::to_string((*(entry.data.r)).numerator) + "/" +
1201 std::to_string((*(entry.data.r)).denominator);
1202 for (uint32_t i = 1; i < count; i++) {
1203 if ((i % WRAP_LENGTH) == 0) {
1204 dataStr += "]\n\t[" + std::to_string((*(entry.data.r + i)).numerator) + "/" +
1205 std::to_string((*(entry.data.r + i)).denominator);
1206 } else {
1207 dataStr += " " + std::to_string((*(entry.data.r + i)).numerator) + "/" +
1208 std::to_string((*(entry.data.r + i)).denominator);
1209 }
1210 }
1211
1212 const char *name = GetCameraMetadataItemName(item);
1213 if (name == nullptr) {
1214 METADATA_ERR_LOG("RationalItemToString: get rational item name fail!");
1215 return st;
1216 }
1217 std::string nameStr(name);
1218
1219 st = nameStr + " (" + std::to_string(entry.index) + "): " +
1220 OHOS_CAMERA_METADATA_TYPE[entry.data_type] + "[" + std::to_string(count) + "]" + "\n\t[" + dataStr + "]";
1221
1222 return st;
1223 }
1224
MetadataItemDump(const common_metadata_header_t * metadataHeader,uint32_t item)1225 std::string CameraMetadata::MetadataItemDump(const common_metadata_header_t *metadataHeader, uint32_t item)
1226 {
1227 camera_metadata_item_t entry;
1228 std::string st = {};
1229
1230 int ret = FindCameraMetadataItem(metadataHeader, item, &entry);
1231 if (ret != 0) {
1232 METADATA_ERR_LOG("get item error and item = %{public}d", item);
1233 return st;
1234 }
1235
1236 switch (entry.data_type) {
1237 case META_TYPE_BYTE:
1238 st = U8ItemToString(item, entry);
1239 break;
1240 case META_TYPE_INT32:
1241 st = I32ItemToString(item, entry);
1242 break;
1243 case META_TYPE_UINT32:
1244 st = U32ItemToString(item, entry);
1245 break;
1246 case META_TYPE_FLOAT:
1247 st = FloatItemToString(item, entry);
1248 break;
1249 case META_TYPE_INT64:
1250 st = I64ItemToString(item, entry);
1251 break;
1252 case META_TYPE_DOUBLE:
1253 st = DoubleItemToString(item, entry);
1254 break;
1255 case META_TYPE_RATIONAL:
1256 st = RationalItemToString(item, entry);
1257 break;
1258 default:
1259 METADATA_ERR_LOG("invalid param and item = %{public}d", item);
1260 break;
1261 }
1262
1263 if (!st.empty()) {
1264 st += "\n";
1265 }
1266 return st;
1267 }
1268
FormatCameraMetadataToString(const common_metadata_header_t * metadataHeader)1269 std::string CameraMetadata::FormatCameraMetadataToString(const common_metadata_header_t *metadataHeader)
1270 {
1271 std::string metaStr;
1272 if (metadataHeader == nullptr) {
1273 METADATA_ERR_LOG("metadataHeader is nullptr");
1274 return metaStr;
1275 }
1276
1277 for (auto it = g_metadataTags.begin(); it != g_metadataTags.end(); it++) {
1278 metaStr += MetadataItemDump(metadataHeader, *it);
1279 }
1280 METADATA_INFO_LOG("metadataHeader item = %{public}s", metaStr.c_str());
1281 return metaStr;
1282 }
1283
GetAllVendorTags(std::vector<vendorTag_t> & tagVec)1284 int32_t CameraMetadata::GetAllVendorTags(std::vector<vendorTag_t>& tagVec)
1285 {
1286 int32_t ret = LoadVendorTagImpl();
1287 if (ret != CAM_META_SUCCESS) {
1288 METADATA_ERR_LOG("LoadVendorTagImpl failed");
1289 return CAM_META_FAILURE;
1290 }
1291 g_vendorTagImpl->GetAllVendorTags(tagVec);
1292 return CAM_META_SUCCESS;
1293 }
1294 } // Camera
1295