summaryrefslogtreecommitdiff
path: root/include/libcamera/ipa/core.mojom
blob: 74f3339e56f219aa57a75a5d6dcd58307c3794f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/* SPDX-License-Identifier: LGPL-2.1-or-later */

module libcamera;

/**
 * \file core_ipa_interface.h
 * \brief libcamera structs for IPAs
 */

/*
 * Things that can be defined here (and in other mojom files):
 * - consts
 * - enums
 * - structs
 *
 * Attributes:
 * - skipHeader - structs only, and only in core.mojom
 *   - Do not generate a C++ definition for the structure
 *   - Any type used in a mojom interface definition must have a corresponding
 *     definition in a mojom file for the code generator to accept it, except
 *     for types solely used as map/array members for which a definition is not
 *     required
 *   - This attribute allows defining a symbol for the code generator that
 *     corresponds to a libcamera type without duplicating its definition in the
 *     generated C++ headers
 * - skipSerdes - structs only, and only in core.mojom
 *   - All types need a (de)serializer to be defined in order to be transported
 *     over IPC. The (de)serializer can be:
 *     - Manually implemented as a template specialization in
 *       ipa_data_serializer.cpp in the libcamera sources
 *     - Generated at build time for types defined in a mojom file
 *   - This attribute instructs the build system that a (de)serializer is
 *     available for the type and there's no need to generate one
 * - hasFd - struct fields or empty structs only
 *   - Designate that this field or empty struct contains a SharedFD
 *
 * Rules:
 * - If the type is defined in a libcamera C++ header *and* a (de)serializer is
 *   available then the type shall be declared as empty with both attributes
 *   associated and specified as: [skipHeader, skipSerdes]
 *   - Example: [skipHeader, skipSerdes] ControlList {};
 * - If the type is defined in libcamera but no (de)serializer is available
 *   then the type definition in the core.mojom file should have the
 *   [skipHeader] attribute only
 *   - A (de)serializer will be generated for the type
 * - If a type definition has [skipHeader], then the header where the type is
 *   defined must be included in ipa_interface.h
 * - Types that are solely used as array/map members do not require a mojom
 *   definition if one exists in libcamera
 * - Nested types (e.g. FrameBuffer::Plane) cannot be defined in mojom
 *   - If used in mojom, the nested type shall be defined in a C++ header
 *     and a (de)serializer shall be provided
 *   - Nested types can only be used as array/map members
 *   - When using the type, the C++ namespace separator :: is replaced with a
 *     dot
 *   - In example, to use the FrameBuffer::Plane type in mojom:
 *     - Provide a definition of the FrameBuffer::Plane type in a C++ header
 *     - Include the header in ipa_interface.h
 *     - Provide a (de)serializer implementation ipa_data_serializer.cpp
 *     - In mojom, reference the type as FrameBuffer.Plane and only as map/array
 *       member
 * - [skipHeader] and [skipSerdes] only work here in core.mojom
 * - If a field in a struct has a SharedFD, but is not explicitly
 *   defined so in mojom, then the field must be marked with the [hasFd]
 *   attribute
 *
 * \todo Generate documentation from Doxygen comments in .mojom files
 * \todo Figure out how to keep the skipHeader structs in sync with their
 * C++ definitions, and the skipSerdes structs in sync with their
 * (de)serializers
 */
[skipSerdes, skipHeader] struct ControlInfoMap {};
[skipSerdes, skipHeader] struct ControlList {};
[skipSerdes, skipHeader] struct SharedFD {};

[skipHeader] struct Point {
	int32 x;
	int32 y;
};

[skipHeader] struct Size {
	uint32 width;
	uint32 height;
};

[skipHeader] struct SizeRange {
	Size min;
	Size max;
	uint32 hStep;
	uint32 vStep;
};

[skipHeader] struct Rectangle {
	int32 x;
	int32 y;
	uint32 width;
	uint32 height;
};

/**
 * \struct IPACameraSensorInfo
 * \brief Report the image sensor characteristics
 *
 * The structure reports image sensor characteristics used by IPA modules to
 * tune their algorithms based on the image sensor model currently in use and
 * its configuration.
 *
 * The reported information describes the sensor's intrinsics characteristics,
 * such as its pixel array size and the sensor model name, as well as
 * information relative to the currently configured mode, such as the produced
 * image size and the bit depth of the requested image format.
 *
 * Instances of this structure are meant to be assembled by the CameraSensor
 * class by inspecting the sensor static properties as well as information
 * relative to the current configuration.
 */

/**
 * \var IPACameraSensorInfo::model
 * \brief The image sensor model name
 *
 * The sensor model name is a free-formed string that uniquely identifies the
 * sensor model.
 */

/**
 * \var IPACameraSensorInfo::bitsPerPixel
 * \brief The number of bits per pixel of the image format produced by the
 * image sensor
 */

/**
 * \var IPACameraSensorInfo::activeAreaSize
 * \brief The size of the pixel array active area of the sensor
 */

/**
 * \var IPACameraSensorInfo::analogCrop
 * \brief The portion of the pixel array active area which is read-out and
 * processed
 *
 * The analog crop rectangle top-left corner is defined as the displacement
 * from the top-left corner of the pixel array active area. The rectangle
 * horizontal and vertical sizes define the portion of the pixel array which
 * is read-out and provided to the sensor's internal processing pipeline, before
 * any pixel sub-sampling method, such as pixel binning, skipping and averaging
 * take place.
 */

/**
 * \var IPACameraSensorInfo::outputSize
 * \brief The size of the images produced by the camera sensor
 *
 * The output image size defines the horizontal and vertical sizes of the images
 * produced by the image sensor. The output image size is defined as the end
 * result of the sensor's internal image processing pipeline stages, applied on
 * the pixel array portion defined by the analog crop rectangle. Each image
 * processing stage that performs pixel sub-sampling techniques, such as pixel
 * binning or skipping, or perform any additional digital scaling concur in the
 * definition of the output image size.
 */

/**
 * \var IPACameraSensorInfo::pixelRate
 * \brief The number of pixels produced in a second
 *
 * To obtain the read-out time in seconds of a full line:
 *
 * \verbatim
       lineDuration(s) = lineLength(pixels) / pixelRate(pixels per second)
   \endverbatim
 */

/**
 * \var IPACameraSensorInfo::lineLength
 * \brief Total line length in pixels
 *
 * The total line length in pixel clock periods, including blanking.
 */

/**
 * \var IPACameraSensorInfo::minFrameLength
 * \brief The minimum allowable frame length in units of lines
 *
 * The sensor frame length comprises of active output lines and blanking lines
 * in a frame. The minimum frame length value dictates the minimum allowable
 * frame duration of the sensor mode.
 *
 * To obtain the minimum frame duration:
 *
 * \verbatim
       frameDuration(s) = minFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
   \endverbatim
 */

/**
 * \var IPACameraSensorInfo::maxFrameLength
 * \brief The maximum allowable frame length in units of lines
 *
 * The sensor frame length comprises of active output lines and blanking lines
 * in a frame. The maximum frame length value dictates the maximum allowable
 * frame duration of the sensor mode.
 *
 * To obtain the maximum frame duration:
 *
 * \verbatim
       frameDuration(s) = maxFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second)
   \endverbatim
 */
struct IPACameraSensorInfo {
	string model;

	uint32 bitsPerPixel;

	Size activeAreaSize;
	Rectangle analogCrop;
	Size outputSize;

	uint64 pixelRate;
	uint32 lineLength;

	uint32 minFrameLength;
	uint32 maxFrameLength;
};

/**
 * \struct IPABuffer
 * \brief Buffer information for the IPA interface
 *
 * The IPABuffer structure associates buffer memory with a unique ID. It is
 * used to map buffers to the IPA with IPAInterface::mapBuffers(), after which
 * buffers will be identified by their ID in the IPA interface.
 */

/**
 * \var IPABuffer::id
 * \brief The buffer unique ID
 *
 * Buffers mapped to the IPA are identified by numerical unique IDs. The IDs
 * are chosen by the pipeline handler to fulfil the following constraints:
 *
 * - IDs shall be positive integers different than zero
 * - IDs shall be unique among all mapped buffers
 *
 * When buffers are unmapped with IPAInterface::unmapBuffers() their IDs are
 * freed and may be reused for new buffer mappings.
 */

/**
 * \var IPABuffer::planes
 * \brief The buffer planes description
 *
 * Stores the dmabuf handle and length for each plane of the buffer.
 */
struct IPABuffer {
	uint32 id;
	[hasFd] array<FrameBuffer.Plane> planes;
};

/**
 * \struct IPASettings
 * \brief IPA interface initialization settings
 *
 * The IPASettings structure stores data passed to the IPAInterface::init()
 * function. The data contains settings that don't depend on a particular camera
 * or pipeline configuration and are valid for the whole life time of the IPA
 * interface.
 */

/**
 * \var IPASettings::configurationFile
 * \brief The name of the IPA configuration file
 *
 * This field may be an empty string if the IPA doesn't require a configuration
 * file.
 */

/**
 * \var IPASettings::sensorModel
 * \brief The sensor model name
 *
 * Provides the sensor model name to the IPA.
 */
struct IPASettings {
	string configurationFile;
	string sensorModel;
};

/**
 * \struct IPAStream
 * \brief Stream configuration for the IPA interface
 *
 * The IPAStream structure stores stream configuration parameters needed by the
 * IPAInterface::configure() function. It mirrors the StreamConfiguration class
 * that is not suitable for this purpose due to not being serializable.
 */

/**
 * \var IPAStream::pixelFormat
 * \brief The stream pixel format
 */

/**
 * \var IPAStream::size
 * \brief The stream size in pixels
 */
struct IPAStream {
	uint32 pixelFormat;
	Size size;
};