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