xref: /freebsd/sys/sys/videoio.h (revision a8c126b6903e83a10a726019d3d347b20bfc86e3)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  *  Video for Linux Two header file
5  *
6  *  Copyright (C) 1999-2012 the contributors
7  *  Copyright (C) 2012 Nokia Corporation
8  *  Contact: Sakari Ailus <sakari.ailus@iki.fi>
9  *
10  *  Redistribution and use in source and binary forms, with or without
11  *  modification, are permitted provided that the following conditions
12  *  are met:
13  *  1. Redistributions of source code must retain the above copyright
14  *     notice, this list of conditions and the following disclaimer.
15  *  2. Redistributions in binary form must reproduce the above copyright
16  *     notice, this list of conditions and the following disclaimer in
17  *     the documentation and/or other materials provided with the
18  *     distribution.
19  *  3. The names of its contributors may not be used to endorse or promote
20  *     products derived from this software without specific prior written
21  *     permission.
22  *
23  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29  *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30  *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31  *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32  *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33  *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34  *
35  *  Minimal V4L2 definitions for the video(4) framework.
36  *  Extracted from OpenBSD sys/videoio.h.
37  */
38 
39 #ifndef _SYS_VIDEOIO_H_
40 #define _SYS_VIDEOIO_H_
41 
42 #include <sys/types.h>
43 #include <sys/ioccom.h>
44 #include <sys/time.h>
45 
46 typedef u_int64_t v4l2_std_id;
47 
48 /*
49  *  Four-character-code (FOURCC)
50  */
51 #define v4l2_fourcc(a, b, c, d)	\
52 	((u_int32_t)(a) | ((u_int32_t)(b) << 8) | \
53 	 ((u_int32_t)(c) << 16) | ((u_int32_t)(d) << 24))
54 
55 /*
56  *  Enums
57  */
58 enum v4l2_field {
59 	V4L2_FIELD_ANY           = 0,
60 	V4L2_FIELD_NONE          = 1,
61 	V4L2_FIELD_TOP           = 2,
62 	V4L2_FIELD_BOTTOM        = 3,
63 	V4L2_FIELD_INTERLACED    = 4,
64 	V4L2_FIELD_SEQ_TB        = 5,
65 	V4L2_FIELD_SEQ_BT        = 6,
66 	V4L2_FIELD_ALTERNATE     = 7,
67 	V4L2_FIELD_INTERLACED_TB = 8,
68 	V4L2_FIELD_INTERLACED_BT = 9,
69 };
70 
71 enum v4l2_buf_type {
72 	V4L2_BUF_TYPE_VIDEO_CAPTURE        = 1,
73 	V4L2_BUF_TYPE_VIDEO_OUTPUT         = 2,
74 	V4L2_BUF_TYPE_VIDEO_OVERLAY        = 3,
75 	V4L2_BUF_TYPE_VBI_CAPTURE          = 4,
76 	V4L2_BUF_TYPE_VBI_OUTPUT           = 5,
77 	V4L2_BUF_TYPE_SLICED_VBI_CAPTURE   = 6,
78 	V4L2_BUF_TYPE_SLICED_VBI_OUTPUT    = 7,
79 	V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
80 	V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9,
81 	V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE  = 10,
82 	V4L2_BUF_TYPE_SDR_CAPTURE          = 11,
83 	V4L2_BUF_TYPE_SDR_OUTPUT           = 12,
84 	V4L2_BUF_TYPE_META_CAPTURE         = 13,
85 	V4L2_BUF_TYPE_META_OUTPUT          = 14,
86 	/* Deprecated, do not use */
87 	V4L2_BUF_TYPE_PRIVATE              = 0x80,
88 };
89 
90 enum v4l2_memory {
91 	V4L2_MEMORY_MMAP             = 1,
92 	V4L2_MEMORY_USERPTR          = 2,
93 	V4L2_MEMORY_OVERLAY          = 3,
94 	V4L2_MEMORY_DMABUF           = 4,
95 };
96 
97 enum v4l2_colorspace {
98 	V4L2_COLORSPACE_DEFAULT       = 0,
99 	V4L2_COLORSPACE_SMPTE170M     = 1,
100 	V4L2_COLORSPACE_SMPTE240M     = 2,
101 	V4L2_COLORSPACE_REC709        = 3,
102 	V4L2_COLORSPACE_BT878         = 4,
103 	V4L2_COLORSPACE_470_SYSTEM_M  = 5,
104 	V4L2_COLORSPACE_470_SYSTEM_BG = 6,
105 	V4L2_COLORSPACE_JPEG          = 7,
106 	V4L2_COLORSPACE_SRGB          = 8,
107 	V4L2_COLORSPACE_OPRGB         = 9,
108 	V4L2_COLORSPACE_BT2020        = 10,
109 	V4L2_COLORSPACE_RAW           = 11,
110 	V4L2_COLORSPACE_DCI_P3        = 12,
111 };
112 
113 enum v4l2_xfer_func {
114 	V4L2_XFER_FUNC_DEFAULT     = 0,
115 	V4L2_XFER_FUNC_709         = 1,
116 	V4L2_XFER_FUNC_SRGB        = 2,
117 	V4L2_XFER_FUNC_OPRGB       = 3,
118 	V4L2_XFER_FUNC_SMPTE240M   = 4,
119 	V4L2_XFER_FUNC_NONE        = 5,
120 	V4L2_XFER_FUNC_DCI_P3      = 6,
121 	V4L2_XFER_FUNC_SMPTE2084   = 7,
122 };
123 
124 enum v4l2_ycbcr_encoding {
125 	V4L2_YCBCR_ENC_DEFAULT        = 0,
126 	V4L2_YCBCR_ENC_601            = 1,
127 	V4L2_YCBCR_ENC_709            = 2,
128 	V4L2_YCBCR_ENC_XV601          = 3,
129 	V4L2_YCBCR_ENC_XV709          = 4,
130 	V4L2_YCBCR_ENC_SYCC           = 5,
131 	V4L2_YCBCR_ENC_BT2020         = 6,
132 	V4L2_YCBCR_ENC_BT2020_CONST_LUM = 7,
133 	V4L2_YCBCR_ENC_SMPTE240M      = 8,
134 };
135 
136 enum v4l2_ctrl_type {
137 	V4L2_CTRL_TYPE_INTEGER       = 1,
138 	V4L2_CTRL_TYPE_BOOLEAN       = 2,
139 	V4L2_CTRL_TYPE_MENU          = 3,
140 	V4L2_CTRL_TYPE_BUTTON        = 4,
141 	V4L2_CTRL_TYPE_INTEGER64     = 5,
142 	V4L2_CTRL_TYPE_CTRL_CLASS    = 6,
143 	V4L2_CTRL_TYPE_STRING        = 7,
144 	V4L2_CTRL_TYPE_BITMASK       = 8,
145 	V4L2_CTRL_TYPE_INTEGER_MENU  = 9,
146 };
147 
148 enum v4l2_frmsizetypes {
149 	V4L2_FRMSIZE_TYPE_DISCRETE   = 1,
150 	V4L2_FRMSIZE_TYPE_CONTINUOUS = 2,
151 	V4L2_FRMSIZE_TYPE_STEPWISE   = 3,
152 };
153 
154 enum v4l2_frmivaltypes {
155 	V4L2_FRMIVAL_TYPE_DISCRETE   = 1,
156 	V4L2_FRMIVAL_TYPE_CONTINUOUS = 2,
157 	V4L2_FRMIVAL_TYPE_STEPWISE   = 3,
158 };
159 
160 /*
161  *  Structures
162  */
163 struct v4l2_fract {
164 	u_int32_t   numerator;
165 	u_int32_t   denominator;
166 };
167 
168 struct v4l2_capability {
169 	u_int8_t	driver[16];
170 	u_int8_t	card[32];
171 	u_int8_t	bus_info[32];
172 	u_int32_t	version;
173 	u_int32_t	capabilities;
174 	u_int32_t	device_caps;
175 	u_int32_t	reserved[3];
176 };
177 
178 struct v4l2_pix_format {
179 	u_int32_t		width;
180 	u_int32_t		height;
181 	u_int32_t		pixelformat;
182 	u_int32_t		field;		/* enum v4l2_field */
183 	u_int32_t		bytesperline;	/* for padding, zero if unused */
184 	u_int32_t		sizeimage;
185 	u_int32_t		colorspace;	/* enum v4l2_colorspace */
186 	u_int32_t		priv;		/* private data, depends on pixelformat */
187 	u_int32_t		flags;		/* format flags (V4L2_PIX_FMT_FLAG_*) */
188 	union {
189 		/* enum v4l2_ycbcr_encoding */
190 		u_int32_t	ycbcr_enc;
191 		/* enum v4l2_hsv_encoding */
192 		u_int32_t	hsv_enc;
193 	};
194 	u_int32_t		quantization;	/* enum v4l2_quantization */
195 	u_int32_t		xfer_func;	/* enum v4l2_xfer_func */
196 };
197 
198 /*
199  *  Multi-planar capture (VIDIOC_*_MPLANE)
200  */
201 #define VIDEO_MAX_PLANES	8
202 
203 struct v4l2_plane_pix_format {
204 	u_int32_t	sizeimage;
205 	u_int32_t	bytesperline;
206 	u_int16_t	reserved[6];
207 } __packed;
208 
209 struct v4l2_pix_format_mplane {
210 	u_int32_t			width;
211 	u_int32_t			height;
212 	u_int32_t			pixelformat;
213 	u_int32_t			field;
214 	u_int32_t			colorspace;
215 	struct v4l2_plane_pix_format	plane_fmt[VIDEO_MAX_PLANES];
216 	u_int8_t			num_planes;
217 	u_int8_t			flags;
218 	union {
219 		u_int8_t		ycbcr_enc;
220 		u_int8_t		hsv_enc;
221 	};
222 	u_int8_t			quantization;
223 	u_int8_t			xfer_func;
224 	u_int8_t			reserved[7];
225 } __packed;
226 
227 #define V4L2_TYPE_IS_MULTIPLANAR(type)				\
228 	((type) == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ||	\
229 	 (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
230 
231 struct v4l2_format {
232 	u_int32_t	type;
233 	union {
234 		struct v4l2_pix_format		pix;
235 		struct v4l2_pix_format_mplane	pix_mp;
236 		void				*_align;
237 		u_int8_t			raw_data[200];
238 	} fmt;
239 };
240 
241 struct v4l2_fmtdesc {
242 	u_int32_t		index;		/* Format number      */
243 	u_int32_t		type;		/* enum v4l2_buf_type */
244 	u_int32_t		flags;
245 	u_int8_t		description[32]; /* Description string */
246 	u_int32_t		pixelformat;	/* Format fourcc      */
247 	u_int32_t		mbus_code;	/* Media bus code    */
248 	u_int32_t		reserved[3];
249 };
250 
251 struct v4l2_timecode {
252 	u_int32_t	type;
253 	u_int32_t	flags;
254 	u_int8_t	frames;
255 	u_int8_t	seconds;
256 	u_int8_t	minutes;
257 	u_int8_t	hours;
258 	u_int8_t	userbits[4];
259 };
260 
261 struct v4l2_buffer {
262 	u_int32_t			index;
263 	u_int32_t			type;
264 	u_int32_t			bytesused;
265 	u_int32_t			flags;
266 	u_int32_t			field;
267 	struct timeval			timestamp;
268 	struct v4l2_timecode		timecode;
269 	u_int32_t			sequence;
270 
271 	/* memory location */
272 	u_int32_t			memory;
273 	union {
274 		u_int32_t		offset;
275 		unsigned long		userptr;
276 		struct v4l2_plane	*planes;
277 		int32_t			fd;
278 	} m;
279 	u_int32_t			length;
280 	u_int32_t			reserved2;
281 	union {
282 		int32_t			request_fd;
283 		u_int32_t		reserved;
284 	};
285 };
286 
287 struct v4l2_requestbuffers {
288 	u_int32_t		count;
289 	u_int32_t		type;		/* enum v4l2_buf_type */
290 	u_int32_t		memory;		/* enum v4l2_memory */
291 	u_int32_t		capabilities;
292 	u_int8_t		flags;
293 	u_int8_t		reserved[3];
294 };
295 
296 struct v4l2_captureparm {
297 	u_int32_t		capability;	/*  Supported modes */
298 	u_int32_t		capturemode;	/*  Current mode */
299 	struct v4l2_fract	timeperframe;	/*  Time per frame in seconds */
300 	u_int32_t		extendedmode;	/*  Driver-specific extensions */
301 	u_int32_t		readbuffers;	/*  # of buffers for read */
302 	u_int32_t		reserved[4];
303 };
304 
305 /* Simplified v4l2_streamparm: only the capture member is included */
306 struct v4l2_streamparm {
307 	u_int32_t	type;			/* enum v4l2_buf_type */
308 	union {
309 		struct v4l2_captureparm	capture;
310 		u_int8_t		raw_data[200];
311 	} parm;
312 };
313 
314 struct v4l2_input {
315 	u_int32_t	index;		/*  Which input */
316 	u_int8_t	name[32];	/*  Label */
317 	u_int32_t	type;		/*  Type of input */
318 	u_int32_t	audioset;	/*  Associated audios (bitfield) */
319 	u_int32_t	tuner;		/*  Tuner index */
320 	u_int64_t	std;
321 	u_int32_t	status;
322 	u_int32_t	capabilities;
323 	u_int32_t	reserved[3];
324 };
325 
326 struct v4l2_standard {
327 	u_int32_t		index;
328 	v4l2_std_id		id;
329 	u_int8_t		name[24];
330 	struct v4l2_fract	frameperiod;
331 	u_int32_t		framelines;
332 	u_int32_t		reserved[4];
333 };
334 
335 struct v4l2_plane {
336 	u_int32_t	bytesused;
337 	u_int32_t	length;
338 	union {
339 		u_int32_t	mem_offset;
340 		unsigned long	userptr;
341 		int32_t		fd;
342 	} m;
343 	u_int32_t	data_offset;
344 	u_int32_t	reserved[11];
345 };
346 
347 struct v4l2_control {
348 	u_int32_t	id;
349 	int32_t		value;
350 };
351 
352 struct v4l2_queryctrl {
353 	u_int32_t	id;
354 	u_int32_t	type;		/* enum v4l2_ctrl_type */
355 	u_int8_t	name[32];	/* Whatever */
356 	int32_t		minimum;	/* Note signedness */
357 	int32_t		maximum;
358 	int32_t		step;
359 	int32_t		default_value;
360 	u_int32_t	flags;
361 	u_int32_t	reserved[2];
362 };
363 
364 struct v4l2_frmsize_discrete {
365 	u_int32_t	width;		/* Frame width [pixel] */
366 	u_int32_t	height;		/* Frame height [pixel] */
367 };
368 
369 struct v4l2_frmsize_stepwise {
370 	u_int32_t	min_width;	/* Minimum frame width [pixel] */
371 	u_int32_t	max_width;	/* Maximum frame width [pixel] */
372 	u_int32_t	step_width;	/* Frame width step size [pixel] */
373 	u_int32_t	min_height;	/* Minimum frame height [pixel] */
374 	u_int32_t	max_height;	/* Maximum frame height [pixel] */
375 	u_int32_t	step_height;	/* Frame height step size [pixel] */
376 };
377 
378 struct v4l2_frmsizeenum {
379 	u_int32_t	index;		/* Frame size number */
380 	u_int32_t	pixel_format;	/* Pixel format */
381 	u_int32_t	type;		/* Frame size type the device supports. */
382 
383 	union {				/* Frame size */
384 		struct v4l2_frmsize_discrete	discrete;
385 		struct v4l2_frmsize_stepwise	stepwise;
386 	};
387 
388 	u_int32_t	reserved[2];	/* Reserved space for future use */
389 };
390 
391 struct v4l2_frmival_stepwise {
392 	struct v4l2_fract	min;	/* Minimum frame interval [s] */
393 	struct v4l2_fract	max;	/* Maximum frame interval [s] */
394 	struct v4l2_fract	step;	/* Frame interval step size [s] */
395 };
396 
397 struct v4l2_frmivalenum {
398 	u_int32_t	index;		/* Frame format index */
399 	u_int32_t	pixel_format;	/* Pixel format */
400 	u_int32_t	width;		/* Frame width */
401 	u_int32_t	height;		/* Frame height */
402 	u_int32_t	type;		/* Frame interval type the device supports. */
403 
404 	union {				/* Frame interval */
405 		struct v4l2_fract		discrete;
406 		struct v4l2_frmival_stepwise	stepwise;
407 	};
408 
409 	u_int32_t	reserved[2];	/* Reserved space for future use */
410 };
411 
412 /*
413  *  Pixel formats
414  */
415 
416 /* Luminance+Chrominance formats */
417 #define V4L2_PIX_FMT_YUYV	v4l2_fourcc('Y', 'U', 'Y', 'V')
418 #define V4L2_PIX_FMT_UYVY	v4l2_fourcc('U', 'Y', 'V', 'Y')
419 #define V4L2_PIX_FMT_YUV444	v4l2_fourcc('Y', '4', '4', '4')
420 #define V4L2_PIX_FMT_Y41P	v4l2_fourcc('Y', '4', '1', 'P')
421 #define V4L2_PIX_FMT_NV12	v4l2_fourcc('N', 'V', '1', '2')
422 #define V4L2_PIX_FMT_NV21	v4l2_fourcc('N', 'V', '2', '1')
423 #define V4L2_PIX_FMT_M420	v4l2_fourcc('M', '4', '2', '0')
424 #define V4L2_PIX_FMT_YVU420	v4l2_fourcc('Y', 'V', '1', '2')
425 #define V4L2_PIX_FMT_YUV420	v4l2_fourcc('Y', 'U', '1', '2')
426 #define V4L2_PIX_FMT_YUV410	v4l2_fourcc('Y', 'U', 'V', '9')
427 #define V4L2_PIX_FMT_YVU410	v4l2_fourcc('Y', 'V', 'U', '9')
428 #define V4L2_PIX_FMT_YUV422P	v4l2_fourcc('4', '2', '2', 'P')
429 
430 /* Compressed formats */
431 #define V4L2_PIX_FMT_MJPEG	v4l2_fourcc('M', 'J', 'P', 'G')
432 #define V4L2_PIX_FMT_JPEG	v4l2_fourcc('J', 'P', 'E', 'G')
433 #define V4L2_PIX_FMT_H264	v4l2_fourcc('H', '2', '6', '4')
434 #define V4L2_PIX_FMT_HEVC	v4l2_fourcc('H', 'E', 'V', 'C')
435 #define V4L2_PIX_FMT_MPEG4	v4l2_fourcc('M', 'P', 'G', '4')
436 #define V4L2_PIX_FMT_CPIA1	v4l2_fourcc('C', 'P', 'I', 'A')
437 
438 /* YUV411 planar and vendor webcam formats */
439 #define V4L2_PIX_FMT_YUV411P	v4l2_fourcc('4', '1', '1', 'P')
440 #define V4L2_PIX_FMT_SN9C10X	v4l2_fourcc('S', '9', '1', '0')
441 
442 /* Grey formats */
443 #define V4L2_PIX_FMT_GREY	v4l2_fourcc('G', 'R', 'E', 'Y')
444 #define V4L2_PIX_FMT_Y10	v4l2_fourcc('Y', '1', '0', ' ')
445 #define V4L2_PIX_FMT_Y12	v4l2_fourcc('Y', '1', '2', ' ')
446 #define V4L2_PIX_FMT_Y16	v4l2_fourcc('Y', '1', '6', ' ')
447 
448 /* RGB formats */
449 #define V4L2_PIX_FMT_RGB24	v4l2_fourcc('R', 'G', 'B', '3')
450 #define V4L2_PIX_FMT_RGB555	v4l2_fourcc('R', 'G', 'B', 'O')
451 #define V4L2_PIX_FMT_RGB555X	v4l2_fourcc('R', 'G', 'B', 'Q')
452 #define V4L2_PIX_FMT_RGB565	v4l2_fourcc('R', 'G', 'B', 'P')
453 #define V4L2_PIX_FMT_RGB565X	v4l2_fourcc('R', 'G', 'B', 'R')
454 #define V4L2_PIX_FMT_BGR24	v4l2_fourcc('B', 'G', 'R', '3')
455 #define V4L2_PIX_FMT_BGR32	v4l2_fourcc('B', 'G', 'R', '4')
456 #define V4L2_PIX_FMT_RGB32	v4l2_fourcc('R', 'G', 'B', '4')
457 #define V4L2_PIX_FMT_XBGR32	v4l2_fourcc('X', 'R', '2', '4')
458 #define V4L2_PIX_FMT_ABGR32	v4l2_fourcc('A', 'R', '2', '4')
459 #define V4L2_PIX_FMT_ARGB32	v4l2_fourcc('B', 'A', '2', '4')
460 #define V4L2_PIX_FMT_XRGB32	v4l2_fourcc('B', 'X', '2', '4')
461 
462 /* Bayer formats */
463 #define V4L2_PIX_FMT_SBGGR8	v4l2_fourcc('B', 'A', '8', '1')
464 #define V4L2_PIX_FMT_SGBRG8	v4l2_fourcc('G', 'B', 'R', 'G')
465 #define V4L2_PIX_FMT_SGRBG8	v4l2_fourcc('G', 'R', 'B', 'G')
466 #define V4L2_PIX_FMT_SRGGB8	v4l2_fourcc('R', 'G', 'G', 'B')
467 #define V4L2_PIX_FMT_SBGGR16	v4l2_fourcc('B', 'Y', 'R', '2')
468 #define V4L2_PIX_FMT_SGBRG16	v4l2_fourcc('G', 'B', '1', '6')
469 #define V4L2_PIX_FMT_SRGGB16	v4l2_fourcc('R', 'G', '1', '6')
470 #define V4L2_PIX_FMT_SGRBG16	v4l2_fourcc('G', 'R', '1', '6')
471 #define V4L2_PIX_FMT_SRGGB10P	v4l2_fourcc('p', 'R', 'A', 'A')
472 
473 /* Depth format */
474 #define V4L2_PIX_FMT_Z16	v4l2_fourcc('Z', '1', '6', ' ')
475 
476 /*
477  *  Capability flags
478  */
479 #define V4L2_CAP_VIDEO_CAPTURE		0x00000001
480 #define V4L2_CAP_VIDEO_CAPTURE_MPLANE	0x00001000
481 #define V4L2_CAP_STREAMING		0x04000000
482 #define V4L2_CAP_EXT_PIX_FORMAT		0x00200000
483 #define V4L2_CAP_READWRITE		0x01000000
484 #define V4L2_CAP_DEVICE_CAPS		0x80000000
485 #define V4L2_CAP_TIMEPERFRAME		0x1000
486 
487 /*
488  *  Buffer flags
489  */
490 #define V4L2_BUF_FLAG_MAPPED		0x00000001
491 #define V4L2_BUF_FLAG_QUEUED		0x00000002
492 #define V4L2_BUF_FLAG_DONE		0x00000004
493 #define V4L2_BUF_FLAG_ERROR		0x00000040
494 #define V4L2_BUF_FLAG_TIMESTAMP_MASK	0x0000e000
495 #define V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC 0x00002000
496 #define V4L2_BUF_FLAG_TSTAMP_SRC_MASK	0x00070000
497 #define V4L2_BUF_FLAG_TSTAMP_SRC_EOF	0x00000000
498 #define V4L2_BUF_FLAG_TIMECODE		0x00000100
499 
500 /*
501  *  Format flags
502  */
503 #define V4L2_FMT_FLAG_COMPRESSED	0x0001
504 #define V4L2_FMT_FLAG_EMULATED		0x0002
505 
506 /*
507  *  Buffer capabilities
508  */
509 #define V4L2_BUF_CAP_SUPPORTS_MMAP	(1 << 0)
510 
511 /*
512  *  Input types
513  */
514 #define V4L2_INPUT_TYPE_CAMERA		2
515 
516 /*
517  *  Analog TV standards
518  */
519 #define V4L2_STD_NTSC_M		((v4l2_std_id)0x00001000)
520 #define V4L2_STD_NTSC_M_JP	((v4l2_std_id)0x00002000)
521 #define V4L2_STD_NTSC_443	((v4l2_std_id)0x00004000)
522 #define V4L2_STD_NTSC_M_KR	((v4l2_std_id)0x00008000)
523 #define V4L2_STD_NTSC		(V4L2_STD_NTSC_M | V4L2_STD_NTSC_M_JP | \
524 				 V4L2_STD_NTSC_443 | V4L2_STD_NTSC_M_KR)
525 
526 /*
527  *  Control IDs
528  */
529 #define V4L2_CTRL_CLASS_USER		0x00980000
530 #define V4L2_CTRL_CLASS_MPEG		0x00990000
531 #define V4L2_CID_BASE			(V4L2_CTRL_CLASS_USER | 0x900)
532 
533 /*
534  *  MPEG/codec control class
535  */
536 #define V4L2_CID_MPEG_BASE		(V4L2_CTRL_CLASS_MPEG | 0x900)
537 #define V4L2_CID_MPEG_VIDEO_B_FRAMES	(V4L2_CID_MPEG_BASE+14)
538 #define V4L2_CID_BRIGHTNESS		(V4L2_CID_BASE + 0)
539 #define V4L2_CID_CONTRAST		(V4L2_CID_BASE + 1)
540 #define V4L2_CID_SATURATION		(V4L2_CID_BASE + 2)
541 #define V4L2_CID_HUE			(V4L2_CID_BASE + 3)
542 #define V4L2_CID_AUTO_WHITE_BALANCE	(V4L2_CID_BASE + 12)
543 #define V4L2_CID_RED_BALANCE		(V4L2_CID_BASE + 14)
544 #define V4L2_CID_BLUE_BALANCE		(V4L2_CID_BASE + 15)
545 #define V4L2_CID_GAMMA			(V4L2_CID_BASE + 16)
546 #define V4L2_CID_GAIN			(V4L2_CID_BASE + 19)
547 #define V4L2_CID_POWER_LINE_FREQUENCY	(V4L2_CID_BASE + 24)
548 #define V4L2_CID_HUE_AUTO		(V4L2_CID_BASE + 25)
549 #define V4L2_CID_WHITE_BALANCE_TEMPERATURE (V4L2_CID_BASE + 26)
550 #define V4L2_CID_SHARPNESS		(V4L2_CID_BASE + 27)
551 #define V4L2_CID_BACKLIGHT_COMPENSATION	(V4L2_CID_BASE + 28)
552 
553 #define V4L2_CID_CAMERA_CLASS_BASE	0x009a0000
554 #define V4L2_CID_EXPOSURE_AUTO		(V4L2_CID_CAMERA_CLASS_BASE + 1)
555 #define V4L2_CID_EXPOSURE_ABSOLUTE	(V4L2_CID_CAMERA_CLASS_BASE + 2)
556 #define V4L2_CID_EXPOSURE_AUTO_PRIORITY	(V4L2_CID_CAMERA_CLASS_BASE + 3)
557 #define V4L2_CID_FOCUS_ABSOLUTE		(V4L2_CID_CAMERA_CLASS_BASE + 4)
558 #define V4L2_CID_FOCUS_RELATIVE		(V4L2_CID_CAMERA_CLASS_BASE + 5)
559 #define V4L2_CID_PAN_ABSOLUTE		(V4L2_CID_CAMERA_CLASS_BASE + 8)
560 #define V4L2_CID_TILT_ABSOLUTE		(V4L2_CID_CAMERA_CLASS_BASE + 9)
561 #define V4L2_CID_FOCUS_AUTO		(V4L2_CID_CAMERA_CLASS_BASE + 12)
562 #define V4L2_CID_ZOOM_ABSOLUTE		(V4L2_CID_CAMERA_CLASS_BASE + 13)
563 #define V4L2_CID_ZOOM_CONTINUOUS	(V4L2_CID_CAMERA_CLASS_BASE + 15)
564 #define V4L2_CID_PRIVACY		(V4L2_CID_CAMERA_CLASS_BASE + 16)
565 
566 /*
567  *  V4L2 ioctl definitions
568  */
569 #define VIDIOC_QUERYCAP		_IOR('V',  0, struct v4l2_capability)
570 #define VIDIOC_ENUM_FMT		_IOWR('V',  2, struct v4l2_fmtdesc)
571 #define VIDIOC_G_FMT		_IOWR('V',  4, struct v4l2_format)
572 #define VIDIOC_S_FMT		_IOWR('V',  5, struct v4l2_format)
573 #define VIDIOC_REQBUFS		_IOWR('V',  8, struct v4l2_requestbuffers)
574 #define VIDIOC_QUERYBUF		_IOWR('V',  9, struct v4l2_buffer)
575 #define VIDIOC_QBUF		_IOWR('V', 15, struct v4l2_buffer)
576 #define VIDIOC_DQBUF		_IOWR('V', 17, struct v4l2_buffer)
577 #define VIDIOC_STREAMON		_IOW('V', 18, int)
578 #define VIDIOC_STREAMOFF	_IOW('V', 19, int)
579 #define VIDIOC_G_PARM		_IOWR('V', 21, struct v4l2_streamparm)
580 #define VIDIOC_S_PARM		_IOWR('V', 22, struct v4l2_streamparm)
581 #define VIDIOC_G_STD		_IOR('V', 23, v4l2_std_id)
582 #define VIDIOC_S_STD		_IOW('V', 24, v4l2_std_id)
583 #define VIDIOC_ENUMSTD		_IOWR('V', 25, struct v4l2_standard)
584 #define VIDIOC_ENUMINPUT	_IOWR('V', 26, struct v4l2_input)
585 #define VIDIOC_G_CTRL		_IOWR('V', 27, struct v4l2_control)
586 #define VIDIOC_S_CTRL		_IOWR('V', 28, struct v4l2_control)
587 #define VIDIOC_QUERYCTRL	_IOWR('V', 36, struct v4l2_queryctrl)
588 #define VIDIOC_G_INPUT		_IOR('V', 38, int)
589 #define VIDIOC_S_INPUT		_IOWR('V', 39, int)
590 #define VIDIOC_G_PRIORITY	_IOR('V', 67, u_int32_t)
591 #define VIDIOC_S_PRIORITY	_IOW('V', 68, u_int32_t)
592 #define VIDIOC_TRY_FMT		_IOWR('V', 64, struct v4l2_format)
593 #define VIDIOC_ENUM_FRAMESIZES	_IOWR('V', 74, struct v4l2_frmsizeenum)
594 #define VIDIOC_ENUM_FRAMEINTERVALS _IOWR('V', 75, struct v4l2_frmivalenum)
595 
596 _Static_assert(sizeof(struct v4l2_pix_format) == 48, "v4l2_pix_format layout");
597 _Static_assert(sizeof(struct v4l2_capability) == 104, "v4l2_capability layout");
598 _Static_assert(sizeof(struct v4l2_requestbuffers) == 20,
599     "v4l2_requestbuffers layout");
600 #ifdef __LP64__
601 _Static_assert(__offsetof(struct v4l2_format, fmt) == 8, "v4l2_format layout");
602 _Static_assert(sizeof(struct v4l2_format) == 208, "v4l2_format layout");
603 _Static_assert(sizeof(struct v4l2_buffer) == 88, "v4l2_buffer layout");
604 #elif defined(__i386__)
605 /* i386 is the only 32-bit port with a 32-bit time_t. */
606 _Static_assert(__offsetof(struct v4l2_format, fmt) == 4, "v4l2_format layout");
607 _Static_assert(sizeof(struct v4l2_format) == 204, "v4l2_format layout");
608 _Static_assert(sizeof(struct v4l2_buffer) == 68, "v4l2_buffer layout");
609 #else
610 /* ILP32 with a 64-bit time_t: arm, powerpc, mips, riscv32. */
611 _Static_assert(__offsetof(struct v4l2_format, fmt) == 4, "v4l2_format layout");
612 _Static_assert(sizeof(struct v4l2_format) == 204, "v4l2_format layout");
613 _Static_assert(sizeof(struct v4l2_buffer) == 80, "v4l2_buffer layout");
614 #endif
615 
616 #endif /* _SYS_VIDEOIO_H_ */
617