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