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_OPERATOR_H 17 #define CAMERA_METADATA_OPERATOR_H 18 19 #include <cstdio> 20 #include <cstdint> 21 #include <string> 22 23 #include "camera_device_ability_items.h" 24 25 /** Versioning information */ 26 #define CURRENT_CAMERA_METADATA_VERSION 1 27 28 #define ITEM_ALIGNMENT ((size_t) 4) 29 30 #define DATA_ALIGNMENT ((size_t) 8) 31 32 #define METADATA_ALIGNMENT ((size_t) 4) 33 34 #define INDEX_COUNTER 2 35 #define WRAP_LENGTH 4 36 #define ENTRY_DATA_SIZE 4 37 38 // data type 39 enum { 40 // uint8_t 41 META_TYPE_BYTE = 0, 42 // int32_t 43 META_TYPE_INT32 = 1, 44 // uint32_t 45 META_TYPE_UINT32 = 2, 46 // float 47 META_TYPE_FLOAT = 3, 48 // int64_t 49 META_TYPE_INT64 = 4, 50 // double 51 META_TYPE_DOUBLE = 5, 52 // A 64-bit fraction (camera_metadata_rational_t) 53 META_TYPE_RATIONAL = 6, 54 // Number of data type 55 META_NUM_TYPES 56 }; 57 58 const static char *OHOS_CAMERA_METADATA_TYPE[META_NUM_TYPES] = { 59 [META_TYPE_BYTE] = "byte", 60 [META_TYPE_INT32] = "int32", 61 [META_TYPE_UINT32] = "uint32", 62 [META_TYPE_FLOAT] = "float", 63 [META_TYPE_INT64] = "int64", 64 [META_TYPE_DOUBLE] = "double", 65 [META_TYPE_RATIONAL] = "rational" 66 }; 67 68 typedef struct camera_rational { 69 int32_t numerator; 70 int32_t denominator; 71 } camera_rational_t; 72 73 // common metadata header 74 typedef struct common_metadata_header { 75 uint32_t version; 76 uint32_t size; 77 uint32_t item_count; 78 uint32_t item_capacity; 79 uint32_t items_start; // Offset from common_metadata_header 80 uint32_t data_count; 81 uint32_t data_capacity; 82 uint32_t data_start; // Offset from common_metadata_header 83 } common_metadata_header_t; 84 85 typedef struct camera_metadata_item_entry { 86 uint32_t item; 87 uint32_t data_type; 88 uint32_t count; 89 union { 90 uint32_t offset; 91 uint8_t value[ENTRY_DATA_SIZE]; 92 } data; 93 } camera_metadata_item_entry_t; 94 95 typedef struct camera_metadata_item { 96 uint32_t index; 97 uint32_t item; 98 uint32_t data_type; 99 uint32_t count; 100 union { 101 uint8_t *u8; 102 int32_t *i32; 103 uint32_t *ui32; 104 float *f; 105 int64_t *i64; 106 double *d; 107 camera_rational_t *r; 108 } data; 109 } camera_metadata_item_t; 110 111 typedef struct item_info { 112 const char *item_name; 113 uint8_t item_type; 114 int32_t dataCnt; 115 } item_info_t; 116 117 /* camera_metadata_section */ 118 typedef enum camera_metadata_sec { 119 OHOS_SECTION_CAMERA_PROPERTIES, 120 OHOS_SECTION_CAMERA_SENSOR, 121 OHOS_SECTION_CAMERA_SENSOR_INFO, 122 OHOS_SECTION_CAMERA_STATISTICS, 123 OHOS_SECTION_CAMERA_CONTROL, 124 OHOS_SECTION_DEVICE_EXPOSURE, 125 OHOS_SECTION_DEVICE_FOCUS, 126 OHOS_SECTION_DEVICE_WHITE, 127 OHOS_SECTION_DEVICE_FLASH, 128 OHOS_SECTION_DEVICE_ZOOM, 129 OHOS_SECTION_STREAM_ABILITY, 130 OHOS_SECTION_STREAM_JPEG, 131 OHOS_SECTION_STREAM_VIDEO, 132 OHOS_SECTION_CAMERA_EFFECT, 133 OHOS_SECTION_CAMERA_SECURE, 134 OHOS_SECTION_CAMERA_XMAGE, 135 OHOS_SECTION_COUNT, 136 } camera_metadata_sec_t; 137 138 typedef struct VendoTagInfo { 139 uint32_t tagId; 140 const char* tagName; 141 uint8_t tagType; 142 } vendorTag_t; 143 144 /* Return codes */ 145 #define CAM_META_FAILURE (-1) 146 #define CAM_META_SUCCESS 0 147 #define CAM_META_INVALID_PARAM 2 148 #define CAM_META_ITEM_NOT_FOUND 3 149 #define CAM_META_ITEM_CAP_EXCEED 4 150 #define CAM_META_DATA_CAP_EXCEED 5 151 152 /* for shift opereration */ 153 #define BITWISE_SHIFT_16 16 154 155 namespace OHOS::Camera { 156 // Allocate a new camera metadata buffer and return the metadata header 157 common_metadata_header_t *AllocateCameraMetadataBuffer(uint32_t item_capacity, uint32_t data_capacity); 158 159 // Is camera metadata item exist 160 bool IsCameraMetadataItemExist(const common_metadata_header_t *src, uint32_t item); 161 162 // Find camera metadata item and fill the found item 163 int FindCameraMetadataItem(const common_metadata_header_t *src, uint32_t item, 164 camera_metadata_item_t *metadataItem); 165 166 // Find camera metadata item index if the item exists 167 int FindCameraMetadataItemIndex(const common_metadata_header_t *src, uint32_t item, uint32_t *index); 168 169 // Get camera metadata item name 170 const char *GetCameraMetadataItemName(uint32_t item); 171 172 // Update camera metadata item and fill the updated item 173 int UpdateCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, uint32_t dataCount, 174 camera_metadata_item_t *updatedItem); 175 176 // Update camera metadata item by index and fill the updated item 177 int UpdateCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index, const void *data, 178 uint32_t dataCount, camera_metadata_item_t *updated_item); 179 180 // Add camera metadata item 181 int AddCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, size_t dataCount); 182 183 // Delete camera metadata item 184 int DeleteCameraMetadataItem(common_metadata_header_t *dst, uint32_t item); 185 186 // Delete camera metadata item by index 187 int DeleteCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index); 188 189 // Free camera metadata buffer 190 void FreeCameraMetadataBuffer(common_metadata_header_t *dst); 191 192 std::string MetadataItemDump(const common_metadata_header_t *metadataHeader, uint32_t item); 193 194 std::string FormatCameraMetadataToString(const common_metadata_header_t *metadataHeader); 195 196 // Internal use 197 camera_metadata_item_entry_t *GetMetadataItems(const common_metadata_header_t *metadataHeader); 198 uint8_t *GetMetadataData(const common_metadata_header_t *metadataHeader); 199 int GetCameraMetadataItem(const common_metadata_header_t *src, uint32_t index, camera_metadata_item_t *item); 200 uint32_t GetCameraMetadataItemCount(const common_metadata_header_t *metadata_header); 201 uint32_t GetCameraMetadataItemCapacity(const common_metadata_header_t *metadata_header); 202 uint32_t GetCameraMetadataDataSize(const common_metadata_header_t *metadata_header); 203 int32_t CopyCameraMetadataItems(common_metadata_header_t *newMetadata, 204 const common_metadata_header_t *oldMetadata); 205 int32_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count); 206 int32_t GetCameraMetadataItemType(uint32_t item, uint32_t *data_type); 207 common_metadata_header_t *FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired, 208 uint32_t itemCapacity, uint32_t dataCapacity); 209 int32_t GetMetadataSection(uint32_t itemSection, uint32_t *section); 210 int MetadataExpandItemMem(common_metadata_header_t *dst, camera_metadata_item_entry_t *item, 211 size_t oldItemSize); 212 int32_t GetAllVendorTags(std::vector<vendorTag_t>& tagVec); 213 } // Camera 214 #endif // CAMERA_METADATA_OPERATOR_H 215