xref: /linux-6.15/include/uapi/linux/usb/video.h (revision 2dc768d7)
16f52b16cSGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
25e1ddb48SDavid Howells /*
35e1ddb48SDavid Howells  * USB Video Class definitions.
45e1ddb48SDavid Howells  *
55e1ddb48SDavid Howells  * Copyright (C) 2009 Laurent Pinchart <[email protected]>
65e1ddb48SDavid Howells  *
75e1ddb48SDavid Howells  * This file holds USB constants and structures defined by the USB Device
85e1ddb48SDavid Howells  * Class Definition for Video Devices. Unless otherwise stated, comments
95e1ddb48SDavid Howells  * below reference relevant sections of the USB Video Class 1.1 specification
105e1ddb48SDavid Howells  * available at
115e1ddb48SDavid Howells  *
125e1ddb48SDavid Howells  * http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip
135e1ddb48SDavid Howells  */
145e1ddb48SDavid Howells 
155e1ddb48SDavid Howells #ifndef __LINUX_USB_VIDEO_H
165e1ddb48SDavid Howells #define __LINUX_USB_VIDEO_H
175e1ddb48SDavid Howells 
185e1ddb48SDavid Howells #include <linux/types.h>
195e1ddb48SDavid Howells 
205e1ddb48SDavid Howells /* --------------------------------------------------------------------------
215e1ddb48SDavid Howells  * UVC constants
225e1ddb48SDavid Howells  */
235e1ddb48SDavid Howells 
245e1ddb48SDavid Howells /* A.2. Video Interface Subclass Codes */
255e1ddb48SDavid Howells #define UVC_SC_UNDEFINED				0x00
265e1ddb48SDavid Howells #define UVC_SC_VIDEOCONTROL				0x01
275e1ddb48SDavid Howells #define UVC_SC_VIDEOSTREAMING				0x02
285e1ddb48SDavid Howells #define UVC_SC_VIDEO_INTERFACE_COLLECTION		0x03
295e1ddb48SDavid Howells 
305e1ddb48SDavid Howells /* A.3. Video Interface Protocol Codes */
315e1ddb48SDavid Howells #define UVC_PC_PROTOCOL_UNDEFINED			0x00
328afe97beSLaurent Pinchart #define UVC_PC_PROTOCOL_15				0x01
335e1ddb48SDavid Howells 
345e1ddb48SDavid Howells /* A.5. Video Class-Specific VC Interface Descriptor Subtypes */
355e1ddb48SDavid Howells #define UVC_VC_DESCRIPTOR_UNDEFINED			0x00
365e1ddb48SDavid Howells #define UVC_VC_HEADER					0x01
375e1ddb48SDavid Howells #define UVC_VC_INPUT_TERMINAL				0x02
385e1ddb48SDavid Howells #define UVC_VC_OUTPUT_TERMINAL				0x03
395e1ddb48SDavid Howells #define UVC_VC_SELECTOR_UNIT				0x04
405e1ddb48SDavid Howells #define UVC_VC_PROCESSING_UNIT				0x05
415e1ddb48SDavid Howells #define UVC_VC_EXTENSION_UNIT				0x06
425e1ddb48SDavid Howells 
435e1ddb48SDavid Howells /* A.6. Video Class-Specific VS Interface Descriptor Subtypes */
445e1ddb48SDavid Howells #define UVC_VS_UNDEFINED				0x00
455e1ddb48SDavid Howells #define UVC_VS_INPUT_HEADER				0x01
465e1ddb48SDavid Howells #define UVC_VS_OUTPUT_HEADER				0x02
475e1ddb48SDavid Howells #define UVC_VS_STILL_IMAGE_FRAME			0x03
485e1ddb48SDavid Howells #define UVC_VS_FORMAT_UNCOMPRESSED			0x04
495e1ddb48SDavid Howells #define UVC_VS_FRAME_UNCOMPRESSED			0x05
505e1ddb48SDavid Howells #define UVC_VS_FORMAT_MJPEG				0x06
515e1ddb48SDavid Howells #define UVC_VS_FRAME_MJPEG				0x07
525e1ddb48SDavid Howells #define UVC_VS_FORMAT_MPEG2TS				0x0a
535e1ddb48SDavid Howells #define UVC_VS_FORMAT_DV				0x0c
545e1ddb48SDavid Howells #define UVC_VS_COLORFORMAT				0x0d
555e1ddb48SDavid Howells #define UVC_VS_FORMAT_FRAME_BASED			0x10
565e1ddb48SDavid Howells #define UVC_VS_FRAME_FRAME_BASED			0x11
575e1ddb48SDavid Howells #define UVC_VS_FORMAT_STREAM_BASED			0x12
585e1ddb48SDavid Howells 
595e1ddb48SDavid Howells /* A.7. Video Class-Specific Endpoint Descriptor Subtypes */
605e1ddb48SDavid Howells #define UVC_EP_UNDEFINED				0x00
615e1ddb48SDavid Howells #define UVC_EP_GENERAL					0x01
625e1ddb48SDavid Howells #define UVC_EP_ENDPOINT					0x02
635e1ddb48SDavid Howells #define UVC_EP_INTERRUPT				0x03
645e1ddb48SDavid Howells 
655e1ddb48SDavid Howells /* A.8. Video Class-Specific Request Codes */
665e1ddb48SDavid Howells #define UVC_RC_UNDEFINED				0x00
675e1ddb48SDavid Howells #define UVC_SET_CUR					0x01
685e1ddb48SDavid Howells #define UVC_GET_CUR					0x81
695e1ddb48SDavid Howells #define UVC_GET_MIN					0x82
705e1ddb48SDavid Howells #define UVC_GET_MAX					0x83
715e1ddb48SDavid Howells #define UVC_GET_RES					0x84
725e1ddb48SDavid Howells #define UVC_GET_LEN					0x85
735e1ddb48SDavid Howells #define UVC_GET_INFO					0x86
745e1ddb48SDavid Howells #define UVC_GET_DEF					0x87
755e1ddb48SDavid Howells 
765e1ddb48SDavid Howells /* A.9.1. VideoControl Interface Control Selectors */
775e1ddb48SDavid Howells #define UVC_VC_CONTROL_UNDEFINED			0x00
785e1ddb48SDavid Howells #define UVC_VC_VIDEO_POWER_MODE_CONTROL			0x01
795e1ddb48SDavid Howells #define UVC_VC_REQUEST_ERROR_CODE_CONTROL		0x02
805e1ddb48SDavid Howells 
815e1ddb48SDavid Howells /* A.9.2. Terminal Control Selectors */
825e1ddb48SDavid Howells #define UVC_TE_CONTROL_UNDEFINED			0x00
835e1ddb48SDavid Howells 
845e1ddb48SDavid Howells /* A.9.3. Selector Unit Control Selectors */
855e1ddb48SDavid Howells #define UVC_SU_CONTROL_UNDEFINED			0x00
865e1ddb48SDavid Howells #define UVC_SU_INPUT_SELECT_CONTROL			0x01
875e1ddb48SDavid Howells 
885e1ddb48SDavid Howells /* A.9.4. Camera Terminal Control Selectors */
895e1ddb48SDavid Howells #define UVC_CT_CONTROL_UNDEFINED			0x00
905e1ddb48SDavid Howells #define UVC_CT_SCANNING_MODE_CONTROL			0x01
915e1ddb48SDavid Howells #define UVC_CT_AE_MODE_CONTROL				0x02
925e1ddb48SDavid Howells #define UVC_CT_AE_PRIORITY_CONTROL			0x03
935e1ddb48SDavid Howells #define UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL		0x04
945e1ddb48SDavid Howells #define UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL		0x05
955e1ddb48SDavid Howells #define UVC_CT_FOCUS_ABSOLUTE_CONTROL			0x06
965e1ddb48SDavid Howells #define UVC_CT_FOCUS_RELATIVE_CONTROL			0x07
975e1ddb48SDavid Howells #define UVC_CT_FOCUS_AUTO_CONTROL			0x08
985e1ddb48SDavid Howells #define UVC_CT_IRIS_ABSOLUTE_CONTROL			0x09
995e1ddb48SDavid Howells #define UVC_CT_IRIS_RELATIVE_CONTROL			0x0a
1005e1ddb48SDavid Howells #define UVC_CT_ZOOM_ABSOLUTE_CONTROL			0x0b
1015e1ddb48SDavid Howells #define UVC_CT_ZOOM_RELATIVE_CONTROL			0x0c
1025e1ddb48SDavid Howells #define UVC_CT_PANTILT_ABSOLUTE_CONTROL			0x0d
1035e1ddb48SDavid Howells #define UVC_CT_PANTILT_RELATIVE_CONTROL			0x0e
1045e1ddb48SDavid Howells #define UVC_CT_ROLL_ABSOLUTE_CONTROL			0x0f
1055e1ddb48SDavid Howells #define UVC_CT_ROLL_RELATIVE_CONTROL			0x10
1065e1ddb48SDavid Howells #define UVC_CT_PRIVACY_CONTROL				0x11
107*2dc768d7SYunke Cao #define UVC_CT_REGION_OF_INTEREST_CONTROL		0x14
1085e1ddb48SDavid Howells 
1095e1ddb48SDavid Howells /* A.9.5. Processing Unit Control Selectors */
1105e1ddb48SDavid Howells #define UVC_PU_CONTROL_UNDEFINED			0x00
1115e1ddb48SDavid Howells #define UVC_PU_BACKLIGHT_COMPENSATION_CONTROL		0x01
1125e1ddb48SDavid Howells #define UVC_PU_BRIGHTNESS_CONTROL			0x02
1135e1ddb48SDavid Howells #define UVC_PU_CONTRAST_CONTROL				0x03
1145e1ddb48SDavid Howells #define UVC_PU_GAIN_CONTROL				0x04
1155e1ddb48SDavid Howells #define UVC_PU_POWER_LINE_FREQUENCY_CONTROL		0x05
1165e1ddb48SDavid Howells #define UVC_PU_HUE_CONTROL				0x06
1175e1ddb48SDavid Howells #define UVC_PU_SATURATION_CONTROL			0x07
1185e1ddb48SDavid Howells #define UVC_PU_SHARPNESS_CONTROL			0x08
1195e1ddb48SDavid Howells #define UVC_PU_GAMMA_CONTROL				0x09
1205e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL	0x0a
1215e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL	0x0b
1225e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL		0x0c
1235e1ddb48SDavid Howells #define UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL	0x0d
1245e1ddb48SDavid Howells #define UVC_PU_DIGITAL_MULTIPLIER_CONTROL		0x0e
1255e1ddb48SDavid Howells #define UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL		0x0f
1265e1ddb48SDavid Howells #define UVC_PU_HUE_AUTO_CONTROL				0x10
1275e1ddb48SDavid Howells #define UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL		0x11
1285e1ddb48SDavid Howells #define UVC_PU_ANALOG_LOCK_STATUS_CONTROL		0x12
1295e1ddb48SDavid Howells 
1305e1ddb48SDavid Howells /* A.9.7. VideoStreaming Interface Control Selectors */
1315e1ddb48SDavid Howells #define UVC_VS_CONTROL_UNDEFINED			0x00
1325e1ddb48SDavid Howells #define UVC_VS_PROBE_CONTROL				0x01
1335e1ddb48SDavid Howells #define UVC_VS_COMMIT_CONTROL				0x02
1345e1ddb48SDavid Howells #define UVC_VS_STILL_PROBE_CONTROL			0x03
1355e1ddb48SDavid Howells #define UVC_VS_STILL_COMMIT_CONTROL			0x04
1365e1ddb48SDavid Howells #define UVC_VS_STILL_IMAGE_TRIGGER_CONTROL		0x05
1375e1ddb48SDavid Howells #define UVC_VS_STREAM_ERROR_CODE_CONTROL		0x06
1385e1ddb48SDavid Howells #define UVC_VS_GENERATE_KEY_FRAME_CONTROL		0x07
1395e1ddb48SDavid Howells #define UVC_VS_UPDATE_FRAME_SEGMENT_CONTROL		0x08
1405e1ddb48SDavid Howells #define UVC_VS_SYNC_DELAY_CONTROL			0x09
1415e1ddb48SDavid Howells 
1425e1ddb48SDavid Howells /* B.1. USB Terminal Types */
1435e1ddb48SDavid Howells #define UVC_TT_VENDOR_SPECIFIC				0x0100
1445e1ddb48SDavid Howells #define UVC_TT_STREAMING				0x0101
1455e1ddb48SDavid Howells 
1465e1ddb48SDavid Howells /* B.2. Input Terminal Types */
1475e1ddb48SDavid Howells #define UVC_ITT_VENDOR_SPECIFIC				0x0200
1485e1ddb48SDavid Howells #define UVC_ITT_CAMERA					0x0201
1495e1ddb48SDavid Howells #define UVC_ITT_MEDIA_TRANSPORT_INPUT			0x0202
1505e1ddb48SDavid Howells 
1515e1ddb48SDavid Howells /* B.3. Output Terminal Types */
1525e1ddb48SDavid Howells #define UVC_OTT_VENDOR_SPECIFIC				0x0300
1535e1ddb48SDavid Howells #define UVC_OTT_DISPLAY					0x0301
1545e1ddb48SDavid Howells #define UVC_OTT_MEDIA_TRANSPORT_OUTPUT			0x0302
1555e1ddb48SDavid Howells 
1565e1ddb48SDavid Howells /* B.4. External Terminal Types */
1575e1ddb48SDavid Howells #define UVC_EXTERNAL_VENDOR_SPECIFIC			0x0400
1585e1ddb48SDavid Howells #define UVC_COMPOSITE_CONNECTOR				0x0401
1595e1ddb48SDavid Howells #define UVC_SVIDEO_CONNECTOR				0x0402
1605e1ddb48SDavid Howells #define UVC_COMPONENT_CONNECTOR				0x0403
1615e1ddb48SDavid Howells 
1625e1ddb48SDavid Howells /* 2.4.2.2. Status Packet Type */
1635e1ddb48SDavid Howells #define UVC_STATUS_TYPE_CONTROL				1
1645e1ddb48SDavid Howells #define UVC_STATUS_TYPE_STREAMING			2
1655e1ddb48SDavid Howells 
1665e1ddb48SDavid Howells /* 2.4.3.3. Payload Header Information */
1675e1ddb48SDavid Howells #define UVC_STREAM_EOH					(1 << 7)
1685e1ddb48SDavid Howells #define UVC_STREAM_ERR					(1 << 6)
1695e1ddb48SDavid Howells #define UVC_STREAM_STI					(1 << 5)
1705e1ddb48SDavid Howells #define UVC_STREAM_RES					(1 << 4)
1715e1ddb48SDavid Howells #define UVC_STREAM_SCR					(1 << 3)
1725e1ddb48SDavid Howells #define UVC_STREAM_PTS					(1 << 2)
1735e1ddb48SDavid Howells #define UVC_STREAM_EOF					(1 << 1)
1745e1ddb48SDavid Howells #define UVC_STREAM_FID					(1 << 0)
1755e1ddb48SDavid Howells 
1765e1ddb48SDavid Howells /* 4.1.2. Control Capabilities */
1775e1ddb48SDavid Howells #define UVC_CONTROL_CAP_GET				(1 << 0)
1785e1ddb48SDavid Howells #define UVC_CONTROL_CAP_SET				(1 << 1)
1795e1ddb48SDavid Howells #define UVC_CONTROL_CAP_DISABLED			(1 << 2)
1805e1ddb48SDavid Howells #define UVC_CONTROL_CAP_AUTOUPDATE			(1 << 3)
1815e1ddb48SDavid Howells #define UVC_CONTROL_CAP_ASYNCHRONOUS			(1 << 4)
1825e1ddb48SDavid Howells 
183e16cab9cSDaniel Scally /* 3.9.2.6 Color Matching Descriptor Values */
184e16cab9cSDaniel Scally enum uvc_color_primaries_values {
185e16cab9cSDaniel Scally 	UVC_COLOR_PRIMARIES_UNSPECIFIED,
186e16cab9cSDaniel Scally 	UVC_COLOR_PRIMARIES_BT_709_SRGB,
187e16cab9cSDaniel Scally 	UVC_COLOR_PRIMARIES_BT_470_2_M,
188e16cab9cSDaniel Scally 	UVC_COLOR_PRIMARIES_BT_470_2_B_G,
189e16cab9cSDaniel Scally 	UVC_COLOR_PRIMARIES_SMPTE_170M,
190e16cab9cSDaniel Scally 	UVC_COLOR_PRIMARIES_SMPTE_240M,
191e16cab9cSDaniel Scally };
192e16cab9cSDaniel Scally 
193e16cab9cSDaniel Scally enum uvc_transfer_characteristics_values {
194e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_UNSPECIFIED,
195e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_BT_709,
196e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_BT_470_2_M,
197e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_BT_470_2_B_G,
198e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_SMPTE_170M,
199e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_SMPTE_240M,
200e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_LINEAR,
201e16cab9cSDaniel Scally 	UVC_TRANSFER_CHARACTERISTICS_SRGB,
202e16cab9cSDaniel Scally };
203e16cab9cSDaniel Scally 
204e16cab9cSDaniel Scally enum uvc_matrix_coefficients {
205e16cab9cSDaniel Scally 	UVC_MATRIX_COEFFICIENTS_UNSPECIFIED,
206e16cab9cSDaniel Scally 	UVC_MATRIX_COEFFICIENTS_BT_709,
207e16cab9cSDaniel Scally 	UVC_MATRIX_COEFFICIENTS_FCC,
208e16cab9cSDaniel Scally 	UVC_MATRIX_COEFFICIENTS_BT_470_2_B_G,
209e16cab9cSDaniel Scally 	UVC_MATRIX_COEFFICIENTS_SMPTE_170M,
210e16cab9cSDaniel Scally 	UVC_MATRIX_COEFFICIENTS_SMPTE_240M,
211e16cab9cSDaniel Scally };
212e16cab9cSDaniel Scally 
2135e1ddb48SDavid Howells /* ------------------------------------------------------------------------
2145e1ddb48SDavid Howells  * UVC structures
2155e1ddb48SDavid Howells  */
2165e1ddb48SDavid Howells 
2175e1ddb48SDavid Howells /* All UVC descriptors have these 3 fields at the beginning */
2185e1ddb48SDavid Howells struct uvc_descriptor_header {
2195e1ddb48SDavid Howells 	__u8  bLength;
2205e1ddb48SDavid Howells 	__u8  bDescriptorType;
2215e1ddb48SDavid Howells 	__u8  bDescriptorSubType;
2225e1ddb48SDavid Howells } __attribute__((packed));
2235e1ddb48SDavid Howells 
2245e1ddb48SDavid Howells /* 3.7.2. Video Control Interface Header Descriptor */
2255e1ddb48SDavid Howells struct uvc_header_descriptor {
2265e1ddb48SDavid Howells 	__u8   bLength;
2275e1ddb48SDavid Howells 	__u8   bDescriptorType;
2285e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
229f823b75fSLaurent Pinchart 	__le16 bcdUVC;
230f823b75fSLaurent Pinchart 	__le16 wTotalLength;
231f823b75fSLaurent Pinchart 	__le32 dwClockFrequency;
2325e1ddb48SDavid Howells 	__u8   bInCollection;
2335e1ddb48SDavid Howells 	__u8   baInterfaceNr[];
2345e1ddb48SDavid Howells } __attribute__((__packed__));
2355e1ddb48SDavid Howells 
2365e1ddb48SDavid Howells #define UVC_DT_HEADER_SIZE(n)				(12+(n))
2375e1ddb48SDavid Howells 
2385e1ddb48SDavid Howells #define UVC_HEADER_DESCRIPTOR(n) \
2395e1ddb48SDavid Howells 	uvc_header_descriptor_##n
2405e1ddb48SDavid Howells 
2415e1ddb48SDavid Howells #define DECLARE_UVC_HEADER_DESCRIPTOR(n)		\
2425e1ddb48SDavid Howells struct UVC_HEADER_DESCRIPTOR(n) {			\
2435e1ddb48SDavid Howells 	__u8   bLength;					\
2445e1ddb48SDavid Howells 	__u8   bDescriptorType;				\
2455e1ddb48SDavid Howells 	__u8   bDescriptorSubType;			\
246f823b75fSLaurent Pinchart 	__le16 bcdUVC;					\
247f823b75fSLaurent Pinchart 	__le16 wTotalLength;				\
248f823b75fSLaurent Pinchart 	__le32 dwClockFrequency;			\
2495e1ddb48SDavid Howells 	__u8   bInCollection;				\
2505e1ddb48SDavid Howells 	__u8   baInterfaceNr[n];			\
2515e1ddb48SDavid Howells } __attribute__ ((packed))
2525e1ddb48SDavid Howells 
2535e1ddb48SDavid Howells /* 3.7.2.1. Input Terminal Descriptor */
2545e1ddb48SDavid Howells struct uvc_input_terminal_descriptor {
2555e1ddb48SDavid Howells 	__u8   bLength;
2565e1ddb48SDavid Howells 	__u8   bDescriptorType;
2575e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
2585e1ddb48SDavid Howells 	__u8   bTerminalID;
259f823b75fSLaurent Pinchart 	__le16 wTerminalType;
2605e1ddb48SDavid Howells 	__u8   bAssocTerminal;
2615e1ddb48SDavid Howells 	__u8   iTerminal;
2625e1ddb48SDavid Howells } __attribute__((__packed__));
2635e1ddb48SDavid Howells 
2645e1ddb48SDavid Howells #define UVC_DT_INPUT_TERMINAL_SIZE			8
2655e1ddb48SDavid Howells 
2665e1ddb48SDavid Howells /* 3.7.2.2. Output Terminal Descriptor */
2675e1ddb48SDavid Howells struct uvc_output_terminal_descriptor {
2685e1ddb48SDavid Howells 	__u8   bLength;
2695e1ddb48SDavid Howells 	__u8   bDescriptorType;
2705e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
2715e1ddb48SDavid Howells 	__u8   bTerminalID;
272f823b75fSLaurent Pinchart 	__le16 wTerminalType;
2735e1ddb48SDavid Howells 	__u8   bAssocTerminal;
2745e1ddb48SDavid Howells 	__u8   bSourceID;
2755e1ddb48SDavid Howells 	__u8   iTerminal;
2765e1ddb48SDavid Howells } __attribute__((__packed__));
2775e1ddb48SDavid Howells 
2785e1ddb48SDavid Howells #define UVC_DT_OUTPUT_TERMINAL_SIZE			9
2795e1ddb48SDavid Howells 
2805e1ddb48SDavid Howells /* 3.7.2.3. Camera Terminal Descriptor */
2815e1ddb48SDavid Howells struct uvc_camera_terminal_descriptor {
2825e1ddb48SDavid Howells 	__u8   bLength;
2835e1ddb48SDavid Howells 	__u8   bDescriptorType;
2845e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
2855e1ddb48SDavid Howells 	__u8   bTerminalID;
286f823b75fSLaurent Pinchart 	__le16 wTerminalType;
2875e1ddb48SDavid Howells 	__u8   bAssocTerminal;
2885e1ddb48SDavid Howells 	__u8   iTerminal;
289f823b75fSLaurent Pinchart 	__le16 wObjectiveFocalLengthMin;
290f823b75fSLaurent Pinchart 	__le16 wObjectiveFocalLengthMax;
291f823b75fSLaurent Pinchart 	__le16 wOcularFocalLength;
2925e1ddb48SDavid Howells 	__u8   bControlSize;
2935e1ddb48SDavid Howells 	__u8   bmControls[3];
2945e1ddb48SDavid Howells } __attribute__((__packed__));
2955e1ddb48SDavid Howells 
2965e1ddb48SDavid Howells #define UVC_DT_CAMERA_TERMINAL_SIZE(n)			(15+(n))
2975e1ddb48SDavid Howells 
2985e1ddb48SDavid Howells /* 3.7.2.4. Selector Unit Descriptor */
2995e1ddb48SDavid Howells struct uvc_selector_unit_descriptor {
3005e1ddb48SDavid Howells 	__u8  bLength;
3015e1ddb48SDavid Howells 	__u8  bDescriptorType;
3025e1ddb48SDavid Howells 	__u8  bDescriptorSubType;
3035e1ddb48SDavid Howells 	__u8  bUnitID;
3045e1ddb48SDavid Howells 	__u8  bNrInPins;
3055e1ddb48SDavid Howells 	__u8  baSourceID[0];
3065e1ddb48SDavid Howells 	__u8  iSelector;
3075e1ddb48SDavid Howells } __attribute__((__packed__));
3085e1ddb48SDavid Howells 
3095e1ddb48SDavid Howells #define UVC_DT_SELECTOR_UNIT_SIZE(n)			(6+(n))
3105e1ddb48SDavid Howells 
3115e1ddb48SDavid Howells #define UVC_SELECTOR_UNIT_DESCRIPTOR(n)	\
3125e1ddb48SDavid Howells 	uvc_selector_unit_descriptor_##n
3135e1ddb48SDavid Howells 
3145e1ddb48SDavid Howells #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n)	\
3155e1ddb48SDavid Howells struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) {		\
3165e1ddb48SDavid Howells 	__u8  bLength;					\
3175e1ddb48SDavid Howells 	__u8  bDescriptorType;				\
3185e1ddb48SDavid Howells 	__u8  bDescriptorSubType;			\
3195e1ddb48SDavid Howells 	__u8  bUnitID;					\
3205e1ddb48SDavid Howells 	__u8  bNrInPins;				\
3215e1ddb48SDavid Howells 	__u8  baSourceID[n];				\
3225e1ddb48SDavid Howells 	__u8  iSelector;				\
3235e1ddb48SDavid Howells } __attribute__ ((packed))
3245e1ddb48SDavid Howells 
3255e1ddb48SDavid Howells /* 3.7.2.5. Processing Unit Descriptor */
3265e1ddb48SDavid Howells struct uvc_processing_unit_descriptor {
3275e1ddb48SDavid Howells 	__u8   bLength;
3285e1ddb48SDavid Howells 	__u8   bDescriptorType;
3295e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
3305e1ddb48SDavid Howells 	__u8   bUnitID;
3315e1ddb48SDavid Howells 	__u8   bSourceID;
332f823b75fSLaurent Pinchart 	__le16 wMaxMultiplier;
3335e1ddb48SDavid Howells 	__u8   bControlSize;
3345e1ddb48SDavid Howells 	__u8   bmControls[2];
3355e1ddb48SDavid Howells 	__u8   iProcessing;
3366a154ec9SPawel Laszczak 	__u8   bmVideoStandards;
3375e1ddb48SDavid Howells } __attribute__((__packed__));
3385e1ddb48SDavid Howells 
3396a154ec9SPawel Laszczak #define UVC_DT_PROCESSING_UNIT_SIZE(n)			(10+(n))
3405e1ddb48SDavid Howells 
3415e1ddb48SDavid Howells /* 3.7.2.6. Extension Unit Descriptor */
3425e1ddb48SDavid Howells struct uvc_extension_unit_descriptor {
3435e1ddb48SDavid Howells 	__u8  bLength;
3445e1ddb48SDavid Howells 	__u8  bDescriptorType;
3455e1ddb48SDavid Howells 	__u8  bDescriptorSubType;
3465e1ddb48SDavid Howells 	__u8  bUnitID;
3475e1ddb48SDavid Howells 	__u8  guidExtensionCode[16];
3485e1ddb48SDavid Howells 	__u8  bNumControls;
3495e1ddb48SDavid Howells 	__u8  bNrInPins;
3505e1ddb48SDavid Howells 	__u8  baSourceID[0];
3515e1ddb48SDavid Howells 	__u8  bControlSize;
3525e1ddb48SDavid Howells 	__u8  bmControls[0];
3535e1ddb48SDavid Howells 	__u8  iExtension;
3545e1ddb48SDavid Howells } __attribute__((__packed__));
3555e1ddb48SDavid Howells 
3565e1ddb48SDavid Howells #define UVC_DT_EXTENSION_UNIT_SIZE(p, n)		(24+(p)+(n))
3575e1ddb48SDavid Howells 
3585e1ddb48SDavid Howells #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \
3595e1ddb48SDavid Howells 	uvc_extension_unit_descriptor_##p_##n
3605e1ddb48SDavid Howells 
3615e1ddb48SDavid Howells #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n)	\
3625e1ddb48SDavid Howells struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) {		\
3635e1ddb48SDavid Howells 	__u8  bLength;					\
3645e1ddb48SDavid Howells 	__u8  bDescriptorType;				\
3655e1ddb48SDavid Howells 	__u8  bDescriptorSubType;			\
3665e1ddb48SDavid Howells 	__u8  bUnitID;					\
3675e1ddb48SDavid Howells 	__u8  guidExtensionCode[16];			\
3685e1ddb48SDavid Howells 	__u8  bNumControls;				\
3695e1ddb48SDavid Howells 	__u8  bNrInPins;				\
3705e1ddb48SDavid Howells 	__u8  baSourceID[p];				\
3715e1ddb48SDavid Howells 	__u8  bControlSize;				\
3725e1ddb48SDavid Howells 	__u8  bmControls[n];				\
3735e1ddb48SDavid Howells 	__u8  iExtension;				\
3745e1ddb48SDavid Howells } __attribute__ ((packed))
3755e1ddb48SDavid Howells 
3765e1ddb48SDavid Howells /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */
3775e1ddb48SDavid Howells struct uvc_control_endpoint_descriptor {
3785e1ddb48SDavid Howells 	__u8   bLength;
3795e1ddb48SDavid Howells 	__u8   bDescriptorType;
3805e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
381f823b75fSLaurent Pinchart 	__le16 wMaxTransferSize;
3825e1ddb48SDavid Howells } __attribute__((__packed__));
3835e1ddb48SDavid Howells 
3845e1ddb48SDavid Howells #define UVC_DT_CONTROL_ENDPOINT_SIZE			5
3855e1ddb48SDavid Howells 
3865e1ddb48SDavid Howells /* 3.9.2.1. Input Header Descriptor */
3875e1ddb48SDavid Howells struct uvc_input_header_descriptor {
3885e1ddb48SDavid Howells 	__u8   bLength;
3895e1ddb48SDavid Howells 	__u8   bDescriptorType;
3905e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
3915e1ddb48SDavid Howells 	__u8   bNumFormats;
392f823b75fSLaurent Pinchart 	__le16 wTotalLength;
3935e1ddb48SDavid Howells 	__u8   bEndpointAddress;
3945e1ddb48SDavid Howells 	__u8   bmInfo;
3955e1ddb48SDavid Howells 	__u8   bTerminalLink;
3965e1ddb48SDavid Howells 	__u8   bStillCaptureMethod;
3975e1ddb48SDavid Howells 	__u8   bTriggerSupport;
3985e1ddb48SDavid Howells 	__u8   bTriggerUsage;
3995e1ddb48SDavid Howells 	__u8   bControlSize;
4005e1ddb48SDavid Howells 	__u8   bmaControls[];
4015e1ddb48SDavid Howells } __attribute__((__packed__));
4025e1ddb48SDavid Howells 
4035e1ddb48SDavid Howells #define UVC_DT_INPUT_HEADER_SIZE(n, p)			(13+(n*p))
4045e1ddb48SDavid Howells 
4055e1ddb48SDavid Howells #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \
4065e1ddb48SDavid Howells 	uvc_input_header_descriptor_##n_##p
4075e1ddb48SDavid Howells 
4085e1ddb48SDavid Howells #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p)	\
4095e1ddb48SDavid Howells struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) {		\
4105e1ddb48SDavid Howells 	__u8   bLength;					\
4115e1ddb48SDavid Howells 	__u8   bDescriptorType;				\
4125e1ddb48SDavid Howells 	__u8   bDescriptorSubType;			\
4135e1ddb48SDavid Howells 	__u8   bNumFormats;				\
414f823b75fSLaurent Pinchart 	__le16 wTotalLength;				\
4155e1ddb48SDavid Howells 	__u8   bEndpointAddress;			\
4165e1ddb48SDavid Howells 	__u8   bmInfo;					\
4175e1ddb48SDavid Howells 	__u8   bTerminalLink;				\
4185e1ddb48SDavid Howells 	__u8   bStillCaptureMethod;			\
4195e1ddb48SDavid Howells 	__u8   bTriggerSupport;				\
4205e1ddb48SDavid Howells 	__u8   bTriggerUsage;				\
4215e1ddb48SDavid Howells 	__u8   bControlSize;				\
4225e1ddb48SDavid Howells 	__u8   bmaControls[p][n];			\
4235e1ddb48SDavid Howells } __attribute__ ((packed))
4245e1ddb48SDavid Howells 
4255e1ddb48SDavid Howells /* 3.9.2.2. Output Header Descriptor */
4265e1ddb48SDavid Howells struct uvc_output_header_descriptor {
4275e1ddb48SDavid Howells 	__u8   bLength;
4285e1ddb48SDavid Howells 	__u8   bDescriptorType;
4295e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
4305e1ddb48SDavid Howells 	__u8   bNumFormats;
431f823b75fSLaurent Pinchart 	__le16 wTotalLength;
4325e1ddb48SDavid Howells 	__u8   bEndpointAddress;
4335e1ddb48SDavid Howells 	__u8   bTerminalLink;
4345e1ddb48SDavid Howells 	__u8   bControlSize;
4355e1ddb48SDavid Howells 	__u8   bmaControls[];
4365e1ddb48SDavid Howells } __attribute__((__packed__));
4375e1ddb48SDavid Howells 
4385e1ddb48SDavid Howells #define UVC_DT_OUTPUT_HEADER_SIZE(n, p)			(9+(n*p))
4395e1ddb48SDavid Howells 
4405e1ddb48SDavid Howells #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \
4415e1ddb48SDavid Howells 	uvc_output_header_descriptor_##n_##p
4425e1ddb48SDavid Howells 
4435e1ddb48SDavid Howells #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p)	\
4445e1ddb48SDavid Howells struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) {		\
4455e1ddb48SDavid Howells 	__u8   bLength;					\
4465e1ddb48SDavid Howells 	__u8   bDescriptorType;				\
4475e1ddb48SDavid Howells 	__u8   bDescriptorSubType;			\
4485e1ddb48SDavid Howells 	__u8   bNumFormats;				\
449f823b75fSLaurent Pinchart 	__le16 wTotalLength;				\
4505e1ddb48SDavid Howells 	__u8   bEndpointAddress;			\
4515e1ddb48SDavid Howells 	__u8   bTerminalLink;				\
4525e1ddb48SDavid Howells 	__u8   bControlSize;				\
4535e1ddb48SDavid Howells 	__u8   bmaControls[p][n];			\
4545e1ddb48SDavid Howells } __attribute__ ((packed))
4555e1ddb48SDavid Howells 
4565e1ddb48SDavid Howells /* 3.9.2.6. Color matching descriptor */
4575e1ddb48SDavid Howells struct uvc_color_matching_descriptor {
4585e1ddb48SDavid Howells 	__u8  bLength;
4595e1ddb48SDavid Howells 	__u8  bDescriptorType;
4605e1ddb48SDavid Howells 	__u8  bDescriptorSubType;
4615e1ddb48SDavid Howells 	__u8  bColorPrimaries;
4625e1ddb48SDavid Howells 	__u8  bTransferCharacteristics;
4635e1ddb48SDavid Howells 	__u8  bMatrixCoefficients;
4645e1ddb48SDavid Howells } __attribute__((__packed__));
4655e1ddb48SDavid Howells 
4665e1ddb48SDavid Howells #define UVC_DT_COLOR_MATCHING_SIZE			6
4675e1ddb48SDavid Howells 
4685e1ddb48SDavid Howells /* 4.3.1.1. Video Probe and Commit Controls */
4695e1ddb48SDavid Howells struct uvc_streaming_control {
4705e1ddb48SDavid Howells 	__u16 bmHint;
4715e1ddb48SDavid Howells 	__u8  bFormatIndex;
4725e1ddb48SDavid Howells 	__u8  bFrameIndex;
4735e1ddb48SDavid Howells 	__u32 dwFrameInterval;
4745e1ddb48SDavid Howells 	__u16 wKeyFrameRate;
4755e1ddb48SDavid Howells 	__u16 wPFrameRate;
4765e1ddb48SDavid Howells 	__u16 wCompQuality;
4775e1ddb48SDavid Howells 	__u16 wCompWindowSize;
4785e1ddb48SDavid Howells 	__u16 wDelay;
4795e1ddb48SDavid Howells 	__u32 dwMaxVideoFrameSize;
4805e1ddb48SDavid Howells 	__u32 dwMaxPayloadTransferSize;
4815e1ddb48SDavid Howells 	__u32 dwClockFrequency;
4825e1ddb48SDavid Howells 	__u8  bmFramingInfo;
4835e1ddb48SDavid Howells 	__u8  bPreferedVersion;
4845e1ddb48SDavid Howells 	__u8  bMinVersion;
4855e1ddb48SDavid Howells 	__u8  bMaxVersion;
4865e1ddb48SDavid Howells } __attribute__((__packed__));
4875e1ddb48SDavid Howells 
4885e1ddb48SDavid Howells /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */
4895e1ddb48SDavid Howells struct uvc_format_uncompressed {
4905e1ddb48SDavid Howells 	__u8  bLength;
4915e1ddb48SDavid Howells 	__u8  bDescriptorType;
4925e1ddb48SDavid Howells 	__u8  bDescriptorSubType;
4935e1ddb48SDavid Howells 	__u8  bFormatIndex;
4945e1ddb48SDavid Howells 	__u8  bNumFrameDescriptors;
4955e1ddb48SDavid Howells 	__u8  guidFormat[16];
4965e1ddb48SDavid Howells 	__u8  bBitsPerPixel;
4975e1ddb48SDavid Howells 	__u8  bDefaultFrameIndex;
4985e1ddb48SDavid Howells 	__u8  bAspectRatioX;
4995e1ddb48SDavid Howells 	__u8  bAspectRatioY;
50081c25247SDaniel Scally 	__u8  bmInterlaceFlags;
5015e1ddb48SDavid Howells 	__u8  bCopyProtect;
5025e1ddb48SDavid Howells } __attribute__((__packed__));
5035e1ddb48SDavid Howells 
5045e1ddb48SDavid Howells #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE			27
5055e1ddb48SDavid Howells 
5065e1ddb48SDavid Howells /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */
5075e1ddb48SDavid Howells struct uvc_frame_uncompressed {
5085e1ddb48SDavid Howells 	__u8   bLength;
5095e1ddb48SDavid Howells 	__u8   bDescriptorType;
5105e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
5115e1ddb48SDavid Howells 	__u8   bFrameIndex;
5125e1ddb48SDavid Howells 	__u8   bmCapabilities;
513f823b75fSLaurent Pinchart 	__le16 wWidth;
514f823b75fSLaurent Pinchart 	__le16 wHeight;
515f823b75fSLaurent Pinchart 	__le32 dwMinBitRate;
516f823b75fSLaurent Pinchart 	__le32 dwMaxBitRate;
517f823b75fSLaurent Pinchart 	__le32 dwMaxVideoFrameBufferSize;
518f823b75fSLaurent Pinchart 	__le32 dwDefaultFrameInterval;
5195e1ddb48SDavid Howells 	__u8   bFrameIntervalType;
520f823b75fSLaurent Pinchart 	__le32 dwFrameInterval[];
5215e1ddb48SDavid Howells } __attribute__((__packed__));
5225e1ddb48SDavid Howells 
5235e1ddb48SDavid Howells #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n)		(26+4*(n))
5245e1ddb48SDavid Howells 
5255e1ddb48SDavid Howells #define UVC_FRAME_UNCOMPRESSED(n) \
5265e1ddb48SDavid Howells 	uvc_frame_uncompressed_##n
5275e1ddb48SDavid Howells 
5285e1ddb48SDavid Howells #define DECLARE_UVC_FRAME_UNCOMPRESSED(n)		\
5295e1ddb48SDavid Howells struct UVC_FRAME_UNCOMPRESSED(n) {			\
5305e1ddb48SDavid Howells 	__u8   bLength;					\
5315e1ddb48SDavid Howells 	__u8   bDescriptorType;				\
5325e1ddb48SDavid Howells 	__u8   bDescriptorSubType;			\
5335e1ddb48SDavid Howells 	__u8   bFrameIndex;				\
5345e1ddb48SDavid Howells 	__u8   bmCapabilities;				\
535f823b75fSLaurent Pinchart 	__le16 wWidth;					\
536f823b75fSLaurent Pinchart 	__le16 wHeight;					\
537f823b75fSLaurent Pinchart 	__le32 dwMinBitRate;				\
538f823b75fSLaurent Pinchart 	__le32 dwMaxBitRate;				\
539f823b75fSLaurent Pinchart 	__le32 dwMaxVideoFrameBufferSize;		\
540f823b75fSLaurent Pinchart 	__le32 dwDefaultFrameInterval;			\
5415e1ddb48SDavid Howells 	__u8   bFrameIntervalType;			\
542f823b75fSLaurent Pinchart 	__le32 dwFrameInterval[n];			\
5435e1ddb48SDavid Howells } __attribute__ ((packed))
5445e1ddb48SDavid Howells 
5455e1ddb48SDavid Howells /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */
5465e1ddb48SDavid Howells struct uvc_format_mjpeg {
5475e1ddb48SDavid Howells 	__u8  bLength;
5485e1ddb48SDavid Howells 	__u8  bDescriptorType;
5495e1ddb48SDavid Howells 	__u8  bDescriptorSubType;
5505e1ddb48SDavid Howells 	__u8  bFormatIndex;
5515e1ddb48SDavid Howells 	__u8  bNumFrameDescriptors;
5525e1ddb48SDavid Howells 	__u8  bmFlags;
5535e1ddb48SDavid Howells 	__u8  bDefaultFrameIndex;
5545e1ddb48SDavid Howells 	__u8  bAspectRatioX;
5555e1ddb48SDavid Howells 	__u8  bAspectRatioY;
55681c25247SDaniel Scally 	__u8  bmInterlaceFlags;
5575e1ddb48SDavid Howells 	__u8  bCopyProtect;
5585e1ddb48SDavid Howells } __attribute__((__packed__));
5595e1ddb48SDavid Howells 
5605e1ddb48SDavid Howells #define UVC_DT_FORMAT_MJPEG_SIZE			11
5615e1ddb48SDavid Howells 
5625e1ddb48SDavid Howells /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */
5635e1ddb48SDavid Howells struct uvc_frame_mjpeg {
5645e1ddb48SDavid Howells 	__u8   bLength;
5655e1ddb48SDavid Howells 	__u8   bDescriptorType;
5665e1ddb48SDavid Howells 	__u8   bDescriptorSubType;
5675e1ddb48SDavid Howells 	__u8   bFrameIndex;
5685e1ddb48SDavid Howells 	__u8   bmCapabilities;
569f823b75fSLaurent Pinchart 	__le16 wWidth;
570f823b75fSLaurent Pinchart 	__le16 wHeight;
571f823b75fSLaurent Pinchart 	__le32 dwMinBitRate;
572f823b75fSLaurent Pinchart 	__le32 dwMaxBitRate;
573f823b75fSLaurent Pinchart 	__le32 dwMaxVideoFrameBufferSize;
574f823b75fSLaurent Pinchart 	__le32 dwDefaultFrameInterval;
5755e1ddb48SDavid Howells 	__u8   bFrameIntervalType;
576f823b75fSLaurent Pinchart 	__le32 dwFrameInterval[];
5775e1ddb48SDavid Howells } __attribute__((__packed__));
5785e1ddb48SDavid Howells 
5795e1ddb48SDavid Howells #define UVC_DT_FRAME_MJPEG_SIZE(n)			(26+4*(n))
5805e1ddb48SDavid Howells 
5815e1ddb48SDavid Howells #define UVC_FRAME_MJPEG(n) \
5825e1ddb48SDavid Howells 	uvc_frame_mjpeg_##n
5835e1ddb48SDavid Howells 
5845e1ddb48SDavid Howells #define DECLARE_UVC_FRAME_MJPEG(n)			\
5855e1ddb48SDavid Howells struct UVC_FRAME_MJPEG(n) {				\
5865e1ddb48SDavid Howells 	__u8   bLength;					\
5875e1ddb48SDavid Howells 	__u8   bDescriptorType;				\
5885e1ddb48SDavid Howells 	__u8   bDescriptorSubType;			\
5895e1ddb48SDavid Howells 	__u8   bFrameIndex;				\
5905e1ddb48SDavid Howells 	__u8   bmCapabilities;				\
591f823b75fSLaurent Pinchart 	__le16 wWidth;					\
592f823b75fSLaurent Pinchart 	__le16 wHeight;					\
593f823b75fSLaurent Pinchart 	__le32 dwMinBitRate;				\
594f823b75fSLaurent Pinchart 	__le32 dwMaxBitRate;				\
595f823b75fSLaurent Pinchart 	__le32 dwMaxVideoFrameBufferSize;		\
596f823b75fSLaurent Pinchart 	__le32 dwDefaultFrameInterval;			\
5975e1ddb48SDavid Howells 	__u8   bFrameIntervalType;			\
598f823b75fSLaurent Pinchart 	__le32 dwFrameInterval[n];			\
5995e1ddb48SDavid Howells } __attribute__ ((packed))
6005e1ddb48SDavid Howells 
6017b5a5895SAkash Kumar /* Frame Based Payload - 3.1.1. Frame Based Video Format Descriptor */
6027b5a5895SAkash Kumar struct uvc_format_framebased {
6037b5a5895SAkash Kumar 	__u8  bLength;
6047b5a5895SAkash Kumar 	__u8  bDescriptorType;
6057b5a5895SAkash Kumar 	__u8  bDescriptorSubType;
6067b5a5895SAkash Kumar 	__u8  bFormatIndex;
6077b5a5895SAkash Kumar 	__u8  bNumFrameDescriptors;
6087b5a5895SAkash Kumar 	__u8  guidFormat[16];
6097b5a5895SAkash Kumar 	__u8  bBitsPerPixel;
6107b5a5895SAkash Kumar 	__u8  bDefaultFrameIndex;
6117b5a5895SAkash Kumar 	__u8  bAspectRatioX;
6127b5a5895SAkash Kumar 	__u8  bAspectRatioY;
6137b5a5895SAkash Kumar 	__u8  bmInterfaceFlags;
6147b5a5895SAkash Kumar 	__u8  bCopyProtect;
6157b5a5895SAkash Kumar 	__u8  bVariableSize;
6167b5a5895SAkash Kumar } __attribute__((__packed__));
6177b5a5895SAkash Kumar 
6187b5a5895SAkash Kumar #define UVC_DT_FORMAT_FRAMEBASED_SIZE                  28
6197b5a5895SAkash Kumar 
6207b5a5895SAkash Kumar /* Frame Based Payload - 3.1.2. Frame Based Video Frame Descriptor */
6217b5a5895SAkash Kumar struct uvc_frame_framebased {
6227b5a5895SAkash Kumar 	__u8  bLength;
6237b5a5895SAkash Kumar 	__u8  bDescriptorType;
6247b5a5895SAkash Kumar 	__u8  bDescriptorSubType;
6257b5a5895SAkash Kumar 	__u8  bFrameIndex;
6267b5a5895SAkash Kumar 	__u8  bmCapabilities;
6277b5a5895SAkash Kumar 	__u16 wWidth;
6287b5a5895SAkash Kumar 	__u16 wHeight;
6297b5a5895SAkash Kumar 	__u32 dwMinBitRate;
6307b5a5895SAkash Kumar 	__u32 dwMaxBitRate;
6317b5a5895SAkash Kumar 	__u32 dwDefaultFrameInterval;
6327b5a5895SAkash Kumar 	__u8  bFrameIntervalType;
6337b5a5895SAkash Kumar 	__u32 dwBytesPerLine;
6347b5a5895SAkash Kumar 	__u32 dwFrameInterval[];
6357b5a5895SAkash Kumar } __attribute__((__packed__));
6367b5a5895SAkash Kumar 
6377b5a5895SAkash Kumar #define UVC_DT_FRAME_FRAMEBASED_SIZE(n)                        (26+4*(n))
6387b5a5895SAkash Kumar 
6397b5a5895SAkash Kumar #define UVC_FRAME_FRAMEBASED(n) \
6407b5a5895SAkash Kumar 	uvc_frame_framebased_##n
6417b5a5895SAkash Kumar 
6427b5a5895SAkash Kumar #define DECLARE_UVC_FRAME_FRAMEBASED(n)			\
6437b5a5895SAkash Kumar struct UVC_FRAME_FRAMEBASED(n) {			\
6447b5a5895SAkash Kumar 	__u8  bLength;					\
6457b5a5895SAkash Kumar 	__u8  bDescriptorType;				\
6467b5a5895SAkash Kumar 	__u8  bDescriptorSubType;                       \
6477b5a5895SAkash Kumar 	__u8  bFrameIndex;                              \
6487b5a5895SAkash Kumar 	__u8  bmCapabilities;                           \
6497b5a5895SAkash Kumar 	__u16 wWidth;                                   \
6507b5a5895SAkash Kumar 	__u16 wHeight;                                  \
6517b5a5895SAkash Kumar 	__u32 dwMinBitRate;                             \
6527b5a5895SAkash Kumar 	__u32 dwMaxBitRate;                             \
6537b5a5895SAkash Kumar 	__u32 dwDefaultFrameInterval;                   \
6547b5a5895SAkash Kumar 	__u8  bFrameIntervalType;                       \
6557b5a5895SAkash Kumar 	__u32 dwBytesPerLine;                           \
6567b5a5895SAkash Kumar 	__u32 dwFrameInterval[n];                       \
6577b5a5895SAkash Kumar } __attribute__ ((packed))
6587b5a5895SAkash Kumar 
6595e1ddb48SDavid Howells #endif /* __LINUX_USB_VIDEO_H */
6605e1ddb48SDavid Howells 
661