1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 /*
3  * USB Video Class definitions.
4  *
5  * Copyright (C) 2009 Laurent Pinchart <laurent.pinchart@skynet.be>
6  *
7  * This file holds USB constants and structures defined by the USB Device
8  * Class Definition for Video Devices. Unless otherwise stated, comments
9  * below reference relevant sections of the USB Video Class 1.1 specification
10  * available at
11  *
12  * http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip
13  */
14 
15 #ifndef __LINUX_USB_VIDEO_H
16 #define __LINUX_USB_VIDEO_H
17 
18 #include <linux/types.h>
19 
20 /* --------------------------------------------------------------------------
21  * UVC constants
22  */
23 
24 /* A.2. Video Interface Subclass Codes */
25 #define UVC_SC_UNDEFINED				0x00
26 #define UVC_SC_VIDEOCONTROL				0x01
27 #define UVC_SC_VIDEOSTREAMING				0x02
28 #define UVC_SC_VIDEO_INTERFACE_COLLECTION		0x03
29 
30 /* A.3. Video Interface Protocol Codes */
31 #define UVC_PC_PROTOCOL_UNDEFINED			0x00
32 #define UVC_PC_PROTOCOL_15				0x01
33 
34 /* A.5. Video Class-Specific VC Interface Descriptor Subtypes */
35 #define UVC_VC_DESCRIPTOR_UNDEFINED			0x00
36 #define UVC_VC_HEADER					0x01
37 #define UVC_VC_INPUT_TERMINAL				0x02
38 #define UVC_VC_OUTPUT_TERMINAL				0x03
39 #define UVC_VC_SELECTOR_UNIT				0x04
40 #define UVC_VC_PROCESSING_UNIT				0x05
41 #define UVC_VC_EXTENSION_UNIT				0x06
42 
43 /* A.6. Video Class-Specific VS Interface Descriptor Subtypes */
44 #define UVC_VS_UNDEFINED				0x00
45 #define UVC_VS_INPUT_HEADER				0x01
46 #define UVC_VS_OUTPUT_HEADER				0x02
47 #define UVC_VS_STILL_IMAGE_FRAME			0x03
48 #define UVC_VS_FORMAT_UNCOMPRESSED			0x04
49 #define UVC_VS_FRAME_UNCOMPRESSED			0x05
50 #define UVC_VS_FORMAT_MJPEG				0x06
51 #define UVC_VS_FRAME_MJPEG				0x07
52 #define UVC_VS_FORMAT_MPEG2TS				0x0a
53 #define UVC_VS_FORMAT_DV				0x0c
54 #define UVC_VS_COLORFORMAT				0x0d
55 #define UVC_VS_FORMAT_FRAME_BASED			0x10
56 #define UVC_VS_FRAME_FRAME_BASED			0x11
57 #define UVC_VS_FORMAT_STREAM_BASED			0x12
58 
59 /* A.7. Video Class-Specific Endpoint Descriptor Subtypes */
60 #define UVC_EP_UNDEFINED				0x00
61 #define UVC_EP_GENERAL					0x01
62 #define UVC_EP_ENDPOINT					0x02
63 #define UVC_EP_INTERRUPT				0x03
64 
65 /* A.8. Video Class-Specific Request Codes */
66 #define UVC_RC_UNDEFINED				0x00
67 #define UVC_SET_CUR					0x01
68 #define UVC_GET_CUR					0x81
69 #define UVC_GET_MIN					0x82
70 #define UVC_GET_MAX					0x83
71 #define UVC_GET_RES					0x84
72 #define UVC_GET_LEN					0x85
73 #define UVC_GET_INFO					0x86
74 #define UVC_GET_DEF					0x87
75 
76 /* A.9.1. VideoControl Interface Control Selectors */
77 #define UVC_VC_CONTROL_UNDEFINED			0x00
78 #define UVC_VC_VIDEO_POWER_MODE_CONTROL			0x01
79 #define UVC_VC_REQUEST_ERROR_CODE_CONTROL		0x02
80 
81 /* A.9.2. Terminal Control Selectors */
82 #define UVC_TE_CONTROL_UNDEFINED			0x00
83 
84 /* A.9.3. Selector Unit Control Selectors */
85 #define UVC_SU_CONTROL_UNDEFINED			0x00
86 #define UVC_SU_INPUT_SELECT_CONTROL			0x01
87 
88 /* A.9.4. Camera Terminal Control Selectors */
89 #define UVC_CT_CONTROL_UNDEFINED			0x00
90 #define UVC_CT_SCANNING_MODE_CONTROL			0x01
91 #define UVC_CT_AE_MODE_CONTROL				0x02
92 #define UVC_CT_AE_PRIORITY_CONTROL			0x03
93 #define UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL		0x04
94 #define UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL		0x05
95 #define UVC_CT_FOCUS_ABSOLUTE_CONTROL			0x06
96 #define UVC_CT_FOCUS_RELATIVE_CONTROL			0x07
97 #define UVC_CT_FOCUS_AUTO_CONTROL			0x08
98 #define UVC_CT_IRIS_ABSOLUTE_CONTROL			0x09
99 #define UVC_CT_IRIS_RELATIVE_CONTROL			0x0a
100 #define UVC_CT_ZOOM_ABSOLUTE_CONTROL			0x0b
101 #define UVC_CT_ZOOM_RELATIVE_CONTROL			0x0c
102 #define UVC_CT_PANTILT_ABSOLUTE_CONTROL			0x0d
103 #define UVC_CT_PANTILT_RELATIVE_CONTROL			0x0e
104 #define UVC_CT_ROLL_ABSOLUTE_CONTROL			0x0f
105 #define UVC_CT_ROLL_RELATIVE_CONTROL			0x10
106 #define UVC_CT_PRIVACY_CONTROL				0x11
107 
108 /* A.9.5. Processing Unit Control Selectors */
109 #define UVC_PU_CONTROL_UNDEFINED			0x00
110 #define UVC_PU_BACKLIGHT_COMPENSATION_CONTROL		0x01
111 #define UVC_PU_BRIGHTNESS_CONTROL			0x02
112 #define UVC_PU_CONTRAST_CONTROL				0x03
113 #define UVC_PU_GAIN_CONTROL				0x04
114 #define UVC_PU_POWER_LINE_FREQUENCY_CONTROL		0x05
115 #define UVC_PU_HUE_CONTROL				0x06
116 #define UVC_PU_SATURATION_CONTROL			0x07
117 #define UVC_PU_SHARPNESS_CONTROL			0x08
118 #define UVC_PU_GAMMA_CONTROL				0x09
119 #define UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL	0x0a
120 #define UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL	0x0b
121 #define UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL		0x0c
122 #define UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL	0x0d
123 #define UVC_PU_DIGITAL_MULTIPLIER_CONTROL		0x0e
124 #define UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL		0x0f
125 #define UVC_PU_HUE_AUTO_CONTROL				0x10
126 #define UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL		0x11
127 #define UVC_PU_ANALOG_LOCK_STATUS_CONTROL		0x12
128 
129 /* A.9.7. VideoStreaming Interface Control Selectors */
130 #define UVC_VS_CONTROL_UNDEFINED			0x00
131 #define UVC_VS_PROBE_CONTROL				0x01
132 #define UVC_VS_COMMIT_CONTROL				0x02
133 #define UVC_VS_STILL_PROBE_CONTROL			0x03
134 #define UVC_VS_STILL_COMMIT_CONTROL			0x04
135 #define UVC_VS_STILL_IMAGE_TRIGGER_CONTROL		0x05
136 #define UVC_VS_STREAM_ERROR_CODE_CONTROL		0x06
137 #define UVC_VS_GENERATE_KEY_FRAME_CONTROL		0x07
138 #define UVC_VS_UPDATE_FRAME_SEGMENT_CONTROL		0x08
139 #define UVC_VS_SYNC_DELAY_CONTROL			0x09
140 
141 /* B.1. USB Terminal Types */
142 #define UVC_TT_VENDOR_SPECIFIC				0x0100
143 #define UVC_TT_STREAMING				0x0101
144 
145 /* B.2. Input Terminal Types */
146 #define UVC_ITT_VENDOR_SPECIFIC				0x0200
147 #define UVC_ITT_CAMERA					0x0201
148 #define UVC_ITT_MEDIA_TRANSPORT_INPUT			0x0202
149 
150 /* B.3. Output Terminal Types */
151 #define UVC_OTT_VENDOR_SPECIFIC				0x0300
152 #define UVC_OTT_DISPLAY					0x0301
153 #define UVC_OTT_MEDIA_TRANSPORT_OUTPUT			0x0302
154 
155 /* B.4. External Terminal Types */
156 #define UVC_EXTERNAL_VENDOR_SPECIFIC			0x0400
157 #define UVC_COMPOSITE_CONNECTOR				0x0401
158 #define UVC_SVIDEO_CONNECTOR				0x0402
159 #define UVC_COMPONENT_CONNECTOR				0x0403
160 
161 /* 2.4.2.2. Status Packet Type */
162 #define UVC_STATUS_TYPE_CONTROL				1
163 #define UVC_STATUS_TYPE_STREAMING			2
164 
165 /* 2.4.3.3. Payload Header Information */
166 #define UVC_STREAM_EOH					(1 << 7)
167 #define UVC_STREAM_ERR					(1 << 6)
168 #define UVC_STREAM_STI					(1 << 5)
169 #define UVC_STREAM_RES					(1 << 4)
170 #define UVC_STREAM_SCR					(1 << 3)
171 #define UVC_STREAM_PTS					(1 << 2)
172 #define UVC_STREAM_EOF					(1 << 1)
173 #define UVC_STREAM_FID					(1 << 0)
174 
175 /* 4.1.2. Control Capabilities */
176 #define UVC_CONTROL_CAP_GET				(1 << 0)
177 #define UVC_CONTROL_CAP_SET				(1 << 1)
178 #define UVC_CONTROL_CAP_DISABLED			(1 << 2)
179 #define UVC_CONTROL_CAP_AUTOUPDATE			(1 << 3)
180 #define UVC_CONTROL_CAP_ASYNCHRONOUS			(1 << 4)
181 
182 /* ------------------------------------------------------------------------
183  * UVC structures
184  */
185 
186 /* All UVC descriptors have these 3 fields at the beginning */
187 struct uvc_descriptor_header {
188 	uint8_t  bLength;
189 	uint8_t  bDescriptorType;
190 	uint8_t  bDescriptorSubType;
191 } __attribute__((packed));
192 
193 /* 3.7.2. Video Control Interface Header Descriptor */
194 struct uvc_header_descriptor {
195 	uint8_t   bLength;
196 	uint8_t   bDescriptorType;
197 	uint8_t   bDescriptorSubType;
198 	uint16_t bcdUVC;
199 	uint16_t wTotalLength;
200 	uint32_t dwClockFrequency;
201 	uint8_t   bInCollection;
202 	uint8_t   baInterfaceNr[];
203 } __attribute__((__packed__));
204 
205 #define UVC_DT_HEADER_SIZE(n)				(12+(n))
206 
207 #define UVC_HEADER_DESCRIPTOR(n) \
208 	uvc_header_descriptor_##n
209 
210 #define DECLARE_UVC_HEADER_DESCRIPTOR(n)		\
211 struct UVC_HEADER_DESCRIPTOR(n) {			\
212 	uint8_t   bLength;					\
213 	uint8_t   bDescriptorType;				\
214 	uint8_t   bDescriptorSubType;			\
215 	uint16_t bcdUVC;					\
216 	uint16_t wTotalLength;				\
217 	uint32_t dwClockFrequency;			\
218 	uint8_t   bInCollection;				\
219 	uint8_t   baInterfaceNr[n];			\
220 } __attribute__ ((packed))
221 
222 /* 3.7.2.1. Input Terminal Descriptor */
223 struct uvc_input_terminal_descriptor {
224 	uint8_t   bLength;
225 	uint8_t   bDescriptorType;
226 	uint8_t   bDescriptorSubType;
227 	uint8_t   bTerminalID;
228 	uint16_t wTerminalType;
229 	uint8_t   bAssocTerminal;
230 	uint8_t   iTerminal;
231 } __attribute__((__packed__));
232 
233 #define UVC_DT_INPUT_TERMINAL_SIZE			8
234 
235 /* 3.7.2.2. Output Terminal Descriptor */
236 struct uvc_output_terminal_descriptor {
237 	uint8_t   bLength;
238 	uint8_t   bDescriptorType;
239 	uint8_t   bDescriptorSubType;
240 	uint8_t   bTerminalID;
241 	uint16_t wTerminalType;
242 	uint8_t   bAssocTerminal;
243 	uint8_t   bSourceID;
244 	uint8_t   iTerminal;
245 } __attribute__((__packed__));
246 
247 #define UVC_DT_OUTPUT_TERMINAL_SIZE			9
248 
249 /* 3.7.2.3. Camera Terminal Descriptor */
250 struct uvc_camera_terminal_descriptor {
251 	uint8_t   bLength;
252 	uint8_t   bDescriptorType;
253 	uint8_t   bDescriptorSubType;
254 	uint8_t   bTerminalID;
255 	uint16_t wTerminalType;
256 	uint8_t   bAssocTerminal;
257 	uint8_t   iTerminal;
258 	uint16_t wObjectiveFocalLengthMin;
259 	uint16_t wObjectiveFocalLengthMax;
260 	uint16_t wOcularFocalLength;
261 	uint8_t   bControlSize;
262 	uint8_t   bmControls[3];
263 } __attribute__((__packed__));
264 
265 #define UVC_DT_CAMERA_TERMINAL_SIZE(n)			(15+(n))
266 
267 /* 3.7.2.4. Selector Unit Descriptor */
268 struct uvc_selector_unit_descriptor {
269 	uint8_t  bLength;
270 	uint8_t  bDescriptorType;
271 	uint8_t  bDescriptorSubType;
272 	uint8_t  bUnitID;
273 	uint8_t  bNrInPins;
274 	uint8_t  baSourceID[0];
275 	uint8_t  iSelector;
276 } __attribute__((__packed__));
277 
278 #define UVC_DT_SELECTOR_UNIT_SIZE(n)			(6+(n))
279 
280 #define UVC_SELECTOR_UNIT_DESCRIPTOR(n)	\
281 	uvc_selector_unit_descriptor_##n
282 
283 #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n)	\
284 struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) {		\
285 	uint8_t  bLength;					\
286 	uint8_t  bDescriptorType;				\
287 	uint8_t  bDescriptorSubType;			\
288 	uint8_t  bUnitID;					\
289 	uint8_t  bNrInPins;				\
290 	uint8_t  baSourceID[n];				\
291 	uint8_t  iSelector;				\
292 } __attribute__ ((packed))
293 
294 /* 3.7.2.5. Processing Unit Descriptor */
295 struct uvc_processing_unit_descriptor {
296 	uint8_t   bLength;
297 	uint8_t   bDescriptorType;
298 	uint8_t   bDescriptorSubType;
299 	uint8_t   bUnitID;
300 	uint8_t   bSourceID;
301 	uint16_t wMaxMultiplier;
302 	uint8_t   bControlSize;
303 	uint8_t   bmControls[2];
304 	uint8_t   iProcessing;
305 	uint8_t   bmVideoStandards;
306 } __attribute__((__packed__));
307 
308 #define UVC_DT_PROCESSING_UNIT_SIZE(n)			(10+(n))
309 
310 /* 3.7.2.6. Extension Unit Descriptor */
311 struct uvc_extension_unit_descriptor {
312 	uint8_t  bLength;
313 	uint8_t  bDescriptorType;
314 	uint8_t  bDescriptorSubType;
315 	uint8_t  bUnitID;
316 	uint8_t  guidExtensionCode[16];
317 	uint8_t  bNumControls;
318 	uint8_t  bNrInPins;
319 	uint8_t  baSourceID[0];
320 	uint8_t  bControlSize;
321 	uint8_t  bmControls[0];
322 	uint8_t  iExtension;
323 } __attribute__((__packed__));
324 
325 #define UVC_DT_EXTENSION_UNIT_SIZE(p, n)		(24+(p)+(n))
326 
327 #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
328 	uvc_extension_unit_descriptor_##p_##n
329 
330 #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n)	\
331 struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) {		\
332 	uint8_t  bLength;					\
333 	uint8_t  bDescriptorType;				\
334 	uint8_t  bDescriptorSubType;			\
335 	uint8_t  bUnitID;					\
336 	uint8_t  guidExtensionCode[16];			\
337 	uint8_t  bNumControls;				\
338 	uint8_t  bNrInPins;				\
339 	uint8_t  baSourceID[p];				\
340 	uint8_t  bControlSize;				\
341 	uint8_t  bmControls[n];				\
342 	uint8_t  iExtension;				\
343 } __attribute__ ((packed))
344 
345 /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */
346 struct uvc_control_endpoint_descriptor {
347 	uint8_t   bLength;
348 	uint8_t   bDescriptorType;
349 	uint8_t   bDescriptorSubType;
350 	uint16_t wMaxTransferSize;
351 } __attribute__((__packed__));
352 
353 #define UVC_DT_CONTROL_ENDPOINT_SIZE			5
354 
355 /* 3.9.2.1. Input Header Descriptor */
356 struct uvc_input_header_descriptor {
357 	uint8_t   bLength;
358 	uint8_t   bDescriptorType;
359 	uint8_t   bDescriptorSubType;
360 	uint8_t   bNumFormats;
361 	uint16_t wTotalLength;
362 	uint8_t   bEndpointAddress;
363 	uint8_t   bmInfo;
364 	uint8_t   bTerminalLink;
365 	uint8_t   bStillCaptureMethod;
366 	uint8_t   bTriggerSupport;
367 	uint8_t   bTriggerUsage;
368 	uint8_t   bControlSize;
369 	uint8_t   bmaControls[];
370 } __attribute__((__packed__));
371 
372 #define UVC_DT_INPUT_HEADER_SIZE(n, p)			(13+(n*p))
373 
374 #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
375 	uvc_input_header_descriptor_##n_##p
376 
377 #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p)	\
378 struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) {		\
379 	uint8_t   bLength;					\
380 	uint8_t   bDescriptorType;				\
381 	uint8_t   bDescriptorSubType;			\
382 	uint8_t   bNumFormats;				\
383 	uint16_t wTotalLength;				\
384 	uint8_t   bEndpointAddress;			\
385 	uint8_t   bmInfo;					\
386 	uint8_t   bTerminalLink;				\
387 	uint8_t   bStillCaptureMethod;			\
388 	uint8_t   bTriggerSupport;				\
389 	uint8_t   bTriggerUsage;				\
390 	uint8_t   bControlSize;				\
391 	uint8_t   bmaControls[p][n];			\
392 } __attribute__ ((packed))
393 
394 /* 3.9.2.2. Output Header Descriptor */
395 struct uvc_output_header_descriptor {
396 	uint8_t   bLength;
397 	uint8_t   bDescriptorType;
398 	uint8_t   bDescriptorSubType;
399 	uint8_t   bNumFormats;
400 	uint16_t wTotalLength;
401 	uint8_t   bEndpointAddress;
402 	uint8_t   bTerminalLink;
403 	uint8_t   bControlSize;
404 	uint8_t   bmaControls[];
405 } __attribute__((__packed__));
406 
407 #define UVC_DT_OUTPUT_HEADER_SIZE(n, p)			(9+(n*p))
408 
409 #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
410 	uvc_output_header_descriptor_##n_##p
411 
412 #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p)	\
413 struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) {		\
414 	uint8_t   bLength;					\
415 	uint8_t   bDescriptorType;				\
416 	uint8_t   bDescriptorSubType;			\
417 	uint8_t   bNumFormats;				\
418 	uint16_t wTotalLength;				\
419 	uint8_t   bEndpointAddress;			\
420 	uint8_t   bTerminalLink;				\
421 	uint8_t   bControlSize;				\
422 	uint8_t   bmaControls[p][n];			\
423 } __attribute__ ((packed))
424 
425 /* 3.9.2.6. Color matching descriptor */
426 struct uvc_color_matching_descriptor {
427 	uint8_t  bLength;
428 	uint8_t  bDescriptorType;
429 	uint8_t  bDescriptorSubType;
430 	uint8_t  bColorPrimaries;
431 	uint8_t  bTransferCharacteristics;
432 	uint8_t  bMatrixCoefficients;
433 } __attribute__((__packed__));
434 
435 #define UVC_DT_COLOR_MATCHING_SIZE			6
436 
437 /* 4.3.1.1. Video Probe and Commit Controls */
438 struct uvc_streaming_control {
439 	uint16_t bmHint;
440 	uint8_t  bFormatIndex;
441 	uint8_t  bFrameIndex;
442 	uint32_t dwFrameInterval;
443 	uint16_t wKeyFrameRate;
444 	uint16_t wPFrameRate;
445 	uint16_t wCompQuality;
446 	uint16_t wCompWindowSize;
447 	uint16_t wDelay;
448 	uint32_t dwMaxVideoFrameSize;
449 	uint32_t dwMaxPayloadTransferSize;
450 	uint32_t dwClockFrequency;
451 	uint8_t  bmFramingInfo;
452 	uint8_t  bPreferedVersion;
453 	uint8_t  bMinVersion;
454 	uint8_t  bMaxVersion;
455 } __attribute__((__packed__));
456 
457 /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */
458 struct uvc_format_uncompressed {
459 	uint8_t  bLength;
460 	uint8_t  bDescriptorType;
461 	uint8_t  bDescriptorSubType;
462 	uint8_t  bFormatIndex;
463 	uint8_t  bNumFrameDescriptors;
464 	uint8_t  guidFormat[16];
465 	uint8_t  bBitsPerPixel;
466 	uint8_t  bDefaultFrameIndex;
467 	uint8_t  bAspectRatioX;
468 	uint8_t  bAspectRatioY;
469 	uint8_t  bmInterfaceFlags;
470 	uint8_t  bCopyProtect;
471 } __attribute__((__packed__));
472 
473 #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE			27
474 
475 /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */
476 struct uvc_frame_uncompressed {
477 	uint8_t   bLength;
478 	uint8_t   bDescriptorType;
479 	uint8_t   bDescriptorSubType;
480 	uint8_t   bFrameIndex;
481 	uint8_t   bmCapabilities;
482 	uint16_t wWidth;
483 	uint16_t wHeight;
484 	uint32_t dwMinBitRate;
485 	uint32_t dwMaxBitRate;
486 	uint32_t dwMaxVideoFrameBufferSize;
487 	uint32_t dwDefaultFrameInterval;
488 	uint8_t   bFrameIntervalType;
489 	uint32_t dwFrameInterval[];
490 } __attribute__((__packed__));
491 
492 #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n)		(26+4*(n))
493 
494 #define UVC_FRAME_UNCOMPRESSED(n) \
495 	uvc_frame_uncompressed_##n
496 
497 #define DECLARE_UVC_FRAME_UNCOMPRESSED(n)		\
498 struct UVC_FRAME_UNCOMPRESSED(n) {			\
499 	uint8_t   bLength;					\
500 	uint8_t   bDescriptorType;				\
501 	uint8_t   bDescriptorSubType;			\
502 	uint8_t   bFrameIndex;				\
503 	uint8_t   bmCapabilities;				\
504 	uint16_t wWidth;					\
505 	uint16_t wHeight;					\
506 	uint32_t dwMinBitRate;				\
507 	uint32_t dwMaxBitRate;				\
508 	uint32_t dwMaxVideoFrameBufferSize;		\
509 	uint32_t dwDefaultFrameInterval;			\
510 	uint8_t   bFrameIntervalType;			\
511 	uint32_t dwFrameInterval[n];			\
512 } __attribute__ ((packed))
513 
514 /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
515 struct uvc_format_mjpeg {
516 	uint8_t  bLength;
517 	uint8_t  bDescriptorType;
518 	uint8_t  bDescriptorSubType;
519 	uint8_t  bFormatIndex;
520 	uint8_t  bNumFrameDescriptors;
521 	uint8_t  bmFlags;
522 	uint8_t  bDefaultFrameIndex;
523 	uint8_t  bAspectRatioX;
524 	uint8_t  bAspectRatioY;
525 	uint8_t  bmInterfaceFlags;
526 	uint8_t  bCopyProtect;
527 } __attribute__((__packed__));
528 
529 #define UVC_DT_FORMAT_MJPEG_SIZE			11
530 
531 /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */
532 struct uvc_frame_mjpeg {
533 	uint8_t   bLength;
534 	uint8_t   bDescriptorType;
535 	uint8_t   bDescriptorSubType;
536 	uint8_t   bFrameIndex;
537 	uint8_t   bmCapabilities;
538 	uint16_t wWidth;
539 	uint16_t wHeight;
540 	uint32_t dwMinBitRate;
541 	uint32_t dwMaxBitRate;
542 	uint32_t dwMaxVideoFrameBufferSize;
543 	uint32_t dwDefaultFrameInterval;
544 	uint8_t   bFrameIntervalType;
545 	uint32_t dwFrameInterval[];
546 } __attribute__((__packed__));
547 
548 #define UVC_DT_FRAME_MJPEG_SIZE(n)			(26+4*(n))
549 
550 #define UVC_FRAME_MJPEG(n) \
551 	uvc_frame_mjpeg_##n
552 
553 #define DECLARE_UVC_FRAME_MJPEG(n)			\
554 struct UVC_FRAME_MJPEG(n) {				\
555 	uint8_t   bLength;					\
556 	uint8_t   bDescriptorType;				\
557 	uint8_t   bDescriptorSubType;			\
558 	uint8_t   bFrameIndex;				\
559 	uint8_t   bmCapabilities;				\
560 	uint16_t wWidth;					\
561 	uint16_t wHeight;					\
562 	uint32_t dwMinBitRate;				\
563 	uint32_t dwMaxBitRate;				\
564 	uint32_t dwMaxVideoFrameBufferSize;		\
565 	uint32_t dwDefaultFrameInterval;			\
566 	uint8_t   bFrameIntervalType;			\
567 	uint32_t dwFrameInterval[n];			\
568 } __attribute__ ((packed))
569 
570 #endif /* __LINUX_USB_VIDEO_H */
571 
572