1/* 2 * Copyright 2011, Haiku Inc. All Rights Reserved. 3 * Copyright 2009, Ithamar Adema, <ithamar.adema@team-embedded.nl>. 4 * Distributed under the terms of the MIT License. 5 */ 6#ifndef _USB_VIDEO_H 7#define _USB_VIDEO_H 8 9 10/* Class/Subclass/Protocol */ 11#define CC_VIDEO 0xE 12#define SC_UNDEFINED 0x0 13#define SC_VIDEOCONTROL 0x1 14#define SC_VIDEOSTREAMING 0x2 15#define SC_VIDEO_INTERFACE_COLLECTION 0x3 16#define PC_PROTOCOL_UNDEFINED 0x0 17 18#define CS_UNDEFINED 0x20 19#define CS_DEVICE 0x21 20#define CS_CONFIGURATION 0x22 21#define CS_STRING 0x23 22#define CS_INTERFACE 0x24 23#define CS_ENDPOINT 0x25 24 25/* Video Control Class Descriptors */ 26#define VC_DESCRIPTOR_UNDEFINED 0x0 27#define VC_HEADER 0x1 28#define VC_INPUT_TERMINAL 0x2 29#define VC_OUTPUT_TERMINAL 0x3 30#define VC_SELECTOR_UNIT 0x4 31#define VC_PROCESSING_UNIT 0x5 32#define VC_EXTENSION_UNIT 0x6 33 34/* Video Streaming Class Descriptors */ 35#define VS_UNDEFINED 0x00 36#define VS_INPUT_HEADER 0x01 37#define VS_OUTPUT_HEADER 0x02 38#define VS_STILL_IMAGE_FRAME 0x03 39#define VS_FORMAT_UNCOMPRESSED 0x04 40#define VS_FRAME_UNCOMPRESSED 0x05 41#define VS_FORMAT_MJPEG 0x06 42#define VS_FRAME_MJPEG 0x07 43#define VS_FORMAT_MPEG2TS 0x0a 44#define VS_FORMAT_DV 0x0c 45#define VS_COLORFORMAT 0x0d 46#define VS_FORMAT_FRAME_BASED 0x10 47#define VS_FRAME_FRAME_BASED 0x11 48#define VS_FORMAT_STREAM_BASED 0x12 49 50#define EP_UNDEFINED 0x0 51#define EP_GENERAL 0x1 52#define EP_ENDPOINT 0x2 53#define EP_INTERRUPT 0x3 54 55#define RC_UNDEFINED 0x00 56#define SET_CUR 0x01 57#define GET_CUR 0x81 58#define GET_MIN 0x82 59#define GET_MAX 0x83 60#define GET_RES 0x84 61#define GET_LEN 0x85 62#define GET_INFO 0x86 63#define GET_DEF 0x87 64 65#define VC_CONTROL_UNDEFINED 0x0 66#define VC_VIDEO_POWER_MODE_CONTROL 0x1 67#define VC_REQUEST_ERROR_CODE_CONTROL 0x2 68 69#define TE_CONTROL_UNDEFINED 0x0 70 71#define SU_CONTROL_UNDEFINED 0x0 72#define SU_INPUT_SELECT_CONTROL 0x1 73 74#define CT_CONTROL_UNDEFINED 0x0 75#define CT_SCANNING_MODE_CONTROL 0x1 76#define CT_AE_MODE_CONTROL 0x2 77#define CT_AE_PRIORITY_CONTROL 0x3 78#define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x4 79#define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x5 80#define CT_FOCUS_ABSOLUTE_CONTROL 0x6 81#define CT_FOCUS_RELATIVE_CONTROL 0x7 82#define CT_FOCUS_AUTO_CONTROL 0x8 83#define CT_IRIS_ABSOLUTE_CONTROL 0x9 84#define CT_IRIS_RELATIVE_CONTROL 0xa 85#define CT_ZOOM_ABSOLUTE_CONTROL 0xb 86#define CT_ZOOM_RELATIVE_CONTROL 0xc 87#define CT_PANTILT_ABSOLUTE_CONTROL 0xd 88#define CT_PANTILT_RELATIVE_CONTROL 0xe 89#define CT_ROLL_ABSOLUTE_CONTROL 0xf 90#define CT_ROLL_RELATIVE_CONTROL 0x10 91#define CT_PRIVACY_CONTROL 0x11 92 93#define PU_CONTROL_UNDEFINED 0x0 94#define PU_BACKLIGHT_COMPENSATION_CONTROL 0x1 95#define PU_BRIGHTNESS_CONTROL 0x2 96#define PU_CONTRAST_CONTROL 0x3 97#define PU_GAIN_CONTROL 0x4 98#define PU_POWER_LINE_FREQUENCY_CONTROL 0x5 99#define PU_HUE_CONTROL 0x6 100#define PU_SATURATION_CONTROL 0x7 101#define PU_SHARPNESS_CONTROL 0x8 102#define PU_GAMMA_CONTROL 0x9 103#define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0xa 104#define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0xb 105#define PU_WHITE_BALANCE_COMPONENT_CONTROL 0xc 106#define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0xd 107#define PU_DIGITAL_MULTIPLIER_CONTROL 0xe 108#define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0xf 109#define PU_HUE_AUTO_CONTROL 0x10 110#define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 111#define PU_ANALOG_LOCK_STATUS_CONTROL 0x12 112 113#define XU_CONTROL_UNDEFINED 0x0 114 115#define VS_CONTROL_UNDEFINED 0x0 116#define VS_PROBE_CONTROL 0x1 117#define VS_COMMIT_CONTROL 0x2 118#define VS_STILL_PROBE_CONTROL 0x3 119#define VS_STILL_COMMIT_CONTROL 0x4 120#define VS_STILL_IMAGE_TRIGGER_CONTROL 0x5 121#define VS_STREAM_ERROR_CODE_CONTROL 0x6 122#define VS_GENERATE_KEY_FRAME_CONTROL 0x7 123#define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8 124#define VS_SYNCH_DELAY_CONTROL 0x9 125 126typedef struct usbvc_class_descriptor { 127 uint8 length; 128 uint8 descriptorType; 129 uint8 descriptorSubtype; 130} _PACKED usbvc_class_descriptor; 131 132struct usbvc_input_header_descriptor { 133 uint8 length; 134 uint8 descriptorType; 135 uint8 descriptorSubtype; 136 uint8 numFormats; 137 uint16 totalLength; 138 uint8 endpointAddress; 139 uint8 info; 140 uint8 terminalLink; 141 uint8 stillCaptureMethod; 142 uint8 triggerSupport; 143 uint8 triggerUsage; 144 uint8 controlSize; 145 uint8 controls[0]; 146} _PACKED; 147 148struct usbvc_output_header_descriptor { 149 uint8 length; 150 uint8 descriptorType; 151 uint8 descriptorSubtype; 152 uint8 numFormats; 153 uint16 totalLength; 154 uint8 endpointAddress; 155 uint8 terminalLink; 156 uint8 controlSize; 157 uint8 controls[0]; 158} _PACKED; 159 160typedef uint8 usbvc_guid[16]; 161 162struct usbvc_format_descriptor { 163 uint8 length; 164 uint8 descriptorType; 165 uint8 descriptorSubtype; 166 uint8 formatIndex; 167 uint8 numFrameDescriptors; 168 union { 169 struct { 170 usbvc_guid format; 171 uint8 bytesPerPixel; 172 uint8 defaultFrameIndex; 173 uint8 aspectRatioX; 174 uint8 aspectRatioY; 175 uint8 interlaceFlags; 176 uint8 copyProtect; 177 } uncompressed; 178 struct { 179 uint8 flags; 180 uint8 defaultFrameIndex; 181 uint8 aspectRatioX; 182 uint8 aspectRatioY; 183 uint8 interlaceFlags; 184 uint8 copyProtect; 185 } mjpeg; 186 }; 187} _PACKED; 188 189struct usbvc_frame_descriptor { 190 uint8 length; 191 uint8 descriptorType; 192 uint8 descriptorSubtype; 193 uint8 frameIndex; 194 uint8 capabilities; 195 uint16 width; 196 uint16 height; 197 uint32 minBitRate; 198 uint32 maxBitRate; 199 uint32 maxVideoFrameBufferSize; 200 uint32 defaultFrameInterval; 201 uint8 frameIntervalType; 202 union { 203 struct { 204 uint32 minFrameInterval; 205 uint32 maxFrameInterval; 206 uint32 frameIntervalStep; 207 } continuous; 208 uint32 discreteFrameIntervals[0]; 209 }; 210} _PACKED; 211 212typedef struct { 213 uint16 width; 214 uint16 height; 215} _PACKED usbvc_image_size_pattern; 216 217struct usbvc_still_image_frame_descriptor { 218 uint8 length; 219 uint8 descriptorType; 220 uint8 descriptorSubtype; 221 uint8 endpointAddress; 222 uint8 numImageSizePatterns; 223 usbvc_image_size_pattern imageSizePatterns[0]; 224 uint8 NumCompressionPatterns() const { return *(CompressionPatterns() - 1); } 225 const uint8* CompressionPatterns() const { 226 return ((const uint8*)imageSizePatterns + sizeof(usbvc_image_size_pattern) 227 * numImageSizePatterns + sizeof(uint8)); 228 } 229} _PACKED; 230 231struct usbvc_color_matching_descriptor { 232 uint8 length; 233 uint8 descriptorType; 234 uint8 descriptorSubtype; 235 uint8 colorPrimaries; 236 uint8 transferCharacteristics; 237 uint8 matrixCoefficients; 238} _PACKED; 239 240 241struct usbvc_interface_header_descriptor { 242 uint8 length; 243 uint8 descriptorType; 244 uint8 descriptorSubtype; 245 uint16 version; 246 uint16 totalLength; 247 uint32 clockFrequency; 248 uint8 numInterfacesNumbers; 249 uint8 interfaceNumbers[0]; 250} _PACKED; 251 252struct usbvc_input_terminal_descriptor { 253 uint8 length; 254 uint8 descriptorType; 255 uint8 descriptorSubtype; 256 uint8 terminalID; 257 uint16 terminalType; 258 uint8 associatedTerminal; 259 uint8 terminal; 260} _PACKED; 261 262struct usbvc_output_terminal_descriptor { 263 uint8 length; 264 uint8 descriptorType; 265 uint8 descriptorSubtype; 266 uint8 terminalID; 267 uint16 terminalType; 268 uint8 associatedTerminal; 269 uint8 sourceID; 270 uint8 terminal; 271} _PACKED; 272 273struct usbvc_camera_terminal_descriptor { 274 uint8 length; 275 uint8 descriptorType; 276 uint8 descriptorSubtype; 277 uint8 terminalID; 278 uint16 terminalType; 279 uint8 associatedTerminal; 280 uint8 terminal; 281 uint16 objectiveFocalLengthMin; 282 uint16 objectiveFocalLengthMax; 283 uint16 ocularFocalLength; 284 uint8 controlSize; 285 uint8 controls[0]; 286} _PACKED; 287 288struct usbvc_selector_unit_descriptor { 289 uint8 length; 290 uint8 descriptorType; 291 uint8 descriptorSubtype; 292 uint8 unitID; 293 uint8 numInputPins; 294 uint8 sourceID[0]; 295 uint8 Selector() const { return sourceID[numInputPins]; } 296} _PACKED; 297 298struct usbvc_processing_unit_descriptor { 299 uint8 length; 300 uint8 descriptorType; 301 uint8 descriptorSubtype; 302 uint8 unitID; 303 uint8 sourceID; 304 uint16 maxMultiplier; 305 uint8 controlSize; 306 uint8 controls[0]; 307 uint8 Processing() const { return controls[controlSize]; } 308 uint8 VideoStandards() const { return controls[controlSize+1]; } 309} _PACKED; 310 311struct usbvc_extension_unit_descriptor { 312 uint8 length; 313 uint8 descriptorType; 314 uint8 descriptorSubtype; 315 uint8 unitID; 316 usbvc_guid guidExtensionCode; 317 uint8 numControls; 318 uint8 numInputPins; 319 uint8 sourceID[0]; 320 uint8 ControlSize() const { return sourceID[numInputPins]; } 321 const uint8* Controls() const { return &sourceID[numInputPins+1]; } 322 uint8 Extension() const 323 { return sourceID[numInputPins + ControlSize() + 1]; } 324} _PACKED; 325 326struct usbvc_probecommit { 327 uint16 hint; 328 uint8 formatIndex; 329 uint8 frameIndex; 330 uint32 frameInterval; 331 uint16 keyFrameRate; 332 uint16 pFrameRate; 333 uint16 compQuality; 334 uint16 compWindowSize; 335 uint16 delay; 336 uint32 maxVideoFrameSize; 337 uint32 maxPayloadTransferSize; 338 uint32 clockFrequency; 339 uint8 framingInfo; 340 uint8 preferredVersion; 341 uint8 minVersion; 342 uint8 maxVersion; 343 void SetFrameInterval(uint32 interval) 344 { frameInterval = interval; } 345} _PACKED; 346 347 348#endif /* _USB_VIDEO_H */ 349