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