linux-headers (unknown)

(root)/
include/
linux/
usb/
video.h
       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  /* 3.9.2.6 Color Matching Descriptor Values */
     183  enum uvc_color_primaries_values {
     184  	UVC_COLOR_PRIMARIES_UNSPECIFIED,
     185  	UVC_COLOR_PRIMARIES_BT_709_SRGB,
     186  	UVC_COLOR_PRIMARIES_BT_470_2_M,
     187  	UVC_COLOR_PRIMARIES_BT_470_2_B_G,
     188  	UVC_COLOR_PRIMARIES_SMPTE_170M,
     189  	UVC_COLOR_PRIMARIES_SMPTE_240M,
     190  };
     191  
     192  enum uvc_transfer_characteristics_values {
     193  	UVC_TRANSFER_CHARACTERISTICS_UNSPECIFIED,
     194  	UVC_TRANSFER_CHARACTERISTICS_BT_709,
     195  	UVC_TRANSFER_CHARACTERISTICS_BT_470_2_M,
     196  	UVC_TRANSFER_CHARACTERISTICS_BT_470_2_B_G,
     197  	UVC_TRANSFER_CHARACTERISTICS_SMPTE_170M,
     198  	UVC_TRANSFER_CHARACTERISTICS_SMPTE_240M,
     199  	UVC_TRANSFER_CHARACTERISTICS_LINEAR,
     200  	UVC_TRANSFER_CHARACTERISTICS_SRGB,
     201  };
     202  
     203  enum uvc_matrix_coefficients {
     204  	UVC_MATRIX_COEFFICIENTS_UNSPECIFIED,
     205  	UVC_MATRIX_COEFFICIENTS_BT_709,
     206  	UVC_MATRIX_COEFFICIENTS_FCC,
     207  	UVC_MATRIX_COEFFICIENTS_BT_470_2_B_G,
     208  	UVC_MATRIX_COEFFICIENTS_SMPTE_170M,
     209  	UVC_MATRIX_COEFFICIENTS_SMPTE_240M,
     210  };
     211  
     212  /* ------------------------------------------------------------------------
     213   * UVC structures
     214   */
     215  
     216  /* All UVC descriptors have these 3 fields at the beginning */
     217  struct uvc_descriptor_header {
     218  	__u8  bLength;
     219  	__u8  bDescriptorType;
     220  	__u8  bDescriptorSubType;
     221  } __attribute__((packed));
     222  
     223  /* 3.7.2. Video Control Interface Header Descriptor */
     224  struct uvc_header_descriptor {
     225  	__u8   bLength;
     226  	__u8   bDescriptorType;
     227  	__u8   bDescriptorSubType;
     228  	__le16 bcdUVC;
     229  	__le16 wTotalLength;
     230  	__le32 dwClockFrequency;
     231  	__u8   bInCollection;
     232  	__u8   baInterfaceNr[];
     233  } __attribute__((__packed__));
     234  
     235  #define UVC_DT_HEADER_SIZE(n)				(12+(n))
     236  
     237  #define UVC_HEADER_DESCRIPTOR(n) \
     238  	uvc_header_descriptor_##n
     239  
     240  #define DECLARE_UVC_HEADER_DESCRIPTOR(n)		\
     241  struct UVC_HEADER_DESCRIPTOR(n) {			\
     242  	__u8   bLength;					\
     243  	__u8   bDescriptorType;				\
     244  	__u8   bDescriptorSubType;			\
     245  	__le16 bcdUVC;					\
     246  	__le16 wTotalLength;				\
     247  	__le32 dwClockFrequency;			\
     248  	__u8   bInCollection;				\
     249  	__u8   baInterfaceNr[n];			\
     250  } __attribute__ ((packed))
     251  
     252  /* 3.7.2.1. Input Terminal Descriptor */
     253  struct uvc_input_terminal_descriptor {
     254  	__u8   bLength;
     255  	__u8   bDescriptorType;
     256  	__u8   bDescriptorSubType;
     257  	__u8   bTerminalID;
     258  	__le16 wTerminalType;
     259  	__u8   bAssocTerminal;
     260  	__u8   iTerminal;
     261  } __attribute__((__packed__));
     262  
     263  #define UVC_DT_INPUT_TERMINAL_SIZE			8
     264  
     265  /* 3.7.2.2. Output Terminal Descriptor */
     266  struct uvc_output_terminal_descriptor {
     267  	__u8   bLength;
     268  	__u8   bDescriptorType;
     269  	__u8   bDescriptorSubType;
     270  	__u8   bTerminalID;
     271  	__le16 wTerminalType;
     272  	__u8   bAssocTerminal;
     273  	__u8   bSourceID;
     274  	__u8   iTerminal;
     275  } __attribute__((__packed__));
     276  
     277  #define UVC_DT_OUTPUT_TERMINAL_SIZE			9
     278  
     279  /* 3.7.2.3. Camera Terminal Descriptor */
     280  struct uvc_camera_terminal_descriptor {
     281  	__u8   bLength;
     282  	__u8   bDescriptorType;
     283  	__u8   bDescriptorSubType;
     284  	__u8   bTerminalID;
     285  	__le16 wTerminalType;
     286  	__u8   bAssocTerminal;
     287  	__u8   iTerminal;
     288  	__le16 wObjectiveFocalLengthMin;
     289  	__le16 wObjectiveFocalLengthMax;
     290  	__le16 wOcularFocalLength;
     291  	__u8   bControlSize;
     292  	__u8   bmControls[3];
     293  } __attribute__((__packed__));
     294  
     295  #define UVC_DT_CAMERA_TERMINAL_SIZE(n)			(15+(n))
     296  
     297  /* 3.7.2.4. Selector Unit Descriptor */
     298  struct uvc_selector_unit_descriptor {
     299  	__u8  bLength;
     300  	__u8  bDescriptorType;
     301  	__u8  bDescriptorSubType;
     302  	__u8  bUnitID;
     303  	__u8  bNrInPins;
     304  	__u8  baSourceID[0];
     305  	__u8  iSelector;
     306  } __attribute__((__packed__));
     307  
     308  #define UVC_DT_SELECTOR_UNIT_SIZE(n)			(6+(n))
     309  
     310  #define UVC_SELECTOR_UNIT_DESCRIPTOR(n)	\
     311  	uvc_selector_unit_descriptor_##n
     312  
     313  #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n)	\
     314  struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) {		\
     315  	__u8  bLength;					\
     316  	__u8  bDescriptorType;				\
     317  	__u8  bDescriptorSubType;			\
     318  	__u8  bUnitID;					\
     319  	__u8  bNrInPins;				\
     320  	__u8  baSourceID[n];				\
     321  	__u8  iSelector;				\
     322  } __attribute__ ((packed))
     323  
     324  /* 3.7.2.5. Processing Unit Descriptor */
     325  struct uvc_processing_unit_descriptor {
     326  	__u8   bLength;
     327  	__u8   bDescriptorType;
     328  	__u8   bDescriptorSubType;
     329  	__u8   bUnitID;
     330  	__u8   bSourceID;
     331  	__le16 wMaxMultiplier;
     332  	__u8   bControlSize;
     333  	__u8   bmControls[2];
     334  	__u8   iProcessing;
     335  	__u8   bmVideoStandards;
     336  } __attribute__((__packed__));
     337  
     338  #define UVC_DT_PROCESSING_UNIT_SIZE(n)			(10+(n))
     339  
     340  /* 3.7.2.6. Extension Unit Descriptor */
     341  struct uvc_extension_unit_descriptor {
     342  	__u8  bLength;
     343  	__u8  bDescriptorType;
     344  	__u8  bDescriptorSubType;
     345  	__u8  bUnitID;
     346  	__u8  guidExtensionCode[16];
     347  	__u8  bNumControls;
     348  	__u8  bNrInPins;
     349  	__u8  baSourceID[0];
     350  	__u8  bControlSize;
     351  	__u8  bmControls[0];
     352  	__u8  iExtension;
     353  } __attribute__((__packed__));
     354  
     355  #define UVC_DT_EXTENSION_UNIT_SIZE(p, n)		(24+(p)+(n))
     356  
     357  #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
     358  	uvc_extension_unit_descriptor_##p_##n
     359  
     360  #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n)	\
     361  struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) {		\
     362  	__u8  bLength;					\
     363  	__u8  bDescriptorType;				\
     364  	__u8  bDescriptorSubType;			\
     365  	__u8  bUnitID;					\
     366  	__u8  guidExtensionCode[16];			\
     367  	__u8  bNumControls;				\
     368  	__u8  bNrInPins;				\
     369  	__u8  baSourceID[p];				\
     370  	__u8  bControlSize;				\
     371  	__u8  bmControls[n];				\
     372  	__u8  iExtension;				\
     373  } __attribute__ ((packed))
     374  
     375  /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */
     376  struct uvc_control_endpoint_descriptor {
     377  	__u8   bLength;
     378  	__u8   bDescriptorType;
     379  	__u8   bDescriptorSubType;
     380  	__le16 wMaxTransferSize;
     381  } __attribute__((__packed__));
     382  
     383  #define UVC_DT_CONTROL_ENDPOINT_SIZE			5
     384  
     385  /* 3.9.2.1. Input Header Descriptor */
     386  struct uvc_input_header_descriptor {
     387  	__u8   bLength;
     388  	__u8   bDescriptorType;
     389  	__u8   bDescriptorSubType;
     390  	__u8   bNumFormats;
     391  	__le16 wTotalLength;
     392  	__u8   bEndpointAddress;
     393  	__u8   bmInfo;
     394  	__u8   bTerminalLink;
     395  	__u8   bStillCaptureMethod;
     396  	__u8   bTriggerSupport;
     397  	__u8   bTriggerUsage;
     398  	__u8   bControlSize;
     399  	__u8   bmaControls[];
     400  } __attribute__((__packed__));
     401  
     402  #define UVC_DT_INPUT_HEADER_SIZE(n, p)			(13+(n*p))
     403  
     404  #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
     405  	uvc_input_header_descriptor_##n_##p
     406  
     407  #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p)	\
     408  struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) {		\
     409  	__u8   bLength;					\
     410  	__u8   bDescriptorType;				\
     411  	__u8   bDescriptorSubType;			\
     412  	__u8   bNumFormats;				\
     413  	__le16 wTotalLength;				\
     414  	__u8   bEndpointAddress;			\
     415  	__u8   bmInfo;					\
     416  	__u8   bTerminalLink;				\
     417  	__u8   bStillCaptureMethod;			\
     418  	__u8   bTriggerSupport;				\
     419  	__u8   bTriggerUsage;				\
     420  	__u8   bControlSize;				\
     421  	__u8   bmaControls[p][n];			\
     422  } __attribute__ ((packed))
     423  
     424  /* 3.9.2.2. Output Header Descriptor */
     425  struct uvc_output_header_descriptor {
     426  	__u8   bLength;
     427  	__u8   bDescriptorType;
     428  	__u8   bDescriptorSubType;
     429  	__u8   bNumFormats;
     430  	__le16 wTotalLength;
     431  	__u8   bEndpointAddress;
     432  	__u8   bTerminalLink;
     433  	__u8   bControlSize;
     434  	__u8   bmaControls[];
     435  } __attribute__((__packed__));
     436  
     437  #define UVC_DT_OUTPUT_HEADER_SIZE(n, p)			(9+(n*p))
     438  
     439  #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
     440  	uvc_output_header_descriptor_##n_##p
     441  
     442  #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p)	\
     443  struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) {		\
     444  	__u8   bLength;					\
     445  	__u8   bDescriptorType;				\
     446  	__u8   bDescriptorSubType;			\
     447  	__u8   bNumFormats;				\
     448  	__le16 wTotalLength;				\
     449  	__u8   bEndpointAddress;			\
     450  	__u8   bTerminalLink;				\
     451  	__u8   bControlSize;				\
     452  	__u8   bmaControls[p][n];			\
     453  } __attribute__ ((packed))
     454  
     455  /* 3.9.2.6. Color matching descriptor */
     456  struct uvc_color_matching_descriptor {
     457  	__u8  bLength;
     458  	__u8  bDescriptorType;
     459  	__u8  bDescriptorSubType;
     460  	__u8  bColorPrimaries;
     461  	__u8  bTransferCharacteristics;
     462  	__u8  bMatrixCoefficients;
     463  } __attribute__((__packed__));
     464  
     465  #define UVC_DT_COLOR_MATCHING_SIZE			6
     466  
     467  /* 4.3.1.1. Video Probe and Commit Controls */
     468  struct uvc_streaming_control {
     469  	__u16 bmHint;
     470  	__u8  bFormatIndex;
     471  	__u8  bFrameIndex;
     472  	__u32 dwFrameInterval;
     473  	__u16 wKeyFrameRate;
     474  	__u16 wPFrameRate;
     475  	__u16 wCompQuality;
     476  	__u16 wCompWindowSize;
     477  	__u16 wDelay;
     478  	__u32 dwMaxVideoFrameSize;
     479  	__u32 dwMaxPayloadTransferSize;
     480  	__u32 dwClockFrequency;
     481  	__u8  bmFramingInfo;
     482  	__u8  bPreferedVersion;
     483  	__u8  bMinVersion;
     484  	__u8  bMaxVersion;
     485  } __attribute__((__packed__));
     486  
     487  /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */
     488  struct uvc_format_uncompressed {
     489  	__u8  bLength;
     490  	__u8  bDescriptorType;
     491  	__u8  bDescriptorSubType;
     492  	__u8  bFormatIndex;
     493  	__u8  bNumFrameDescriptors;
     494  	__u8  guidFormat[16];
     495  	__u8  bBitsPerPixel;
     496  	__u8  bDefaultFrameIndex;
     497  	__u8  bAspectRatioX;
     498  	__u8  bAspectRatioY;
     499  	__u8  bmInterlaceFlags;
     500  	__u8  bCopyProtect;
     501  } __attribute__((__packed__));
     502  
     503  #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE			27
     504  
     505  /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */
     506  struct uvc_frame_uncompressed {
     507  	__u8   bLength;
     508  	__u8   bDescriptorType;
     509  	__u8   bDescriptorSubType;
     510  	__u8   bFrameIndex;
     511  	__u8   bmCapabilities;
     512  	__le16 wWidth;
     513  	__le16 wHeight;
     514  	__le32 dwMinBitRate;
     515  	__le32 dwMaxBitRate;
     516  	__le32 dwMaxVideoFrameBufferSize;
     517  	__le32 dwDefaultFrameInterval;
     518  	__u8   bFrameIntervalType;
     519  	__le32 dwFrameInterval[];
     520  } __attribute__((__packed__));
     521  
     522  #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n)		(26+4*(n))
     523  
     524  #define UVC_FRAME_UNCOMPRESSED(n) \
     525  	uvc_frame_uncompressed_##n
     526  
     527  #define DECLARE_UVC_FRAME_UNCOMPRESSED(n)		\
     528  struct UVC_FRAME_UNCOMPRESSED(n) {			\
     529  	__u8   bLength;					\
     530  	__u8   bDescriptorType;				\
     531  	__u8   bDescriptorSubType;			\
     532  	__u8   bFrameIndex;				\
     533  	__u8   bmCapabilities;				\
     534  	__le16 wWidth;					\
     535  	__le16 wHeight;					\
     536  	__le32 dwMinBitRate;				\
     537  	__le32 dwMaxBitRate;				\
     538  	__le32 dwMaxVideoFrameBufferSize;		\
     539  	__le32 dwDefaultFrameInterval;			\
     540  	__u8   bFrameIntervalType;			\
     541  	__le32 dwFrameInterval[n];			\
     542  } __attribute__ ((packed))
     543  
     544  /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
     545  struct uvc_format_mjpeg {
     546  	__u8  bLength;
     547  	__u8  bDescriptorType;
     548  	__u8  bDescriptorSubType;
     549  	__u8  bFormatIndex;
     550  	__u8  bNumFrameDescriptors;
     551  	__u8  bmFlags;
     552  	__u8  bDefaultFrameIndex;
     553  	__u8  bAspectRatioX;
     554  	__u8  bAspectRatioY;
     555  	__u8  bmInterlaceFlags;
     556  	__u8  bCopyProtect;
     557  } __attribute__((__packed__));
     558  
     559  #define UVC_DT_FORMAT_MJPEG_SIZE			11
     560  
     561  /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */
     562  struct uvc_frame_mjpeg {
     563  	__u8   bLength;
     564  	__u8   bDescriptorType;
     565  	__u8   bDescriptorSubType;
     566  	__u8   bFrameIndex;
     567  	__u8   bmCapabilities;
     568  	__le16 wWidth;
     569  	__le16 wHeight;
     570  	__le32 dwMinBitRate;
     571  	__le32 dwMaxBitRate;
     572  	__le32 dwMaxVideoFrameBufferSize;
     573  	__le32 dwDefaultFrameInterval;
     574  	__u8   bFrameIntervalType;
     575  	__le32 dwFrameInterval[];
     576  } __attribute__((__packed__));
     577  
     578  #define UVC_DT_FRAME_MJPEG_SIZE(n)			(26+4*(n))
     579  
     580  #define UVC_FRAME_MJPEG(n) \
     581  	uvc_frame_mjpeg_##n
     582  
     583  #define DECLARE_UVC_FRAME_MJPEG(n)			\
     584  struct UVC_FRAME_MJPEG(n) {				\
     585  	__u8   bLength;					\
     586  	__u8   bDescriptorType;				\
     587  	__u8   bDescriptorSubType;			\
     588  	__u8   bFrameIndex;				\
     589  	__u8   bmCapabilities;				\
     590  	__le16 wWidth;					\
     591  	__le16 wHeight;					\
     592  	__le32 dwMinBitRate;				\
     593  	__le32 dwMaxBitRate;				\
     594  	__le32 dwMaxVideoFrameBufferSize;		\
     595  	__le32 dwDefaultFrameInterval;			\
     596  	__u8   bFrameIntervalType;			\
     597  	__le32 dwFrameInterval[n];			\
     598  } __attribute__ ((packed))
     599  
     600  #endif /* __LINUX_USB_VIDEO_H */
     601