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 	__u8  bLength;
189 	__u8  bDescriptorType;
190 	__u8  bDescriptorSubType;
191 } __attribute__((packed));
192 
193 /* 3.7.2. Video Control Interface Header Descriptor */
194 struct uvc_header_descriptor {
195 	__u8   bLength;
196 	__u8   bDescriptorType;
197 	__u8   bDescriptorSubType;
198 	__le16 bcdUVC;
199 	__le16 wTotalLength;
200 	__le32 dwClockFrequency;
201 	__u8   bInCollection;
202 	__u8   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 	__u8   bLength;					\
213 	__u8   bDescriptorType;				\
214 	__u8   bDescriptorSubType;			\
215 	__le16 bcdUVC;					\
216 	__le16 wTotalLength;				\
217 	__le32 dwClockFrequency;			\
218 	__u8   bInCollection;				\
219 	__u8   baInterfaceNr[n];			\
220 } __attribute__ ((packed))
221 
222 /* 3.7.2.1. Input Terminal Descriptor */
223 struct uvc_input_terminal_descriptor {
224 	__u8   bLength;
225 	__u8   bDescriptorType;
226 	__u8   bDescriptorSubType;
227 	__u8   bTerminalID;
228 	__le16 wTerminalType;
229 	__u8   bAssocTerminal;
230 	__u8   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 	__u8   bLength;
238 	__u8   bDescriptorType;
239 	__u8   bDescriptorSubType;
240 	__u8   bTerminalID;
241 	__le16 wTerminalType;
242 	__u8   bAssocTerminal;
243 	__u8   bSourceID;
244 	__u8   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 	__u8   bLength;
252 	__u8   bDescriptorType;
253 	__u8   bDescriptorSubType;
254 	__u8   bTerminalID;
255 	__le16 wTerminalType;
256 	__u8   bAssocTerminal;
257 	__u8   iTerminal;
258 	__le16 wObjectiveFocalLengthMin;
259 	__le16 wObjectiveFocalLengthMax;
260 	__le16 wOcularFocalLength;
261 	__u8   bControlSize;
262 	__u8   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 	__u8  bLength;
270 	__u8  bDescriptorType;
271 	__u8  bDescriptorSubType;
272 	__u8  bUnitID;
273 	__u8  bNrInPins;
274 	__u8  baSourceID[0];
275 	__u8  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 	__u8  bLength;					\
286 	__u8  bDescriptorType;				\
287 	__u8  bDescriptorSubType;			\
288 	__u8  bUnitID;					\
289 	__u8  bNrInPins;				\
290 	__u8  baSourceID[n];				\
291 	__u8  iSelector;				\
292 } __attribute__ ((packed))
293 
294 /* 3.7.2.5. Processing Unit Descriptor */
295 struct uvc_processing_unit_descriptor {
296 	__u8   bLength;
297 	__u8   bDescriptorType;
298 	__u8   bDescriptorSubType;
299 	__u8   bUnitID;
300 	__u8   bSourceID;
301 	__le16 wMaxMultiplier;
302 	__u8   bControlSize;
303 	__u8   bmControls[2];
304 	__u8   iProcessing;
305 	__u8   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 	__u8  bLength;
313 	__u8  bDescriptorType;
314 	__u8  bDescriptorSubType;
315 	__u8  bUnitID;
316 	__u8  guidExtensionCode[16];
317 	__u8  bNumControls;
318 	__u8  bNrInPins;
319 	__u8  baSourceID[0];
320 	__u8  bControlSize;
321 	__u8  bmControls[0];
322 	__u8  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 	__u8  bLength;					\
333 	__u8  bDescriptorType;				\
334 	__u8  bDescriptorSubType;			\
335 	__u8  bUnitID;					\
336 	__u8  guidExtensionCode[16];			\
337 	__u8  bNumControls;				\
338 	__u8  bNrInPins;				\
339 	__u8  baSourceID[p];				\
340 	__u8  bControlSize;				\
341 	__u8  bmControls[n];				\
342 	__u8  iExtension;				\
343 } __attribute__ ((packed))
344 
345 /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */
346 struct uvc_control_endpoint_descriptor {
347 	__u8   bLength;
348 	__u8   bDescriptorType;
349 	__u8   bDescriptorSubType;
350 	__le16 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 	__u8   bLength;
358 	__u8   bDescriptorType;
359 	__u8   bDescriptorSubType;
360 	__u8   bNumFormats;
361 	__le16 wTotalLength;
362 	__u8   bEndpointAddress;
363 	__u8   bmInfo;
364 	__u8   bTerminalLink;
365 	__u8   bStillCaptureMethod;
366 	__u8   bTriggerSupport;
367 	__u8   bTriggerUsage;
368 	__u8   bControlSize;
369 	__u8   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 	__u8   bLength;					\
380 	__u8   bDescriptorType;				\
381 	__u8   bDescriptorSubType;			\
382 	__u8   bNumFormats;				\
383 	__le16 wTotalLength;				\
384 	__u8   bEndpointAddress;			\
385 	__u8   bmInfo;					\
386 	__u8   bTerminalLink;				\
387 	__u8   bStillCaptureMethod;			\
388 	__u8   bTriggerSupport;				\
389 	__u8   bTriggerUsage;				\
390 	__u8   bControlSize;				\
391 	__u8   bmaControls[p][n];			\
392 } __attribute__ ((packed))
393 
394 /* 3.9.2.2. Output Header Descriptor */
395 struct uvc_output_header_descriptor {
396 	__u8   bLength;
397 	__u8   bDescriptorType;
398 	__u8   bDescriptorSubType;
399 	__u8   bNumFormats;
400 	__le16 wTotalLength;
401 	__u8   bEndpointAddress;
402 	__u8   bTerminalLink;
403 	__u8   bControlSize;
404 	__u8   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 	__u8   bLength;					\
415 	__u8   bDescriptorType;				\
416 	__u8   bDescriptorSubType;			\
417 	__u8   bNumFormats;				\
418 	__le16 wTotalLength;				\
419 	__u8   bEndpointAddress;			\
420 	__u8   bTerminalLink;				\
421 	__u8   bControlSize;				\
422 	__u8   bmaControls[p][n];			\
423 } __attribute__ ((packed))
424 
425 /* 3.9.2.6. Color matching descriptor */
426 struct uvc_color_matching_descriptor {
427 	__u8  bLength;
428 	__u8  bDescriptorType;
429 	__u8  bDescriptorSubType;
430 	__u8  bColorPrimaries;
431 	__u8  bTransferCharacteristics;
432 	__u8  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 	__u16 bmHint;
440 	__u8  bFormatIndex;
441 	__u8  bFrameIndex;
442 	__u32 dwFrameInterval;
443 	__u16 wKeyFrameRate;
444 	__u16 wPFrameRate;
445 	__u16 wCompQuality;
446 	__u16 wCompWindowSize;
447 	__u16 wDelay;
448 	__u32 dwMaxVideoFrameSize;
449 	__u32 dwMaxPayloadTransferSize;
450 	__u32 dwClockFrequency;
451 	__u8  bmFramingInfo;
452 	__u8  bPreferedVersion;
453 	__u8  bMinVersion;
454 	__u8  bMaxVersion;
455 } __attribute__((__packed__));
456 
457 /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */
458 struct uvc_format_uncompressed {
459 	__u8  bLength;
460 	__u8  bDescriptorType;
461 	__u8  bDescriptorSubType;
462 	__u8  bFormatIndex;
463 	__u8  bNumFrameDescriptors;
464 	__u8  guidFormat[16];
465 	__u8  bBitsPerPixel;
466 	__u8  bDefaultFrameIndex;
467 	__u8  bAspectRatioX;
468 	__u8  bAspectRatioY;
469 	__u8  bmInterfaceFlags;
470 	__u8  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 	__u8   bLength;
478 	__u8   bDescriptorType;
479 	__u8   bDescriptorSubType;
480 	__u8   bFrameIndex;
481 	__u8   bmCapabilities;
482 	__le16 wWidth;
483 	__le16 wHeight;
484 	__le32 dwMinBitRate;
485 	__le32 dwMaxBitRate;
486 	__le32 dwMaxVideoFrameBufferSize;
487 	__le32 dwDefaultFrameInterval;
488 	__u8   bFrameIntervalType;
489 	__le32 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 	__u8   bLength;					\
500 	__u8   bDescriptorType;				\
501 	__u8   bDescriptorSubType;			\
502 	__u8   bFrameIndex;				\
503 	__u8   bmCapabilities;				\
504 	__le16 wWidth;					\
505 	__le16 wHeight;					\
506 	__le32 dwMinBitRate;				\
507 	__le32 dwMaxBitRate;				\
508 	__le32 dwMaxVideoFrameBufferSize;		\
509 	__le32 dwDefaultFrameInterval;			\
510 	__u8   bFrameIntervalType;			\
511 	__le32 dwFrameInterval[n];			\
512 } __attribute__ ((packed))
513 
514 /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
515 struct uvc_format_mjpeg {
516 	__u8  bLength;
517 	__u8  bDescriptorType;
518 	__u8  bDescriptorSubType;
519 	__u8  bFormatIndex;
520 	__u8  bNumFrameDescriptors;
521 	__u8  bmFlags;
522 	__u8  bDefaultFrameIndex;
523 	__u8  bAspectRatioX;
524 	__u8  bAspectRatioY;
525 	__u8  bmInterfaceFlags;
526 	__u8  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 	__u8   bLength;
534 	__u8   bDescriptorType;
535 	__u8   bDescriptorSubType;
536 	__u8   bFrameIndex;
537 	__u8   bmCapabilities;
538 	__le16 wWidth;
539 	__le16 wHeight;
540 	__le32 dwMinBitRate;
541 	__le32 dwMaxBitRate;
542 	__le32 dwMaxVideoFrameBufferSize;
543 	__le32 dwDefaultFrameInterval;
544 	__u8   bFrameIntervalType;
545 	__le32 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 	__u8   bLength;					\
556 	__u8   bDescriptorType;				\
557 	__u8   bDescriptorSubType;			\
558 	__u8   bFrameIndex;				\
559 	__u8   bmCapabilities;				\
560 	__le16 wWidth;					\
561 	__le16 wHeight;					\
562 	__le32 dwMinBitRate;				\
563 	__le32 dwMaxBitRate;				\
564 	__le32 dwMaxVideoFrameBufferSize;		\
565 	__le32 dwDefaultFrameInterval;			\
566 	__u8   bFrameIntervalType;			\
567 	__le32 dwFrameInterval[n];			\
568 } __attribute__ ((packed))
569 
570 #endif /* __LINUX_USB_VIDEO_H */
571 
572