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 #ifndef CAMERA_METADATA_INFO_H 17 #define CAMERA_METADATA_INFO_H 18 19 #include <cstdio> 20 #include <cstdint> 21 #include <string> 22 #include "camera_metadata_operator.h" 23 24 #define METADATA_PACKET_ALIGNMENT \ 25 MaxAlignment(MaxAlignment(DATA_ALIGNMENT, METADATA_ALIGNMENT), ITEM_ALIGNMENT) 26 27 namespace OHOS::Camera { 28 class CameraMetadata { 29 public: 30 CameraMetadata(size_t itemCapacity, size_t dataCapacity); 31 ~CameraMetadata(); 32 33 bool addEntry(uint32_t item, const void *data, size_t data_count); 34 bool updateEntry(uint32_t tag, const void *data, size_t data_count); 35 common_metadata_header_t *get(); 36 const common_metadata_header_t *get() const; 37 bool isValid() const; 38 39 private: 40 common_metadata_header_t *metadata_; 41 42 bool resize_add_metadata(uint32_t item, const void *data, size_t data_count); 43 void replace_metadata(common_metadata_header_t *newMetadata); 44 static uint32_t AlignTo(uint32_t val, uint32_t alignment); 45 static uint32_t MaxAlignment(uint32_t dataAlignment, uint32_t metadataAlignment); 46 static size_t CalculateCameraMetadataMemoryRequired(uint32_t itemCount, uint32_t dataCount); 47 static int UpdateameraMetadataItemSize(camera_metadata_item_entry_t *item, uint32_t dataCount, 48 common_metadata_header_t *dst, const void *data); 49 static int AddCameraMetadataItemVerify(common_metadata_header_t *dst, 50 uint32_t item, const void *data, size_t dataCount, uint32_t *dataType); 51 52 public: 53 // Allocate a new camera metadata buffer and return the metadata header 54 static common_metadata_header_t *AllocateCameraMetadataBuffer(uint32_t item_capacity, uint32_t data_capacity); 55 56 // Find camera metadata item and fill the found item 57 static int FindCameraMetadataItem(const common_metadata_header_t *src, uint32_t item, 58 camera_metadata_item_t *metadataItem); 59 60 // Find camera metadata item index if the item exists 61 static int FindCameraMetadataItemIndex(const common_metadata_header_t *src, uint32_t item, uint32_t *index); 62 63 // Get camera metadata item name 64 static const char *GetCameraMetadataItemName(uint32_t item); 65 66 // Update camera metadata item and fill the updated item 67 static int UpdateCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, 68 uint32_t dataCount, camera_metadata_item_t *updatedItem); 69 70 // Update camera metadata item by index and fill the updated item 71 static int UpdateCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index, const void *data, 72 uint32_t dataCount, camera_metadata_item_t *updated_item); 73 74 // Add camera metadata item 75 static int AddCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, size_t dataCount); 76 77 // Delete camera metadata item 78 static int DeleteCameraMetadataItem(common_metadata_header_t *dst, uint32_t item); 79 80 // Delete camera metadata item by index 81 static int DeleteCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index); 82 83 // Free camera metadata buffer 84 static void FreeCameraMetadataBuffer(common_metadata_header_t *dst); 85 86 static std::string MetadataItemDump(const common_metadata_header_t *metadataHeader, uint32_t item); 87 88 static std::string FormatCameraMetadataToString(const common_metadata_header_t *metadataHeader); 89 90 // Internal use 91 static camera_metadata_item_entry_t *GetMetadataItems(const common_metadata_header_t *metadataHeader); 92 static uint8_t *GetMetadataData(const common_metadata_header_t *metadataHeader); 93 static int GetCameraMetadataItem(const common_metadata_header_t *src, uint32_t index, camera_metadata_item_t *item); 94 static uint32_t GetCameraMetadataItemCount(const common_metadata_header_t *metadata_header); 95 static uint32_t GetCameraMetadataItemCapacity(const common_metadata_header_t *metadata_header); 96 static uint32_t GetCameraMetadataDataSize(const common_metadata_header_t *metadata_header); 97 static int32_t CopyCameraMetadataItems(common_metadata_header_t *newMetadata, 98 const common_metadata_header_t *oldMetadata); 99 static size_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count); 100 static int32_t GetCameraMetadataItemType(uint32_t item, uint32_t *data_type); 101 static common_metadata_header_t *FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired, 102 uint32_t itemCapacity, uint32_t dataCapacity); 103 static int32_t GetMetadataSection(uint32_t itemSection, uint32_t *section); 104 static int MetadataExpandItemMem(common_metadata_header_t *dst, camera_metadata_item_entry_t *item, 105 size_t oldItemSize); 106 static int32_t GetAllVendorTags(std::vector<vendorTag_t>& tagVec); 107 }; 108 } // namespace Camera 109 #endif /* CAMERA_METADATA_INFO_H */ 110