xref: /freebsd/sys/dev/usb/video/uvideo.h (revision 3b6f833c95eb65b29a9f506928467236a11d5169)
1b711ef9cSBaptiste Daroussin /*	$OpenBSD: uvideo.h,v 1.71 2025/09/06 13:45:41 kirill Exp $ */
2b711ef9cSBaptiste Daroussin 
3b711ef9cSBaptiste Daroussin /*
4b711ef9cSBaptiste Daroussin  * Copyright (c) 2007 Robert Nagy <robert@openbsd.org>
5b711ef9cSBaptiste Daroussin  * Copyright (c) 2008 Marcus Glocker <mglocker@openbsd.org>
6b711ef9cSBaptiste Daroussin  *
7b711ef9cSBaptiste Daroussin  * Permission to use, copy, modify, and distribute this software for any
8b711ef9cSBaptiste Daroussin  * purpose with or without fee is hereby granted, provided that the above
9b711ef9cSBaptiste Daroussin  * copyright notice and this permission notice appear in all copies.
10b711ef9cSBaptiste Daroussin  *
11b711ef9cSBaptiste Daroussin  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12b711ef9cSBaptiste Daroussin  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13b711ef9cSBaptiste Daroussin  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14b711ef9cSBaptiste Daroussin  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15b711ef9cSBaptiste Daroussin  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16b711ef9cSBaptiste Daroussin  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17b711ef9cSBaptiste Daroussin  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18b711ef9cSBaptiste Daroussin  */
19b711ef9cSBaptiste Daroussin 
20b711ef9cSBaptiste Daroussin #ifndef _UVIDEO_H_
21b711ef9cSBaptiste Daroussin #define _UVIDEO_H_
22b711ef9cSBaptiste Daroussin 
23b711ef9cSBaptiste Daroussin #include <sys/queue.h>
24b711ef9cSBaptiste Daroussin #include "uvideo_v4l2.h"
25b711ef9cSBaptiste Daroussin 
26b711ef9cSBaptiste Daroussin /*
27b711ef9cSBaptiste Daroussin  * USB Video Class
28b711ef9cSBaptiste Daroussin  */
29b711ef9cSBaptiste Daroussin /* Table A-7: Video Class-Specific Endpoint Descriptor Subtypes */
30b711ef9cSBaptiste Daroussin #define	EP_UNDEFINED					0x00
31b711ef9cSBaptiste Daroussin #define EP_GENERAL					0x01
32b711ef9cSBaptiste Daroussin #define EP_ENDPOINT					0x02
33b711ef9cSBaptiste Daroussin #define EP_INTERRUPT					0x03
34b711ef9cSBaptiste Daroussin 
35b711ef9cSBaptiste Daroussin /* Table A-5: Video Class-Specific VC Interface Descriptor Subtypes */
36b711ef9cSBaptiste Daroussin #define	UDESCSUB_VC_DESCRIPTOR_UNDEFINED		0x00
37b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_HEADER				0x01
38b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_INPUT_TERMINAL			0x02
39b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_OUTPUT_TERMINAL			0x03
40b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_SELECTOR_UNIT			0x04
41b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_PROCESSING_UNIT			0x05
42b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_EXTENSION_UNIT			0x06
43b711ef9cSBaptiste Daroussin 
44b711ef9cSBaptiste Daroussin /* Table A-6: Video Class-Specific VS Interface Descriptor Subtypes */
45b711ef9cSBaptiste Daroussin #define	UDESCSUB_VS_UNDEFINED				0x00
46b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_INPUT_HEADER			0x01
47b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_OUTPUT_HEADER			0x02
48b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_STILL_IMAGE_FRAME			0x03
49b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_UNCOMPRESSED			0x04
50b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_UNCOMPRESSED			0x05
51b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_MJPEG			0x06
52b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_MJPEG				0x07
53b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_MPEG2TS			0x0a
54b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_DV				0x0c
55b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_COLORFORMAT				0x0d
56b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_FRAME_BASED			0x10
57b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_FRAME_BASED			0x11
58b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_STREAM_BASED			0x12
59b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_H264				0x13
60b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_H264				0x14
61b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_H264_SIMULCAST		0x15
62b711ef9cSBaptiste Daroussin 
63b711ef9cSBaptiste Daroussin /* Table A-8: Video Class-Specific Request Codes */
64b711ef9cSBaptiste Daroussin #define RC_UNDEFINED					0x00
65b711ef9cSBaptiste Daroussin #define SET_CUR						0x01
66b711ef9cSBaptiste Daroussin #define GET_CUR						0x81
67b711ef9cSBaptiste Daroussin #define GET_MIN						0x82
68b711ef9cSBaptiste Daroussin #define GET_MAX						0x83
69b711ef9cSBaptiste Daroussin #define GET_RES						0x84
70b711ef9cSBaptiste Daroussin #define GET_LEN						0x85
71b711ef9cSBaptiste Daroussin #define GET_INFO					0x86
72b711ef9cSBaptiste Daroussin #define GET_DEF						0x87
73b711ef9cSBaptiste Daroussin 
74b711ef9cSBaptiste Daroussin /* Table A-9: Video Control Interface Control Selectors */
75b711ef9cSBaptiste Daroussin #define VC_CONTROL_UNDEFINED				0x00
76b711ef9cSBaptiste Daroussin #define VC_VIDEO_POWER_MODE_CONTROL			0x01
77b711ef9cSBaptiste Daroussin #define VC_REQUEST_ERROR_CODE_CONTROL			0x02
78b711ef9cSBaptiste Daroussin 
79b711ef9cSBaptiste Daroussin /* Table A-11: Selector Unit Control Selectors */
80b711ef9cSBaptiste Daroussin #define	SU_CONTROL_UNDEFINED				0x00
81b711ef9cSBaptiste Daroussin #define	SU_INPUT_SELECT_CONTROL				0x01
82b711ef9cSBaptiste Daroussin 
83b711ef9cSBaptiste Daroussin /* Table A-12: Camera Terminal Control Selectors */
84b711ef9cSBaptiste Daroussin #define	CT_CONTROL_UNDEFINED				0x00
85b711ef9cSBaptiste Daroussin #define	CT_SCANNING_MODE_CONTROL			0x01
86b711ef9cSBaptiste Daroussin #define	CT_AE_MODE_CONTROL				0x02
87b711ef9cSBaptiste Daroussin #define	CT_AE_PRIORITY_CONTROL				0x03
88b711ef9cSBaptiste Daroussin #define	CT_EXPOSURE_TIME_ABSOLUTE_CONTROL		0x04
89b711ef9cSBaptiste Daroussin #define	CT_EXPOSURE_TIME_RELATIVE_CONTROL		0x05
90b711ef9cSBaptiste Daroussin #define	CT_FOCUS_ABSOLUTE_CONTROL			0x06
91b711ef9cSBaptiste Daroussin #define	CT_FOCUS_RELATIVE_CONTROL			0x07
92b711ef9cSBaptiste Daroussin #define	CT_FOCUS_AUTO_CONTROL				0x08
93b711ef9cSBaptiste Daroussin #define	CT_IRIS_ABSOLUTE_CONTROL			0x09
94b711ef9cSBaptiste Daroussin #define	CT_IRIS_RELATIVE_CONTROL			0x0a
95b711ef9cSBaptiste Daroussin #define	CT_ZOOM_ABSOLUTE_CONTROL			0x0b
96b711ef9cSBaptiste Daroussin #define	CT_ZOOM_RELATIVE_CONTROL			0x0c
97b711ef9cSBaptiste Daroussin #define	CT_PANTILT_ABSOLUTE_CONTROL			0x0d
98b711ef9cSBaptiste Daroussin #define	CT_PANTILT_RELATIVE_CONTROL			0x0e
99b711ef9cSBaptiste Daroussin #define	CT_ROLL_ABSOLUTE_CONTROL			0x0f
100b711ef9cSBaptiste Daroussin #define	CT_ROLL_RELATIVE_CONTROL			0x10
101b711ef9cSBaptiste Daroussin #define	CT_PRIVACY_CONTROL				0x11
102b711ef9cSBaptiste Daroussin 
103b711ef9cSBaptiste Daroussin /* Table A-13: Processing Unit Control Selectors */
104b711ef9cSBaptiste Daroussin #define	PU_CONTROL_UNDEFINED				0x00
105b711ef9cSBaptiste Daroussin #define	PU_BACKLIGHT_COMPENSATION_CONTROL		0x01
106b711ef9cSBaptiste Daroussin #define	PU_BRIGHTNESS_CONTROL				0x02
107b711ef9cSBaptiste Daroussin #define	PU_CONTRAST_CONTROL				0x03
108b711ef9cSBaptiste Daroussin #define	PU_GAIN_CONTROL					0x04
109b711ef9cSBaptiste Daroussin #define	PU_POWER_LINE_FREQUENCY_CONTROL			0x05
110b711ef9cSBaptiste Daroussin #define	PU_HUE_CONTROL					0x06
111b711ef9cSBaptiste Daroussin #define	PU_SATURATION_CONTROL				0x07
112b711ef9cSBaptiste Daroussin #define	PU_SHARPNESS_CONTROL				0x08
113b711ef9cSBaptiste Daroussin #define	PU_GAMMA_CONTROL				0x09
114b711ef9cSBaptiste Daroussin #define	PU_WHITE_BALANCE_TEMPERATURE_CONTROL		0x0a
115b711ef9cSBaptiste Daroussin #define	PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL	0x0b
116b711ef9cSBaptiste Daroussin #define	PU_WHITE_BALANCE_COMPONENT_CONTROL		0x0c
117b711ef9cSBaptiste Daroussin #define	PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL		0x0d
118b711ef9cSBaptiste Daroussin #define	PU_DIGITAL_MULTIPLIER_CONTROL			0x0e
119b711ef9cSBaptiste Daroussin #define	PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL		0x0f
120b711ef9cSBaptiste Daroussin #define	PU_HUE_AUTO_CONTROL				0x10
121b711ef9cSBaptiste Daroussin #define	PU_ANALOG_VIDEO_STANDARD_CONTROL		0x11
122b711ef9cSBaptiste Daroussin #define	PU_ANALOG_LOCK_STATUS_CONTROL			0x12
123b711ef9cSBaptiste Daroussin 
124b711ef9cSBaptiste Daroussin /* Table A-15: VideoStreaming Interface Control Selectors */
125b711ef9cSBaptiste Daroussin #define	VS_CONTROL_UNDEFINED				0x00
126b711ef9cSBaptiste Daroussin #define	VS_PROBE_CONTROL				0x01
127b711ef9cSBaptiste Daroussin #define	VS_COMMIT_CONTROL				0x02
128b711ef9cSBaptiste Daroussin #define	VS_STILL_PROBE_CONTROL				0x03
129b711ef9cSBaptiste Daroussin #define	VS_STILL_COMMIT_CONTROL				0x04
130b711ef9cSBaptiste Daroussin #define	VS_STILL_IMAGE_TRIGGER_CONTROL			0x05
131b711ef9cSBaptiste Daroussin #define	VS_STREAM_ERROR_CODE_CONTROL			0x06
132b711ef9cSBaptiste Daroussin #define	VS_GENERATE_KEY_FRAME_CONTROL			0x07
133b711ef9cSBaptiste Daroussin #define	VS_UPDATE_FRAME_SEGMENT_CONTROL			0x08
134b711ef9cSBaptiste Daroussin #define	VS_SYNC_DELAY_CONTROL				0x09
135b711ef9cSBaptiste Daroussin 
136b711ef9cSBaptiste Daroussin /* probe commit bmRequests */
137b711ef9cSBaptiste Daroussin #define	UVIDEO_SET_IF					0x21
138b711ef9cSBaptiste Daroussin #define	UVIDEO_GET_IF					0xa1
139b711ef9cSBaptiste Daroussin #define	UVIDEO_SET_EP					0x22
140b711ef9cSBaptiste Daroussin #define	UVIDEO_GET_EP					0xa2
141b711ef9cSBaptiste Daroussin 
142b711ef9cSBaptiste Daroussin /* Table B-1: USB Terminal Types */
143b711ef9cSBaptiste Daroussin #define	TT_VENDOR_SPECIFIC				0x0100
144b711ef9cSBaptiste Daroussin #define	TT_STREAMING					0x0101
145b711ef9cSBaptiste Daroussin 
146b711ef9cSBaptiste Daroussin /* Table B-2: Input Terminal Types */
147b711ef9cSBaptiste Daroussin #define	ITT_VENDOR_SPECIFIC				0x0200
148b711ef9cSBaptiste Daroussin #define	ITT_CAMERA					0x0201
149b711ef9cSBaptiste Daroussin #define	ITT_MEDIA_TRANSPORT_INPUT			0x0202
150b711ef9cSBaptiste Daroussin 
151b711ef9cSBaptiste Daroussin /* Table B-3: Output Terminal Types */
152b711ef9cSBaptiste Daroussin #define	OTT_VENDOR_SPECIFIC				0x0300
153b711ef9cSBaptiste Daroussin #define	OTT_DISPLAY					0x0301
154b711ef9cSBaptiste Daroussin #define	OTT_MEDIA_TRANSPORT_OUTPUT			0x0302
155b711ef9cSBaptiste Daroussin 
156b711ef9cSBaptiste Daroussin /* Table B-4: External Terminal Types */
157b711ef9cSBaptiste Daroussin #define	EXTERNAL_VENDOR_SPECIFIC			0x0400
158b711ef9cSBaptiste Daroussin #define	COMPOSITE_CONNECTOR				0x0401
159b711ef9cSBaptiste Daroussin #define	SVIDEO_CONNECTOR				0x0402
160b711ef9cSBaptiste Daroussin #define	COMPONENT_CONNECTOR				0x0403
161b711ef9cSBaptiste Daroussin 
162b711ef9cSBaptiste Daroussin /* Table 3-3: VC Interface Header Descriptor */
163b711ef9cSBaptiste Daroussin struct usb_video_header_desc {
164b711ef9cSBaptiste Daroussin 	uByte	bLength;
165b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
166b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
167b711ef9cSBaptiste Daroussin 	uWord	bcdUVC;
168b711ef9cSBaptiste Daroussin 	uWord	wTotalLength;
169b711ef9cSBaptiste Daroussin 	uDWord	dwClockFrequency;
170b711ef9cSBaptiste Daroussin 	uByte	bInCollection;
171b711ef9cSBaptiste Daroussin } __packed;
172b711ef9cSBaptiste Daroussin 
173b711ef9cSBaptiste Daroussin struct usb_video_header_desc_all {
174b711ef9cSBaptiste Daroussin 	struct usb_video_header_desc	*fix;
175b711ef9cSBaptiste Daroussin 	uByte				*baInterfaceNr;
176b711ef9cSBaptiste Daroussin };
177b711ef9cSBaptiste Daroussin 
178b711ef9cSBaptiste Daroussin /* Table 3-4: Input Terminal Descriptor */
179b711ef9cSBaptiste Daroussin struct usb_video_input_terminal_desc {
180b711ef9cSBaptiste Daroussin 	uByte	bLength;
181b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
182b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
183b711ef9cSBaptiste Daroussin 	uByte	bTerminalID;
184b711ef9cSBaptiste Daroussin 	uWord	wTerminalType;
185b711ef9cSBaptiste Daroussin 	uByte	bAssocTerminal;
186b711ef9cSBaptiste Daroussin 	uByte	iTerminal;
187b711ef9cSBaptiste Daroussin } __packed;
188b711ef9cSBaptiste Daroussin 
189b711ef9cSBaptiste Daroussin /* Table 3-5: Output Terminal Descriptor */
190b711ef9cSBaptiste Daroussin struct usb_video_output_terminal_desc {
191b711ef9cSBaptiste Daroussin 	uByte	bLength;
192b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
193b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
194b711ef9cSBaptiste Daroussin 	uByte	bTerminalID;
195b711ef9cSBaptiste Daroussin 	uWord	wTerminalType;
196b711ef9cSBaptiste Daroussin 	uByte	bAssocTerminal;
197b711ef9cSBaptiste Daroussin 	uByte	bSourceID;
198b711ef9cSBaptiste Daroussin 	uByte	iTerminal;
199b711ef9cSBaptiste Daroussin } __packed;
200b711ef9cSBaptiste Daroussin 
201b711ef9cSBaptiste Daroussin /* Table 3-6: Camera Terminal Descriptor */
202b711ef9cSBaptiste Daroussin struct usb_video_camera_terminal_desc {
203b711ef9cSBaptiste Daroussin 	uByte	bLength;
204b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
205b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
206b711ef9cSBaptiste Daroussin 	uByte	bTerminalID;
207b711ef9cSBaptiste Daroussin 	uWord	wTerminalType;
208b711ef9cSBaptiste Daroussin 	uByte	bAssocTerminal;
209b711ef9cSBaptiste Daroussin 	uByte	iTerminal;
210b711ef9cSBaptiste Daroussin 	uWord	wObjectiveFocalLengthMin;
211b711ef9cSBaptiste Daroussin 	uWord	wObjectiveFocalLengthMax;
212b711ef9cSBaptiste Daroussin 	uWord	wOcularFocalLength;
213b711ef9cSBaptiste Daroussin 	uByte	bControlSize;
214d0450cbeSBaptiste Daroussin 	uByte	bmControls[255]; /* [bControlSize] */
215b711ef9cSBaptiste Daroussin } __packed;
216b711ef9cSBaptiste Daroussin 
217b711ef9cSBaptiste Daroussin /* Table 3-8: VC Processing Unit Descriptor */
218b711ef9cSBaptiste Daroussin struct usb_video_vc_processing_desc {
219b711ef9cSBaptiste Daroussin 	uByte	bLength;
220b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
221b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
222b711ef9cSBaptiste Daroussin 	uByte	bUnitID;
223b711ef9cSBaptiste Daroussin 	uByte	bSourceID;
224b711ef9cSBaptiste Daroussin 	uWord	wMaxMultiplier;
225b711ef9cSBaptiste Daroussin 	uByte	bControlSize;
226b711ef9cSBaptiste Daroussin 	uByte	bmControls[255]; /* [bControlSize] */
227b711ef9cSBaptiste Daroussin 	/* uByte iProcessing; */
228b711ef9cSBaptiste Daroussin 	/* uByte bmVideoStandards; */
229b711ef9cSBaptiste Daroussin } __packed;
230b711ef9cSBaptiste Daroussin 
231b711ef9cSBaptiste Daroussin /* Table 3-9: VC Extension Unit Descriptor */
232b711ef9cSBaptiste Daroussin struct usb_video_vc_extension_desc {
233b711ef9cSBaptiste Daroussin 	uByte	bLength;
234b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
235b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
236b711ef9cSBaptiste Daroussin 	uByte	bUnitID;
237b711ef9cSBaptiste Daroussin 	uByte	guidExtensionCode[16];
238b711ef9cSBaptiste Daroussin 	uByte	bNumControls;
239b711ef9cSBaptiste Daroussin 	uByte	bNrInPins;
240b711ef9cSBaptiste Daroussin } __packed;
241b711ef9cSBaptiste Daroussin 
242b711ef9cSBaptiste Daroussin /* Table 3-11: VC Endpoint Descriptor */
243b711ef9cSBaptiste Daroussin struct usb_video_vc_endpoint_desc {
244b711ef9cSBaptiste Daroussin 	uByte	bLength;
245b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
246b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
247b711ef9cSBaptiste Daroussin 	uWord	wMaxTransferSize;
248b711ef9cSBaptiste Daroussin } __packed;
249b711ef9cSBaptiste Daroussin 
250b711ef9cSBaptiste Daroussin /* Table 3-13: Interface Input Header Descriptor */
251b711ef9cSBaptiste Daroussin struct usb_video_input_header_desc {
252b711ef9cSBaptiste Daroussin 	uByte	bLength;
253b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
254b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
255b711ef9cSBaptiste Daroussin 	uByte	bNumFormats;
256b711ef9cSBaptiste Daroussin 	uWord	wTotalLength;
257b711ef9cSBaptiste Daroussin 	uByte	bEndpointAddress;
258b711ef9cSBaptiste Daroussin 	uByte	bmInfo;
259b711ef9cSBaptiste Daroussin 	uByte	bTerminalLink;
260b711ef9cSBaptiste Daroussin 	uByte	bStillCaptureMethod;
261b711ef9cSBaptiste Daroussin 	uByte	bTriggerSupport;
262b711ef9cSBaptiste Daroussin 	uByte	bTriggerUsage;
263b711ef9cSBaptiste Daroussin 	uByte	bControlSize;
264b711ef9cSBaptiste Daroussin } __packed;
265b711ef9cSBaptiste Daroussin 
266b711ef9cSBaptiste Daroussin struct usb_video_input_header_desc_all {
267b711ef9cSBaptiste Daroussin 	struct usb_video_input_header_desc	*fix;
268b711ef9cSBaptiste Daroussin 	uByte					*bmaControls;
269b711ef9cSBaptiste Daroussin };
270b711ef9cSBaptiste Daroussin 
271b711ef9cSBaptiste Daroussin /* Table 3-18: Color Matching Descriptor */
272b711ef9cSBaptiste Daroussin struct usb_video_color_matching_descr {
273b711ef9cSBaptiste Daroussin 	uByte	bLength;
274b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
275b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
276b711ef9cSBaptiste Daroussin 	uByte	bColorPrimaries;
277b711ef9cSBaptiste Daroussin 	uByte	bTransferCharacteristics;
278b711ef9cSBaptiste Daroussin 	uByte	bMatrixCoefficients;
279b711ef9cSBaptiste Daroussin } __packed;
280b711ef9cSBaptiste Daroussin 
281b711ef9cSBaptiste Daroussin /* Table 4-75: Video Probe and Commit Controls */
282b711ef9cSBaptiste Daroussin struct usb_video_probe_commit {
283b711ef9cSBaptiste Daroussin 	uWord	bmHint;
284b711ef9cSBaptiste Daroussin 	uByte	bFormatIndex;
285b711ef9cSBaptiste Daroussin 	uByte	bFrameIndex;
286b711ef9cSBaptiste Daroussin 	uDWord	dwFrameInterval;
287b711ef9cSBaptiste Daroussin 	uWord	wKeyFrameRate;
288b711ef9cSBaptiste Daroussin 	uWord	wPFrameRate;
289b711ef9cSBaptiste Daroussin 	uWord	wCompQuality;
290b711ef9cSBaptiste Daroussin 	uWord	wCompWindowSize;
291b711ef9cSBaptiste Daroussin 	uWord	wDelay;
292b711ef9cSBaptiste Daroussin 	uDWord	dwMaxVideoFrameSize;
293b711ef9cSBaptiste Daroussin 	uDWord	dwMaxPayloadTransferSize;
294b711ef9cSBaptiste Daroussin 	uDWord	dwClockFrequency;
295b711ef9cSBaptiste Daroussin 	uByte	bmFramingInfo;
296b711ef9cSBaptiste Daroussin 	uByte	bPreferedVersion;
297b711ef9cSBaptiste Daroussin 	uByte	bMinVersion;
298b711ef9cSBaptiste Daroussin 	uByte	bMaxVersion;
299b711ef9cSBaptiste Daroussin 	uByte	bUsage;
300b711ef9cSBaptiste Daroussin 	uByte	bBitDepthLuma;
301b711ef9cSBaptiste Daroussin 	uByte	bmSettings;
302b711ef9cSBaptiste Daroussin 	uByte	bMaxNumberOfRefFramesPlus1;
303b711ef9cSBaptiste Daroussin 	uWord	bmRateControlModes;
304b711ef9cSBaptiste Daroussin 	uByte	bmLayoutPerStream[8];
305b711ef9cSBaptiste Daroussin } __packed;
306b711ef9cSBaptiste Daroussin 
307b711ef9cSBaptiste Daroussin /*
308b711ef9cSBaptiste Daroussin  * USB Video Payload Uncompressed
309b711ef9cSBaptiste Daroussin  */
310b711ef9cSBaptiste Daroussin /* Table 2-1: Compression Formats */
311b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_YUY2	{			\
312b711ef9cSBaptiste Daroussin     'Y',  'U',  'Y',  '2',  0x00, 0x00, 0x10, 0x00,	\
313b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
314b711ef9cSBaptiste Daroussin 
3158bc06ffbSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_NV12	{			\
3168bc06ffbSBaptiste Daroussin     'N',  'V',  '1',  '2',  0x00, 0x00, 0x10, 0x00,	\
3178bc06ffbSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3188bc06ffbSBaptiste Daroussin 
3198bc06ffbSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_NV21	{			\
3208bc06ffbSBaptiste Daroussin     'N',  'V',  '2',  '1',  0x00, 0x00, 0x10, 0x00,	\
3218bc06ffbSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3228bc06ffbSBaptiste Daroussin 
323b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_YV12	{			\
324b711ef9cSBaptiste Daroussin     'Y',  'V',  '1',  '2',  0x00, 0x00, 0x10, 0x00,	\
325b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
326b711ef9cSBaptiste Daroussin 
327b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_I420	{			\
328b711ef9cSBaptiste Daroussin     'I',  '4',  '2',  '0',  0x00, 0x00, 0x10, 0x00,	\
329b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
330b711ef9cSBaptiste Daroussin 
3318bc06ffbSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_M420	{			\
3328bc06ffbSBaptiste Daroussin     'M',  '4',  '2',  '0',  0x00, 0x00, 0x10, 0x00,	\
3338bc06ffbSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3348bc06ffbSBaptiste Daroussin 
3358bc06ffbSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_UYVY	{			\
3368bc06ffbSBaptiste Daroussin     'U',  'Y',  'V',  'Y',  0x00, 0x00, 0x10, 0x00,	\
3378bc06ffbSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3388bc06ffbSBaptiste Daroussin 
339b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_Y800	{			\
340b711ef9cSBaptiste Daroussin     'Y',  '8',  '0',  '0',  0x00, 0x00, 0x10, 0x00,	\
341b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
342b711ef9cSBaptiste Daroussin 
343b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_Y8	{			\
344b711ef9cSBaptiste Daroussin     'Y',  '8',  ' ',  ' ',  0x00, 0x00, 0x10, 0x00,	\
345b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
346b711ef9cSBaptiste Daroussin 
347b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_D3DFMT_L8	{		\
348b711ef9cSBaptiste Daroussin     0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,	\
349b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
350b711ef9cSBaptiste Daroussin 
351b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_KSMEDIA_L8_IR	{	\
352b711ef9cSBaptiste Daroussin     0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00,	\
353b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
354b711ef9cSBaptiste Daroussin 
3558bc06ffbSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_Y12	{			\
3568bc06ffbSBaptiste Daroussin     'Y',  '1',  '2',  ' ',  0x00, 0x00, 0x10, 0x00,	\
3578bc06ffbSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3588bc06ffbSBaptiste Daroussin 
3598bc06ffbSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_Y16	{			\
3608bc06ffbSBaptiste Daroussin     'Y',  '1',  '6',  ' ',  0x00, 0x00, 0x10, 0x00,	\
3618bc06ffbSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
3628bc06ffbSBaptiste Daroussin 
363b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_BY8	{			\
364b711ef9cSBaptiste Daroussin     'B',  'Y',  '8',  ' ',  0x00, 0x00, 0x10, 0x00,	\
365b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
366b711ef9cSBaptiste Daroussin 
367b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_BA81	{			\
368b711ef9cSBaptiste Daroussin     'B',  'A',  '8',  '1',  0x00, 0x00, 0x10, 0x00,	\
369b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
370b711ef9cSBaptiste Daroussin 
371b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_GBRG	{			\
372b711ef9cSBaptiste Daroussin     'G',  'B',  'R',  'G',  0x00, 0x00, 0x10, 0x00,	\
373b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
374b711ef9cSBaptiste Daroussin 
375b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_GRBG	{			\
376b711ef9cSBaptiste Daroussin     'G',  'R',  'B',  'G',  0x00, 0x00, 0x10, 0x00,	\
377b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
378b711ef9cSBaptiste Daroussin 
379b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_RGGB	{			\
380b711ef9cSBaptiste Daroussin     'R',  'G',  'G',  'B',  0x00, 0x00, 0x10, 0x00,	\
381b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
382b711ef9cSBaptiste Daroussin 
383b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_RGBP	{			\
384b711ef9cSBaptiste Daroussin     'R',  'G',  'B',  'P',  0x00, 0x00, 0x10, 0x00,	\
385b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
386b711ef9cSBaptiste Daroussin 
387b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_D3DFMT_R5G6B5	{	\
388b711ef9cSBaptiste Daroussin     0x7b, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11,	\
389b711ef9cSBaptiste Daroussin     0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }
390b711ef9cSBaptiste Daroussin 
391b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_BGR3	{			\
392b711ef9cSBaptiste Daroussin     0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11,	\
393b711ef9cSBaptiste Daroussin     0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }
394b711ef9cSBaptiste Daroussin 
395b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_BGR4	{			\
396b711ef9cSBaptiste Daroussin     0x7e, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11,	\
397b711ef9cSBaptiste Daroussin     0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 }
398b711ef9cSBaptiste Daroussin 
399b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_H265	{			\
400b711ef9cSBaptiste Daroussin     'H',  '2',  '6',  '5',  0x00, 0x00, 0x10, 0x00,	\
401b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
402b711ef9cSBaptiste Daroussin 
403b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_RW10	{			\
404b711ef9cSBaptiste Daroussin     'R',  'W',  '1',  '0',  0x00, 0x00, 0x10, 0x00,	\
405b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
406b711ef9cSBaptiste Daroussin 
407b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_BG16	{			\
408b711ef9cSBaptiste Daroussin     'B',  'G',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
409b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
410b711ef9cSBaptiste Daroussin 
411b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_GB16	{			\
412b711ef9cSBaptiste Daroussin     'G',  'B',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
413b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
414b711ef9cSBaptiste Daroussin 
415b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_RG16	{			\
416b711ef9cSBaptiste Daroussin     'R',  'G',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
417b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
418b711ef9cSBaptiste Daroussin 
419b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_GR16	{			\
420b711ef9cSBaptiste Daroussin     'G',  'R',  '1',  '6',  0x00, 0x00, 0x10, 0x00,	\
421b711ef9cSBaptiste Daroussin     0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
422b711ef9cSBaptiste Daroussin 
423b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_INVZ	{			\
424b711ef9cSBaptiste Daroussin     'I',  'N',  'V',  'Z',  0x90, 0x2d, 0x58, 0x4a,	\
425b711ef9cSBaptiste Daroussin     0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b }
426b711ef9cSBaptiste Daroussin 
427b711ef9cSBaptiste Daroussin #define	UVIDEO_FORMAT_GUID_INVI	{			\
428b711ef9cSBaptiste Daroussin     'I',  'N',  'V',  'I',  0xdb, 0x57, 0x49, 0x5e,	\
429b711ef9cSBaptiste Daroussin     0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f }
430b711ef9cSBaptiste Daroussin 
431b711ef9cSBaptiste Daroussin /*
432b711ef9cSBaptiste Daroussin  * USB Video Payload MJPEG
433b711ef9cSBaptiste Daroussin  */
434b711ef9cSBaptiste Daroussin /* Table 2-1: Stream Header Format for the Motion-JPEG */
435b711ef9cSBaptiste Daroussin #define UVIDEO_SH_MAX_LEN	12
436b711ef9cSBaptiste Daroussin #define UVIDEO_SH_MIN_LEN	2
437b711ef9cSBaptiste Daroussin struct usb_video_stream_header {
438b711ef9cSBaptiste Daroussin 	uByte	bLength;
439b711ef9cSBaptiste Daroussin 	uByte	bFlags;
440b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_FID	(1 << 0)
441b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_EOF	(1 << 1)
442b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_PTS	(1 << 2)
443b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_SCR	(1 << 3)
444b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_RES	(1 << 4)
445b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_STI	(1 << 5)
446b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_ERR	(1 << 6)
447b711ef9cSBaptiste Daroussin #define	UVIDEO_SH_FLAG_EOH	(1 << 7)
448b711ef9cSBaptiste Daroussin 	/* TODO complete struct */
449b711ef9cSBaptiste Daroussin } __packed;
450b711ef9cSBaptiste Daroussin 
451b711ef9cSBaptiste Daroussin /* Table 3-19: Color Matching Descriptor */
452b711ef9cSBaptiste Daroussin struct usb_video_colorformat_desc {
453b711ef9cSBaptiste Daroussin 	uByte	bLength;
454b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
455b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
456b711ef9cSBaptiste Daroussin 	uByte	bColorPrimaries;
457b711ef9cSBaptiste Daroussin 	uByte	bTransferCharacteristics;
458b711ef9cSBaptiste Daroussin 	uByte	bMatrixCoefficients;
459b711ef9cSBaptiste Daroussin } __packed;
460b711ef9cSBaptiste Daroussin 
461b711ef9cSBaptiste Daroussin struct usb_video_frame_desc {
462b711ef9cSBaptiste Daroussin 	uByte	bLength;
463b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
464b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
465b711ef9cSBaptiste Daroussin 	uByte	bFrameIndex;
466b711ef9cSBaptiste Daroussin 	union {
467b711ef9cSBaptiste Daroussin 	    /*
468b711ef9cSBaptiste Daroussin 	     * Table 3-2: Video Frame Descriptor
469b711ef9cSBaptiste Daroussin 	     * (same for mjpeg and uncompressed)
470b711ef9cSBaptiste Daroussin 	     */
471b711ef9cSBaptiste Daroussin 	    struct {
472b711ef9cSBaptiste Daroussin 		uByte	bmCapabilities;
473b711ef9cSBaptiste Daroussin 		uWord	wWidth;
474b711ef9cSBaptiste Daroussin 		uWord	wHeight;
475b711ef9cSBaptiste Daroussin 		uDWord	dwMinBitRate;
476b711ef9cSBaptiste Daroussin 		uDWord	dwMaxBitRate;
477b711ef9cSBaptiste Daroussin 		uDWord	dwMaxVideoFrameBufferSize;
478b711ef9cSBaptiste Daroussin 		uDWord	dwDefaultFrameInterval;
479b711ef9cSBaptiste Daroussin 		uByte	bFrameIntervalType;
480b711ef9cSBaptiste Daroussin 	    } uc;
481b711ef9cSBaptiste Daroussin 
482b711ef9cSBaptiste Daroussin 	    /*
483b711ef9cSBaptiste Daroussin 	     * Table 3-2 Frame Based Payload Video Frame Descriptors */
484b711ef9cSBaptiste Daroussin 	    struct {
485b711ef9cSBaptiste Daroussin 		uByte	bmCapabilities;
486b711ef9cSBaptiste Daroussin 		uWord	wWidth;
487b711ef9cSBaptiste Daroussin 		uWord	wHeight;
488b711ef9cSBaptiste Daroussin 		uDWord	dwMinBitRate;
489b711ef9cSBaptiste Daroussin 		uDWord	dwMaxBitRate;
490b711ef9cSBaptiste Daroussin 		uDWord	dwDefaultFrameInterval;
491b711ef9cSBaptiste Daroussin 		uByte	bFrameIntervalType;
492b711ef9cSBaptiste Daroussin 		uDWord	dwBytesPerLine;
493b711ef9cSBaptiste Daroussin 	    } fb;
494b711ef9cSBaptiste Daroussin 
495b711ef9cSBaptiste Daroussin 	    /* Table 3-2: H.264 Payload Video Frame Descriptor */
496b711ef9cSBaptiste Daroussin 	    struct {
497b711ef9cSBaptiste Daroussin 		uWord	wWidth;
498b711ef9cSBaptiste Daroussin 		uWord	wHeight;
499b711ef9cSBaptiste Daroussin 		uWord	wSARwidth;
500b711ef9cSBaptiste Daroussin 		uWord	wSARheight;
501b711ef9cSBaptiste Daroussin 		uWord	wProfile;
502b711ef9cSBaptiste Daroussin 		uByte	bLevelIDC;
503b711ef9cSBaptiste Daroussin 		uWord	wConstrainedToolset;
504b711ef9cSBaptiste Daroussin 		uDWord	bmSupportedUsages;
505b711ef9cSBaptiste Daroussin 		uWord	bmCapabilities;
506b711ef9cSBaptiste Daroussin 		uDWord	bmSVCCapabilities;
507b711ef9cSBaptiste Daroussin 		uDWord	bmMVCCapabilities;
508b711ef9cSBaptiste Daroussin 		uDWord	dwMinBitRate;
509b711ef9cSBaptiste Daroussin 		uDWord	dwMaxBitRate;
510b711ef9cSBaptiste Daroussin 		uDWord	dwDefaultFrameInterval;
511b711ef9cSBaptiste Daroussin 		uByte	bNumFrameIntervals;
512b711ef9cSBaptiste Daroussin 	    } h264;
513b711ef9cSBaptiste Daroussin 
514b711ef9cSBaptiste Daroussin 	} u;
515b711ef9cSBaptiste Daroussin 
516b711ef9cSBaptiste Daroussin #define UVIDEO_FRAME_MIN_LEN(frm)						\
517b711ef9cSBaptiste Daroussin 	(offsetof(struct usb_video_frame_desc, u) +				\
518b711ef9cSBaptiste Daroussin 		(								\
519b711ef9cSBaptiste Daroussin 		((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_H264) ?		\
520b711ef9cSBaptiste Daroussin 			sizeof(((struct usb_video_frame_desc *)0)->u.h264) :	\
521b711ef9cSBaptiste Daroussin 		 ((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_FRAME_BASED) ?	\
522b711ef9cSBaptiste Daroussin 			sizeof(((struct usb_video_frame_desc *)0)->u.fb) :	\
523b711ef9cSBaptiste Daroussin 			sizeof(((struct usb_video_frame_desc *)0)->u.uc)	\
524b711ef9cSBaptiste Daroussin 		)								\
525b711ef9cSBaptiste Daroussin 	)
526b711ef9cSBaptiste Daroussin 
527b711ef9cSBaptiste Daroussin #define UVIDEO_FRAME_FIELD(frm, field)					\
528b711ef9cSBaptiste Daroussin 	(								\
529b711ef9cSBaptiste Daroussin 	((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_H264) ?		\
530b711ef9cSBaptiste Daroussin 		(frm)->u.h264.field :					\
531b711ef9cSBaptiste Daroussin 	((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_FRAME_BASED) ?	\
532b711ef9cSBaptiste Daroussin 		(frm)->u.fb.field :					\
533b711ef9cSBaptiste Daroussin 		(frm)->u.uc.field					\
534b711ef9cSBaptiste Daroussin 	)
535b711ef9cSBaptiste Daroussin 
536b711ef9cSBaptiste Daroussin #define UVIDEO_FRAME_NUM_INTERVALS(frm)					\
537b711ef9cSBaptiste Daroussin 	(								\
538b711ef9cSBaptiste Daroussin 	((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_H264) ?		\
539b711ef9cSBaptiste Daroussin 		(frm)->u.h264.bNumFrameIntervals :			\
540b711ef9cSBaptiste Daroussin 	((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_FRAME_BASED) ?	\
541b711ef9cSBaptiste Daroussin 		(frm)->u.fb.bFrameIntervalType :			\
542b711ef9cSBaptiste Daroussin 		(frm)->u.uc.bFrameIntervalType				\
543b711ef9cSBaptiste Daroussin 	)
544b711ef9cSBaptiste Daroussin 
545b711ef9cSBaptiste Daroussin 	/* uDWord ivals[]; frame intervals, length varies */
546b711ef9cSBaptiste Daroussin } __packed;
547b711ef9cSBaptiste Daroussin 
548b711ef9cSBaptiste Daroussin struct usb_video_format_desc {
549b711ef9cSBaptiste Daroussin 	uByte	bLength;
550b711ef9cSBaptiste Daroussin 	uByte	bDescriptorType;
551b711ef9cSBaptiste Daroussin 	uByte	bDescriptorSubtype;
552b711ef9cSBaptiste Daroussin 	uByte	bFormatIndex;
553b711ef9cSBaptiste Daroussin 	uByte	bNumFrameDescriptors;
554b711ef9cSBaptiste Daroussin 	union {
555b711ef9cSBaptiste Daroussin 		/* Table 3-1: Motion-JPEG Video Format Descriptor */
556b711ef9cSBaptiste Daroussin 		struct {
557b711ef9cSBaptiste Daroussin 			uByte	bmFlags;
558b711ef9cSBaptiste Daroussin 			uByte	bDefaultFrameIndex;
559b711ef9cSBaptiste Daroussin 			uByte	bAspectRatioX;
560b711ef9cSBaptiste Daroussin 			uByte	bAspectRatioY;
561b711ef9cSBaptiste Daroussin 			uByte	bmInterlaceFlags;
562b711ef9cSBaptiste Daroussin 			uByte	bCopyProtect;
563b711ef9cSBaptiste Daroussin 		} mjpeg;
564b711ef9cSBaptiste Daroussin 
565b711ef9cSBaptiste Daroussin 		/* Table 3-1: Uncompressed Video Format Descriptor */
566b711ef9cSBaptiste Daroussin 		struct {
567b711ef9cSBaptiste Daroussin 			uByte	guidFormat[16];
568b711ef9cSBaptiste Daroussin 			uByte	bBitsPerPixel;
569b711ef9cSBaptiste Daroussin 			uByte	bDefaultFrameIndex;
570b711ef9cSBaptiste Daroussin 			uByte	bAspectRatioX;
571b711ef9cSBaptiste Daroussin 			uByte	bAspectRatioY;
572b711ef9cSBaptiste Daroussin 			uByte	bmInterlaceFlags;
573b711ef9cSBaptiste Daroussin 			uByte	bCopyProtect;
574b711ef9cSBaptiste Daroussin 		} uc;
575b711ef9cSBaptiste Daroussin 
576b711ef9cSBaptiste Daroussin 		/* Table 3-1: Frame Based Payload Video Format Descriptor */
577b711ef9cSBaptiste Daroussin 		struct {
578b711ef9cSBaptiste Daroussin 			uByte	guidFormat[16];
579b711ef9cSBaptiste Daroussin 			uByte	bBitsPerPixel;
580b711ef9cSBaptiste Daroussin 			uByte	bDefaultFrameIndex;
581b711ef9cSBaptiste Daroussin 			uByte	bAspectRatioX;
582b711ef9cSBaptiste Daroussin 			uByte	bAspectRatioY;
583b711ef9cSBaptiste Daroussin 			uByte	bmInterlaceFlags;
584b711ef9cSBaptiste Daroussin 			uByte	bCopyProtect;
585b711ef9cSBaptiste Daroussin 			uByte	bVariableSize;
586b711ef9cSBaptiste Daroussin 		} fb;
587b711ef9cSBaptiste Daroussin 
588b711ef9cSBaptiste Daroussin 		/* Table 3-1: H.264 Payload Video Format Descriptor */
589b711ef9cSBaptiste Daroussin 		struct {
590b711ef9cSBaptiste Daroussin 			uByte	bDefaultFrameIndex;
591b711ef9cSBaptiste Daroussin 			uByte	bMaxCodecConfigDelay;
592b711ef9cSBaptiste Daroussin 			uByte	bmSupportedSliceModes;
593b711ef9cSBaptiste Daroussin 			uByte	bmSupportedSyncFrameTypes;
594b711ef9cSBaptiste Daroussin 			uByte	bResolutionScaling;
595b711ef9cSBaptiste Daroussin 			uByte	_reserved1;
596b711ef9cSBaptiste Daroussin 			uByte	bmSupportedRateControlModes;
597b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecOneResolutionNoScalability;
598b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecTwoResolutionsNoScalability;
599b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecThreeResolutionsNoScalability;
600b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecFourResolutionsNoScalability;
601b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecOneResolutionTemporalScalability;
602b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecTwoResolutionsTemporalScalablility;
603b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecThreeResolutionsTemporalScalability;
604b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecFourResolutionsTemporalScalability;
605b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecOneResolutionTemporalQualityScalability;
606b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecTwoResolutionsTemporalQualityScalability;
607b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecThreeResolutionsTemporalQualityScalablity;
608b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecFourResolutionsTemporalQualityScalability;
609b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecOneResolutionTemporalSpatialScalability;
610b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecTwoResolutionsTemporalSpatialScalability;
611b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecThreeResolutionsTemporalSpatialScalablity;
612b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecFourResolutionsTemporalSpatialScalability;
613b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecOneResolutionFullScalability;
614b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecTwoResolutionsFullScalability;
615b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecThreeResolutionsFullScalability;
616b711ef9cSBaptiste Daroussin 			uWord	wMaxMBperSecFourResolutionsFullScalability;
617b711ef9cSBaptiste Daroussin 		} h264;
618b711ef9cSBaptiste Daroussin 	} u;
619b711ef9cSBaptiste Daroussin 
620b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_LEN(fmt)							\
621b711ef9cSBaptiste Daroussin 	(									\
622b711ef9cSBaptiste Daroussin 	(((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_H264) ||		\
623b711ef9cSBaptiste Daroussin 	 ((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_H264_SIMULCAST)) ?	\
624b711ef9cSBaptiste Daroussin 		(offsetof(struct usb_video_format_desc, u) +			\
625b711ef9cSBaptiste Daroussin 		 sizeof(((struct usb_video_format_desc *)0)->u.h264)) :		\
626b711ef9cSBaptiste Daroussin 	((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_FRAME_BASED) ?		\
627b711ef9cSBaptiste Daroussin 		(offsetof(struct usb_video_format_desc, u) +			\
628b711ef9cSBaptiste Daroussin 		 sizeof(((struct usb_video_format_desc *)0)->u.fb)) :		\
629b711ef9cSBaptiste Daroussin 	((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_UNCOMPRESSED) ?	\
630b711ef9cSBaptiste Daroussin 		(offsetof(struct usb_video_format_desc, u) +			\
631b711ef9cSBaptiste Daroussin 		 sizeof(((struct usb_video_format_desc *)0)->u.uc)) :		\
632b711ef9cSBaptiste Daroussin 	((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_MJPEG) ?		\
633b711ef9cSBaptiste Daroussin 		(offsetof(struct usb_video_format_desc, u) +			\
634b711ef9cSBaptiste Daroussin 		 sizeof(((struct usb_video_format_desc *)0)->u.mjpeg)) :	\
635b711ef9cSBaptiste Daroussin 	sizeof(struct usb_video_colorformat_desc)				\
636b711ef9cSBaptiste Daroussin 	)
637b711ef9cSBaptiste Daroussin 
638b711ef9cSBaptiste Daroussin } __packed;
639b711ef9cSBaptiste Daroussin 
640b711ef9cSBaptiste Daroussin /*
641b711ef9cSBaptiste Daroussin  * Driver specific private definitions.
642b711ef9cSBaptiste Daroussin  */
643*3b6f833cSBaptiste Daroussin #define UVIDEO_NFRAMES_MAX	128
644b711ef9cSBaptiste Daroussin 
645*3b6f833cSBaptiste Daroussin #define UVIDEO_IXFERS		5
646b711ef9cSBaptiste Daroussin struct uvideo_vs_iface {
647b711ef9cSBaptiste Daroussin 	uint8_t			 iface_index;
648b711ef9cSBaptiste Daroussin 	int			 numalts;
649b711ef9cSBaptiste Daroussin 	int			 curalt;
650b711ef9cSBaptiste Daroussin 	int			 endpoint;
651b711ef9cSBaptiste Daroussin 	uint32_t		 psize;
652b711ef9cSBaptiste Daroussin 	int			 bulk_endpoint;
653b711ef9cSBaptiste Daroussin 	int			 bulk_running;
654b711ef9cSBaptiste Daroussin };
655b711ef9cSBaptiste Daroussin 
656b711ef9cSBaptiste Daroussin struct uvideo_frame_buffer {
657b711ef9cSBaptiste Daroussin 	int		 sample;
658b711ef9cSBaptiste Daroussin 	uint8_t		 fid;
659b711ef9cSBaptiste Daroussin 	uint8_t		 error;
660b711ef9cSBaptiste Daroussin 	uint8_t		 mmap_q_full;
661b711ef9cSBaptiste Daroussin 	int		 offset;
662b711ef9cSBaptiste Daroussin 	int		 buf_size;
663b711ef9cSBaptiste Daroussin 	uint8_t		*buf;
664b711ef9cSBaptiste Daroussin 	uint32_t	 fmt_flags;
665b711ef9cSBaptiste Daroussin };
666b711ef9cSBaptiste Daroussin 
667b711ef9cSBaptiste Daroussin /*
668b711ef9cSBaptiste Daroussin  * 1920x1080 uncompressed (e.g. YUYV422) requires ~4MB image data per frame.
669b711ef9cSBaptiste Daroussin  * 4MB * 8 frame buffers = 32MB kernel memory required.
670b711ef9cSBaptiste Daroussin  * With 8 frame buffers we are pretty safe not to run out of kernel memory.
671b711ef9cSBaptiste Daroussin  */
672b711ef9cSBaptiste Daroussin #define UVIDEO_MAX_BUFFERS	8
673b711ef9cSBaptiste Daroussin struct uvideo_mmap {
674b711ef9cSBaptiste Daroussin 	STAILQ_ENTRY(uvideo_mmap)	q_frames;
675b711ef9cSBaptiste Daroussin 	uint8_t				*buf;
676b711ef9cSBaptiste Daroussin 	struct v4l2_buffer		 v4l2_buf;
677b711ef9cSBaptiste Daroussin };
678b711ef9cSBaptiste Daroussin typedef STAILQ_HEAD(, uvideo_mmap) q_mmap;
679b711ef9cSBaptiste Daroussin 
680b711ef9cSBaptiste Daroussin struct uvideo_format_group {
681b711ef9cSBaptiste Daroussin 	uint32_t				 pixelformat;
682b711ef9cSBaptiste Daroussin 	int					 has_colorformat;
683b711ef9cSBaptiste Daroussin 	uint32_t				 colorspace;
684b711ef9cSBaptiste Daroussin 	uint32_t				 xfer_func;
685b711ef9cSBaptiste Daroussin 	uint32_t				 ycbcr_enc;
686b711ef9cSBaptiste Daroussin 	uint8_t					 format_dfidx;
687b711ef9cSBaptiste Daroussin 	struct usb_video_format_desc		*format;
688b711ef9cSBaptiste Daroussin 	/* frame descriptors for mjpeg and uncompressed are identical */
689b711ef9cSBaptiste Daroussin #define UVIDEO_MAX_FRAME			 32
690b711ef9cSBaptiste Daroussin 	struct usb_video_frame_desc		*frame_cur;
691b711ef9cSBaptiste Daroussin 	struct usb_video_frame_desc		*frame[UVIDEO_MAX_FRAME];
692b711ef9cSBaptiste Daroussin 	int					 frame_num;
693b711ef9cSBaptiste Daroussin };
694b711ef9cSBaptiste Daroussin 
695b711ef9cSBaptiste Daroussin struct uvideo_res {
696b711ef9cSBaptiste Daroussin 	int width;
697b711ef9cSBaptiste Daroussin 	int height;
698b711ef9cSBaptiste Daroussin 	int fidx;
699b711ef9cSBaptiste Daroussin };
700b711ef9cSBaptiste Daroussin 
701b711ef9cSBaptiste Daroussin struct uvideo_controls {
702b711ef9cSBaptiste Daroussin 	int		cid;
703b711ef9cSBaptiste Daroussin 	int		type;
704b711ef9cSBaptiste Daroussin 	char		name[32];
705b711ef9cSBaptiste Daroussin 	uint8_t         ctrl_bit;
706b711ef9cSBaptiste Daroussin 	uint16_t	ctrl_selector;
707b711ef9cSBaptiste Daroussin 	uint16_t	ctrl_len;
708b711ef9cSBaptiste Daroussin 	int		sig;
709b711ef9cSBaptiste Daroussin };
710b711ef9cSBaptiste Daroussin 
711b711ef9cSBaptiste Daroussin #endif /* _UVIDEO_H_ */
712