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