linux/include/uapi/linux/usb/video.h
<<
>>
Prefs
   1/*
   2 * USB Video Class definitions.
   3 *
   4 * Copyright (C) 2009 Laurent Pinchart <laurent.pinchart@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 */
 186struct 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 */
 193struct 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)                \
 210struct 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 */
 222struct 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 */
 235struct 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 */
 249struct 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 */
 267struct 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) \
 283struct 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 */
 294struct 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 */
 309struct 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)     \
 329struct 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 */
 344struct 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 */
 354struct 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)       \
 376struct 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 */
 393struct 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)      \
 411struct 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 */
 424struct 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 */
 436struct 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 */
 456struct 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 */
 474struct 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)               \
 496struct 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 */
 513struct 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 */
 530struct 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)                      \
 552struct 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