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