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 	__u16 bcdUVC;
199 	__u16 wTotalLength;
200 	__u32 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 	__u16 bcdUVC;					\
216 	__u16 wTotalLength;				\
217 	__u32 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 	__u16 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 	__u16 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 	__u16 wTerminalType;
256 	__u8  bAssocTerminal;
257 	__u8  iTerminal;
258 	__u16 wObjectiveFocalLengthMin;
259 	__u16 wObjectiveFocalLengthMax;
260 	__u16 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 	__u16 wMaxMultiplier;
302 	__u8  bControlSize;
303 	__u8  bmControls[2];
304 	__u8  iProcessing;
305 } __attribute__((__packed__));
306 
307 #define UVC_DT_PROCESSING_UNIT_SIZE(n)			(9+(n))
308 
309 /* 3.7.2.6. Extension Unit Descriptor */
310 struct uvc_extension_unit_descriptor {
311 	__u8  bLength;
312 	__u8  bDescriptorType;
313 	__u8  bDescriptorSubType;
314 	__u8  bUnitID;
315 	__u8  guidExtensionCode[16];
316 	__u8  bNumControls;
317 	__u8  bNrInPins;
318 	__u8  baSourceID[0];
319 	__u8  bControlSize;
320 	__u8  bmControls[0];
321 	__u8  iExtension;
322 } __attribute__((__packed__));
323 
324 #define UVC_DT_EXTENSION_UNIT_SIZE(p, n)		(24+(p)+(n))
325 
326 #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
327 	uvc_extension_unit_descriptor_##p_##n
328 
329 #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n)	\
330 struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) {		\
331 	__u8  bLength;					\
332 	__u8  bDescriptorType;				\
333 	__u8  bDescriptorSubType;			\
334 	__u8  bUnitID;					\
335 	__u8  guidExtensionCode[16];			\
336 	__u8  bNumControls;				\
337 	__u8  bNrInPins;				\
338 	__u8  baSourceID[p];				\
339 	__u8  bControlSize;				\
340 	__u8  bmControls[n];				\
341 	__u8  iExtension;				\
342 } __attribute__ ((packed))
343 
344 /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */
345 struct uvc_control_endpoint_descriptor {
346 	__u8  bLength;
347 	__u8  bDescriptorType;
348 	__u8  bDescriptorSubType;
349 	__u16 wMaxTransferSize;
350 } __attribute__((__packed__));
351 
352 #define UVC_DT_CONTROL_ENDPOINT_SIZE			5
353 
354 /* 3.9.2.1. Input Header Descriptor */
355 struct uvc_input_header_descriptor {
356 	__u8  bLength;
357 	__u8  bDescriptorType;
358 	__u8  bDescriptorSubType;
359 	__u8  bNumFormats;
360 	__u16 wTotalLength;
361 	__u8  bEndpointAddress;
362 	__u8  bmInfo;
363 	__u8  bTerminalLink;
364 	__u8  bStillCaptureMethod;
365 	__u8  bTriggerSupport;
366 	__u8  bTriggerUsage;
367 	__u8  bControlSize;
368 	__u8  bmaControls[];
369 } __attribute__((__packed__));
370 
371 #define UVC_DT_INPUT_HEADER_SIZE(n, p)			(13+(n*p))
372 
373 #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
374 	uvc_input_header_descriptor_##n_##p
375 
376 #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p)	\
377 struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) {		\
378 	__u8  bLength;					\
379 	__u8  bDescriptorType;				\
380 	__u8  bDescriptorSubType;			\
381 	__u8  bNumFormats;				\
382 	__u16 wTotalLength;				\
383 	__u8  bEndpointAddress;				\
384 	__u8  bmInfo;					\
385 	__u8  bTerminalLink;				\
386 	__u8  bStillCaptureMethod;			\
387 	__u8  bTriggerSupport;				\
388 	__u8  bTriggerUsage;				\
389 	__u8  bControlSize;				\
390 	__u8  bmaControls[p][n];			\
391 } __attribute__ ((packed))
392 
393 /* 3.9.2.2. Output Header Descriptor */
394 struct uvc_output_header_descriptor {
395 	__u8  bLength;
396 	__u8  bDescriptorType;
397 	__u8  bDescriptorSubType;
398 	__u8  bNumFormats;
399 	__u16 wTotalLength;
400 	__u8  bEndpointAddress;
401 	__u8  bTerminalLink;
402 	__u8  bControlSize;
403 	__u8  bmaControls[];
404 } __attribute__((__packed__));
405 
406 #define UVC_DT_OUTPUT_HEADER_SIZE(n, p)			(9+(n*p))
407 
408 #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
409 	uvc_output_header_descriptor_##n_##p
410 
411 #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p)	\
412 struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) {		\
413 	__u8  bLength;					\
414 	__u8  bDescriptorType;				\
415 	__u8  bDescriptorSubType;			\
416 	__u8  bNumFormats;				\
417 	__u16 wTotalLength;				\
418 	__u8  bEndpointAddress;				\
419 	__u8  bTerminalLink;				\
420 	__u8  bControlSize;				\
421 	__u8  bmaControls[p][n];			\
422 } __attribute__ ((packed))
423 
424 /* 3.9.2.6. Color matching descriptor */
425 struct uvc_color_matching_descriptor {
426 	__u8  bLength;
427 	__u8  bDescriptorType;
428 	__u8  bDescriptorSubType;
429 	__u8  bColorPrimaries;
430 	__u8  bTransferCharacteristics;
431 	__u8  bMatrixCoefficients;
432 } __attribute__((__packed__));
433 
434 #define UVC_DT_COLOR_MATCHING_SIZE			6
435 
436 /* 4.3.1.1. Video Probe and Commit Controls */
437 struct uvc_streaming_control {
438 	__u16 bmHint;
439 	__u8  bFormatIndex;
440 	__u8  bFrameIndex;
441 	__u32 dwFrameInterval;
442 	__u16 wKeyFrameRate;
443 	__u16 wPFrameRate;
444 	__u16 wCompQuality;
445 	__u16 wCompWindowSize;
446 	__u16 wDelay;
447 	__u32 dwMaxVideoFrameSize;
448 	__u32 dwMaxPayloadTransferSize;
449 	__u32 dwClockFrequency;
450 	__u8  bmFramingInfo;
451 	__u8  bPreferedVersion;
452 	__u8  bMinVersion;
453 	__u8  bMaxVersion;
454 } __attribute__((__packed__));
455 
456 /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */
457 struct uvc_format_uncompressed {
458 	__u8  bLength;
459 	__u8  bDescriptorType;
460 	__u8  bDescriptorSubType;
461 	__u8  bFormatIndex;
462 	__u8  bNumFrameDescriptors;
463 	__u8  guidFormat[16];
464 	__u8  bBitsPerPixel;
465 	__u8  bDefaultFrameIndex;
466 	__u8  bAspectRatioX;
467 	__u8  bAspectRatioY;
468 	__u8  bmInterfaceFlags;
469 	__u8  bCopyProtect;
470 } __attribute__((__packed__));
471 
472 #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE			27
473 
474 /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */
475 struct uvc_frame_uncompressed {
476 	__u8  bLength;
477 	__u8  bDescriptorType;
478 	__u8  bDescriptorSubType;
479 	__u8  bFrameIndex;
480 	__u8  bmCapabilities;
481 	__u16 wWidth;
482 	__u16 wHeight;
483 	__u32 dwMinBitRate;
484 	__u32 dwMaxBitRate;
485 	__u32 dwMaxVideoFrameBufferSize;
486 	__u32 dwDefaultFrameInterval;
487 	__u8  bFrameIntervalType;
488 	__u32 dwFrameInterval[];
489 } __attribute__((__packed__));
490 
491 #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n)		(26+4*(n))
492 
493 #define UVC_FRAME_UNCOMPRESSED(n) \
494 	uvc_frame_uncompressed_##n
495 
496 #define DECLARE_UVC_FRAME_UNCOMPRESSED(n)		\
497 struct UVC_FRAME_UNCOMPRESSED(n) {			\
498 	__u8  bLength;					\
499 	__u8  bDescriptorType;				\
500 	__u8  bDescriptorSubType;			\
501 	__u8  bFrameIndex;				\
502 	__u8  bmCapabilities;				\
503 	__u16 wWidth;					\
504 	__u16 wHeight;					\
505 	__u32 dwMinBitRate;				\
506 	__u32 dwMaxBitRate;				\
507 	__u32 dwMaxVideoFrameBufferSize;		\
508 	__u32 dwDefaultFrameInterval;			\
509 	__u8  bFrameIntervalType;			\
510 	__u32 dwFrameInterval[n];			\
511 } __attribute__ ((packed))
512 
513 /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
514 struct uvc_format_mjpeg {
515 	__u8  bLength;
516 	__u8  bDescriptorType;
517 	__u8  bDescriptorSubType;
518 	__u8  bFormatIndex;
519 	__u8  bNumFrameDescriptors;
520 	__u8  bmFlags;
521 	__u8  bDefaultFrameIndex;
522 	__u8  bAspectRatioX;
523 	__u8  bAspectRatioY;
524 	__u8  bmInterfaceFlags;
525 	__u8  bCopyProtect;
526 } __attribute__((__packed__));
527 
528 #define UVC_DT_FORMAT_MJPEG_SIZE			11
529 
530 /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */
531 struct uvc_frame_mjpeg {
532 	__u8  bLength;
533 	__u8  bDescriptorType;
534 	__u8  bDescriptorSubType;
535 	__u8  bFrameIndex;
536 	__u8  bmCapabilities;
537 	__u16 wWidth;
538 	__u16 wHeight;
539 	__u32 dwMinBitRate;
540 	__u32 dwMaxBitRate;
541 	__u32 dwMaxVideoFrameBufferSize;
542 	__u32 dwDefaultFrameInterval;
543 	__u8  bFrameIntervalType;
544 	__u32 dwFrameInterval[];
545 } __attribute__((__packed__));
546 
547 #define UVC_DT_FRAME_MJPEG_SIZE(n)			(26+4*(n))
548 
549 #define UVC_FRAME_MJPEG(n) \
550 	uvc_frame_mjpeg_##n
551 
552 #define DECLARE_UVC_FRAME_MJPEG(n)			\
553 struct UVC_FRAME_MJPEG(n) {				\
554 	__u8  bLength;					\
555 	__u8  bDescriptorType;				\
556 	__u8  bDescriptorSubType;			\
557 	__u8  bFrameIndex;				\
558 	__u8  bmCapabilities;				\
559 	__u16 wWidth;					\
560 	__u16 wHeight;					\
561 	__u32 dwMinBitRate;				\
562 	__u32 dwMaxBitRate;				\
563 	__u32 dwMaxVideoFrameBufferSize;		\
564 	__u32 dwDefaultFrameInterval;			\
565 	__u8  bFrameIntervalType;			\
566 	__u32 dwFrameInterval[n];			\
567 } __attribute__ ((packed))
568 
569 #endif /* __LINUX_USB_VIDEO_H */
570 
571