linux/include/uapi/linux/usb/video.h
<<
>>
Prefs
   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 */
 187struct 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 */
 194struct 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)                \
 211struct 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 */
 223struct 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 */
 236struct 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 */
 250struct 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 */
 268struct 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) \
 284struct 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 */
 295struct 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} __attribute__((__packed__));
 306
 307#define UVC_DT_PROCESSING_UNIT_SIZE(n)                  (9+(n))
 308
 309/* 3.7.2.6. Extension Unit Descriptor */
 310struct 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)     \
 330struct 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 */
 345struct uvc_control_endpoint_descriptor {
 346        __u8   bLength;
 347        __u8   bDescriptorType;
 348        __u8   bDescriptorSubType;
 349        __le16 wMaxTransferSize;
 350} __attribute__((__packed__));
 351
 352#define UVC_DT_CONTROL_ENDPOINT_SIZE                    5
 353
 354/* 3.9.2.1. Input Header Descriptor */
 355struct uvc_input_header_descriptor {
 356        __u8   bLength;
 357        __u8   bDescriptorType;
 358        __u8   bDescriptorSubType;
 359        __u8   bNumFormats;
 360        __le16 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)       \
 377struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) {              \
 378        __u8   bLength;                                 \
 379        __u8   bDescriptorType;                         \
 380        __u8   bDescriptorSubType;                      \
 381        __u8   bNumFormats;                             \
 382        __le16 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 */
 394struct uvc_output_header_descriptor {
 395        __u8   bLength;
 396        __u8   bDescriptorType;
 397        __u8   bDescriptorSubType;
 398        __u8   bNumFormats;
 399        __le16 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)      \
 412struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) {             \
 413        __u8   bLength;                                 \
 414        __u8   bDescriptorType;                         \
 415        __u8   bDescriptorSubType;                      \
 416        __u8   bNumFormats;                             \
 417        __le16 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 */
 425struct 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 */
 437struct 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 */
 457struct 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 */
 475struct uvc_frame_uncompressed {
 476        __u8   bLength;
 477        __u8   bDescriptorType;
 478        __u8   bDescriptorSubType;
 479        __u8   bFrameIndex;
 480        __u8   bmCapabilities;
 481        __le16 wWidth;
 482        __le16 wHeight;
 483        __le32 dwMinBitRate;
 484        __le32 dwMaxBitRate;
 485        __le32 dwMaxVideoFrameBufferSize;
 486        __le32 dwDefaultFrameInterval;
 487        __u8   bFrameIntervalType;
 488        __le32 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)               \
 497struct UVC_FRAME_UNCOMPRESSED(n) {                      \
 498        __u8   bLength;                                 \
 499        __u8   bDescriptorType;                         \
 500        __u8   bDescriptorSubType;                      \
 501        __u8   bFrameIndex;                             \
 502        __u8   bmCapabilities;                          \
 503        __le16 wWidth;                                  \
 504        __le16 wHeight;                                 \
 505        __le32 dwMinBitRate;                            \
 506        __le32 dwMaxBitRate;                            \
 507        __le32 dwMaxVideoFrameBufferSize;               \
 508        __le32 dwDefaultFrameInterval;                  \
 509        __u8   bFrameIntervalType;                      \
 510        __le32 dwFrameInterval[n];                      \
 511} __attribute__ ((packed))
 512
 513/* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
 514struct 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 */
 531struct uvc_frame_mjpeg {
 532        __u8   bLength;
 533        __u8   bDescriptorType;
 534        __u8   bDescriptorSubType;
 535        __u8   bFrameIndex;
 536        __u8   bmCapabilities;
 537        __le16 wWidth;
 538        __le16 wHeight;
 539        __le32 dwMinBitRate;
 540        __le32 dwMaxBitRate;
 541        __le32 dwMaxVideoFrameBufferSize;
 542        __le32 dwDefaultFrameInterval;
 543        __u8   bFrameIntervalType;
 544        __le32 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)                      \
 553struct UVC_FRAME_MJPEG(n) {                             \
 554        __u8   bLength;                                 \
 555        __u8   bDescriptorType;                         \
 556        __u8   bDescriptorSubType;                      \
 557        __u8   bFrameIndex;                             \
 558        __u8   bmCapabilities;                          \
 559        __le16 wWidth;                                  \
 560        __le16 wHeight;                                 \
 561        __le32 dwMinBitRate;                            \
 562        __le32 dwMaxBitRate;                            \
 563        __le32 dwMaxVideoFrameBufferSize;               \
 564        __le32 dwDefaultFrameInterval;                  \
 565        __u8   bFrameIntervalType;                      \
 566        __le32 dwFrameInterval[n];                      \
 567} __attribute__ ((packed))
 568
 569#endif /* __LINUX_USB_VIDEO_H */
 570
 571