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[4]; 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_STREAM_CONTROL, 136 OHOS_SECTION_LIGHT_STATUS, 137 OHOS_SECTION_COUNT, 138 } camera_metadata_sec_t; 139 140 typedef struct VendoTagInfo { 141 uint32_t tagId; 142 const char* tagName; 143 uint8_t tagType; 144 } vendorTag_t; 145 146 /* Return codes */ 147 #define CAM_META_FAILURE (-1) 148 #define CAM_META_SUCCESS 0 149 #define CAM_META_INVALID_PARAM 2 150 #define CAM_META_ITEM_NOT_FOUND 3 151 #define CAM_META_ITEM_CAP_EXCEED 4 152 #define CAM_META_DATA_CAP_EXCEED 5 153 154 /* for shift opereration */ 155 #define BITWISE_SHIFT_16 16 156 157 namespace OHOS::Camera { 158 // Allocate a new camera metadata buffer and return the metadata header 159 common_metadata_header_t *AllocateCameraMetadataBuffer(uint32_t item_capacity, uint32_t data_capacity); 160 161 // Is camera metadata item exist 162 bool IsCameraMetadataItemExist(const common_metadata_header_t *src, uint32_t item); 163 164 // Find camera metadata item and fill the found item 165 int FindCameraMetadataItem(const common_metadata_header_t *src, uint32_t item, 166 camera_metadata_item_t *metadataItem); 167 168 // Find camera metadata item index if the item exists 169 int FindCameraMetadataItemIndex(const common_metadata_header_t *src, uint32_t item, uint32_t *index); 170 171 // Get camera metadata item name 172 const char *GetCameraMetadataItemName(uint32_t item); 173 174 // Update camera metadata item and fill the updated item 175 int UpdateCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, uint32_t dataCount, 176 camera_metadata_item_t *updatedItem); 177 178 // Update camera metadata item by index and fill the updated item 179 int UpdateCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index, const void *data, 180 uint32_t dataCount, camera_metadata_item_t *updated_item); 181 182 // Add camera metadata item 183 int AddCameraMetadataItem(common_metadata_header_t *dst, uint32_t item, const void *data, size_t dataCount); 184 185 // Delete camera metadata item 186 int DeleteCameraMetadataItem(common_metadata_header_t *dst, uint32_t item); 187 188 // Delete camera metadata item by index 189 int DeleteCameraMetadataItemByIndex(common_metadata_header_t *dst, uint32_t index); 190 191 // Free camera metadata buffer 192 void FreeCameraMetadataBuffer(common_metadata_header_t *dst); 193 194 std::string MetadataItemDump(const common_metadata_header_t *metadataHeader, uint32_t item); 195 196 std::string FormatCameraMetadataToString(const common_metadata_header_t *metadataHeader); 197 198 // Internal use 199 camera_metadata_item_entry_t *GetMetadataItems(const common_metadata_header_t *metadataHeader); 200 uint8_t *GetMetadataData(const common_metadata_header_t *metadataHeader); 201 int GetCameraMetadataItem(const common_metadata_header_t *src, uint32_t index, camera_metadata_item_t *item); 202 uint32_t GetCameraMetadataItemCount(const common_metadata_header_t *metadata_header); 203 uint32_t GetCameraMetadataItemCapacity(const common_metadata_header_t *metadata_header); 204 uint32_t GetCameraMetadataDataSize(const common_metadata_header_t *metadata_header); 205 int32_t CopyCameraMetadataItems(common_metadata_header_t *newMetadata, 206 const common_metadata_header_t *oldMetadata); 207 int32_t CalculateCameraMetadataItemDataSize(uint32_t type, size_t data_count); 208 int32_t GetCameraMetadataItemType(uint32_t item, uint32_t *data_type); 209 common_metadata_header_t *FillCameraMetadata(common_metadata_header_t *buffer, size_t memoryRequired, 210 uint32_t itemCapacity, uint32_t dataCapacity); 211 int32_t GetMetadataSection(uint32_t itemSection, uint32_t *section); 212 int MetadataExpandItemMem(common_metadata_header_t *dst, camera_metadata_item_entry_t *item, 213 size_t oldItemSize); 214 int32_t GetAllVendorTags(std::vector<vendorTag_t>& tagVec); 215 } // Camera 216 #endif // CAMERA_METADATA_OPERATOR_H 217