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