1 /* 2 * Copyright 2016, Adrien Destugues, pulkomandy@pulkomandy.tk 3 * Distributed under terms of the MIT license. 4 */ 5 6 7 #ifndef USB_VIDEO_H 8 #define USB_VIDEO_H 9 10 11 // Based on specification for UVC version 1.5. 12 13 14 #include <SupportDefs.h> 15 16 17 #define USB_VIDEO_DEVICE_CLASS 0x0E 18 19 enum { // Video Interface Subclasses 20 USB_VIDEO_INTERFACE_UNDEFINED_SUBCLASS = 0x00, 21 USB_VIDEO_INTERFACE_VIDEOCONTROL_SUBCLASS = 0x01, 22 USB_VIDEO_INTERFACE_VIDEOSTREAMING_SUBCLASS, 23 USB_VIDEO_INTERFACE_COLLECTION_SUBCLASS, 24 }; 25 26 27 enum { // Video Interface Protocol Codes 28 USB_VIDEO_PROTOCOL_UNDEFINED = 0x00, 29 USB_VIDEO_PROTOCOL_15 = 0x01, 30 }; 31 32 33 enum { // Video Interface Class-Specific Descriptor Types 34 USB_VIDEO_CS_UNDEFINED = 0x20, 35 USB_VIDEO_CS_DEVICE = 0x21, 36 USB_VIDEO_CS_CONFIGURATION = 0x22, 37 USB_VIDEO_CS_STRING = 0x23, 38 USB_VIDEO_CS_INTERFACE = 0x24, 39 USB_VIDEO_CS_ENDPOINT = 0x25, 40 }; 41 42 43 enum { // Video Class-Specific VideoControl Interface descriptor subtypes 44 USB_VIDEO_VC_DESCRIPTOR_UNDEFINED = 0x00, 45 USB_VIDEO_VC_HEADER = 0x01, 46 USB_VIDEO_VC_INPUT_TERMINAL = 0x02, 47 USB_VIDEO_VC_OUTPUT_TERMINAL = 0x03, 48 USB_VIDEO_VC_SELECTOR_UNIT = 0x04, 49 USB_VIDEO_VC_PROCESSING_UNIT = 0x05, 50 USB_VIDEO_VC_EXTENSION_UNIT = 0x06, 51 USB_VIDEO_VC_ENCODING_UNIT = 0x07, 52 }; 53 54 55 enum { // Video Class-Specific VideoStreaming Interface descriptor subtypes 56 USB_VIDEO_VS_UNDEFINED = 0x00, 57 USB_VIDEO_VS_INPUT_HEADER = 0x01, 58 USB_VIDEO_VS_OUTPUT_HEADER = 0x02, 59 USB_VIDEO_VS_STILL_IMAGE_FRAME = 0x03, 60 USB_VIDEO_VS_FORMAT_UNCOMPRESSED = 0x04, 61 USB_VIDEO_VS_FRAME_UNCOMPRESSED = 0x05, 62 USB_VIDEO_VS_FORMAT_MJPEG = 0x06, 63 USB_VIDEO_VS_FRAME_MJPEG = 0x07, 64 USB_VIDEO_VS_FORMAT_MPEG2TS = 0x0a, 65 USB_VIDEO_VS_FORMAT_DV = 0x0c, 66 USB_VIDEO_VS_COLORFORMAT = 0x0d, 67 USB_VIDEO_VS_FORMAT_FRAME_BASED = 0x10, 68 USB_VIDEO_VS_FRAME_FRAME_BASED = 0x11, 69 USB_VIDEO_VS_FORMAT_STREAM_BASED = 0x12, 70 USB_VIDEO_VS_FORMAT_H264 = 0x13, 71 USB_VIDEO_VS_FRAME_H264 = 0x14, 72 USB_VIDEO_VS_FORMAT_H264_SIMULCAST = 0x15, 73 USB_VIDEO_VS_FORMAT_VP8 = 0x16, 74 USB_VIDEO_VS_FRAME_VP8 = 0x17, 75 USB_VIDEO_VS_FORMAT_VP8_SIMULCAST = 0x18, 76 }; 77 78 79 enum { 80 // USB Terminal Types 81 USB_VIDEO_VENDOR_USB_IO = 0x100, 82 USB_VIDEO_STREAMING_USB_IO = 0x101, 83 // Input terminal types 84 USB_VIDEO_VENDOR_IN = 0x200, 85 USB_VIDEO_CAMERA_IN = 0x201, 86 USB_VIDEO_MEDIA_TRANSPORT_IN = 0x202, 87 // Output terminal types 88 USB_VIDEO_VENDOR_OUT = 0x300, 89 USB_VIDEO_DISPLAY_OUT = 0x301, 90 USB_VIDEO_MEDIA_TRANSPORT_OUT = 0x302, 91 // External terminal types 92 USB_VIDEO_VENDOR_EXT = 0x400, 93 USB_VIDEO_COMPOSITE_EXT = 0x401, 94 USB_VIDEO_SVIDEO_EXT = 0x402, 95 USB_VIDEO_COMPONENT_EXT = 0x403, 96 }; 97 98 99 enum { 100 EP_SUBTYPE_UNDEFINED = 0x00, 101 EP_SUBTYPE_GENERAL = 0x01, 102 EP_SUBTYPE_ENDPOINT = 0x02, 103 EP_SUBTYPE_INTERRUPT = 0x03, 104 }; 105 106 107 // Class Specific Video Control Interface Header 108 // 1.5: Table 3-3 p.48 109 typedef struct { 110 uint8 length; 111 uint8 descriptor_type; // USB_AUDIO_CS_INTERFACE 112 uint8 descriptor_subtype; // USB_AUDIO_AC_HEADER 113 uint16 bcd_release_no; 114 uint16 total_length; 115 uint32 clock_frequency; 116 uint8 in_collection; 117 uint8 interface_numbers[0]; 118 } _PACKED usb_videocontrol_header_descriptor; 119 120 121 // Input Terminal Descriptor 122 // 1.5: Table 3-4, page 50 123 typedef struct { 124 uint8 length; 125 uint8 descriptor_type; // USB_VIDEO_CS_INTERFACE 126 uint8 descriptor_subtype; // USB_VIDEO_VC_INPUT_TERMINAL 127 uint8 terminal_id; 128 uint16 terminal_type; 129 uint8 assoc_terminal; 130 uint8 terminal; 131 132 union { 133 struct { 134 uint16 focal_length_min; 135 uint16 focal_length_max; 136 uint16 focal_length; 137 uint8 control_size; 138 uint8 controls[3]; 139 } _PACKED camera; 140 }; 141 } _PACKED usb_video_input_terminal_descriptor; 142 143 144 // Output terminal descriptor 145 // 1.5: Table 3-5, page 51 146 typedef struct { 147 uint8 length; 148 uint8 descriptor_type; // USB_VIDEO_CS_INTERFACE 149 uint8 descriptor_subtype; // USB_VIDEO_VC_OUTPUT_TERMINAL 150 uint8 terminal_id; 151 uint16 terminal_type; 152 uint8 assoc_terminal; 153 uint8 source_id; 154 uint8 terminal; 155 } _PACKED usb_video_output_terminal_descriptor; 156 157 158 // Processing unit descriptor 159 // 1.5: Table 3-8, page 54 160 typedef struct { 161 uint8 length; 162 uint8 descriptor_type; 163 uint8 descriptor_subtype; 164 uint8 unit_id; 165 uint8 source_id; 166 uint16 max_multiplier; 167 uint8 control_size; 168 uint8 controls[3]; 169 uint8 processing; 170 uint8 video_standards; 171 } _PACKED usb_video_processing_unit_descriptor; 172 173 174 struct usb_video_frame_descriptor { 175 uint8 length; 176 uint8 descriptor_type; 177 uint8 descriptor_subtype; 178 uint8 frame_index; 179 uint8 capabilities; 180 uint16 width; 181 uint16 height; 182 uint32 min_bit_rate; 183 uint32 max_bit_rate; 184 uint32 max_video_frame_buffer_size; 185 uint32 default_frame_interval; 186 uint8 frame_interval_type; 187 union { 188 struct { 189 uint32 min_frame_interval; 190 uint32 max_frame_tnterval; 191 uint32 frame_interval_step; 192 } continuous; 193 uint32 discrete_frame_intervals[0]; 194 }; 195 } _PACKED; 196 197 198 #endif /* !USB_VIDEO_H */ 199