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