• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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