cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

video.h (16387B)


      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