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