| 1 | /* |
| 2 | * Copyright 2010 Jorma Karvonen, karvonen.jorma_at_gmail.com |
| 3 | * All rights reserved. Distributed under the terms of the MIT License. |
| 4 | */ |
| 5 | |
| 6 | #ifndef USB_VIDEO_H |
| 7 | #define USB_VIDEO_H |
| 8 | |
| 9 | // USB Class Definitions for Video Devices, version 1.1 |
| 10 | // Reference: http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip |
| 11 | |
| 12 | #include <BeBuild.h> // for _PACKED definition |
| 13 | |
| 14 | #include <lendian_bitfield.h> |
| 15 | |
| 16 | #define USB_VIDEO_DEVICE_CLASS 0x0e |
| 17 | #define USB_VIDEO_CLASS_VERSION 0x0101 |
| 18 | |
| 19 | |
| 20 | enum { // Video Interface Class Code |
| 21 | USB_VIDEO_INTERFACE_VIDEO_CLASS = 0x0e |
| 22 | }; |
| 23 | |
| 24 | |
| 25 | enum { // Video Interface Subclass Codes |
| 26 | USB_VIDEO_SC_UNDEFINED = 0x00, |
| 27 | USB_VIDEO_SC_VIDEOCONTROL = 0x01, |
| 28 | USB_VIDEO_SC_VIDEOSTREAMING = 0x02, |
| 29 | USB_VIDEO_SC_INTERFACE_COLLECTION = 0x03 |
| 30 | }; |
| 31 | |
| 32 | |
| 33 | enum { // Video Interface Protocol Codesb |
| 34 | USB_VIDEO_PC_PROTOCOL_UNDEFINED = 0x00 |
| 35 | }; |
| 36 | |
| 37 | |
| 38 | enum { // Video Class-Specific Descriptor Types |
| 39 | USB_VIDEO_CS_UNDEFINED = 0x20, |
| 40 | USB_VIDEO_CS_DEVICE = 0x21, |
| 41 | USB_VIDEO_CS_CONFIGURATION = 0x22, |
| 42 | USB_VIDEO_CS_STRING = 0x23, |
| 43 | USB_VIDEO_CS_INTERFACE = 0x24, |
| 44 | USB_VIDEO_CS_ENDPOINT = 0x25 |
| 45 | }; |
| 46 | |
| 47 | |
| 48 | enum { // Video Class-Specific VC Interface Descriptor Subtypes |
| 49 | USB_VIDEO_VC_DESCRIPTOR_UNDEFINED = 0x00, |
| 50 | USB_VIDEO_VC_HEADER = 0x01, |
| 51 | USB_VIDEO_VC_INPUT_TERMINAL = 0x02, |
| 52 | USB_VIDEO_VC_OUTPUT_TERMINAL = 0x03, |
| 53 | USB_VIDEO_VC_SELECTOR_UNIT = 0x04, |
| 54 | USB_VIDEO_VC_PROCESSING_UNIT = 0x05, |
| 55 | USB_VIDEO_VC_EXTENSION_UNIT = 0x06 |
| 56 | }; |
| 57 | |
| 58 | |
| 59 | enum { // Video Class-Specific VS Interface Descriptor Subtypes |
| 60 | USB_VIDEO_VS_UNDEFINED = 0x00, |
| 61 | USB_VIDEO_VS_INPUT_HEADER = 0x01, |
| 62 | USB_VIDEO_VS_OUTPUT_HEADER = 0x02, |
| 63 | USB_VIDEO_VS_STILL_IMAGE_FRAME = 0x03, |
| 64 | USB_VIDEO_VS_FORMAT_UNCOMPRESSED = 0x04, |
| 65 | USB_VIDEO_VS_FRAME_UNCOMPRESSED = 0x05, |
| 66 | USB_VIDEO_VS_FORMAT_MJPEG = 0x06, |
| 67 | USB_VIDEO_VS_FRAME_MJPEG = 0x07, |
| 68 | USB_VIDEO_VS_FORMAT_MPEG2TS = 0x0A, |
| 69 | USB_VIDEO_VS_FORMAT_DV = 0x0C, |
| 70 | USB_VIDEO_VS_COLORFORMAT = 0x0D, |
| 71 | USB_VIDEO_VS_FORMAT_FRAME_BASED = 0x10, |
| 72 | USB_VIDEO_VS_FRAME_FRAME_BASED = 0x11, |
| 73 | USB_VIDEO_VS_FORMAT_STREAM_BASED = 0x12 |
| 74 | }; |
| 75 | |
| 76 | |
| 77 | enum { // Video Class-Specific Endpoint Descriptor Subtypes |
| 78 | USB_VIDEO_EP_UNDEFINED = 0x00, |
| 79 | USB_VIDEO_EP_GENERAL = 0x01, |
| 80 | USB_VIDEO_EP_ENDPOINT = 0x02, |
| 81 | USB_VIDEO_EP_INTERRUPT = 0x03 |
| 82 | }; |
| 83 | |
| 84 | |
| 85 | enum { // Video Class-Specific Request Codes |
| 86 | USB_VIDEO_RC_UNDEFINED = 0x00, |
| 87 | USB_VIDEO_SET_CUR = 0x01, |
| 88 | USB_VIDEO_GET_CUR = 0x81, |
| 89 | USB_VIDEO_GET_MIN = 0x82, |
| 90 | USB_VIDEO_GET_MAX = 0x83, |
| 91 | USB_VIDEO_GET_RES = 0x84, |
| 92 | USB_VIDEO_GET_LEN = 0x85, |
| 93 | USB_VIDEO_GET_INFO = 0x86, |
| 94 | USB_VIDEO_GET_DEF = 0x87 |
| 95 | }; |
| 96 | |
| 97 | |
| 98 | enum { // Video Control Interface Control Selectors |
| 99 | USB_VIDEO_VC_CONTROL_UNDEFINED = 0x00, |
| 100 | USB_VIDEO_VC_VIDEO_POWER_MODE_CONTROL = 0x01, |
| 101 | USB_VIDEO_VC_REQUEST_ERROR_CODE_CONTROL = 0x02 |
| 102 | }; |
| 103 | |
| 104 | |
| 105 | enum { // Terminal Control Selectors |
| 106 | USB_VIDEO_TE_CONTROL_UNDEFINED = 0x00 |
| 107 | }; |
| 108 | |
| 109 | |
| 110 | enum { // Selector Unit Control Selectors |
| 111 | USB_VIDEO_SU_CONTROL_UNDEFINED = 0x00, |
| 112 | USB_VIDEO_SU_INPUT_SELECT_CONTROL = 0x01 |
| 113 | }; |
| 114 | |
| 115 | |
| 116 | enum { // Camera Terminal Control Selectors |
| 117 | USB_VIDEO_CT_CONTROL_UNDEFINED = 0x00, |
| 118 | USB_VIDEO_CT_SCANNING_MODE_CONTROL = 0x01, |
| 119 | USB_VIDEO_CT_AE_MODE_CONTROL = 0x02, |
| 120 | USB_VIDEO_CT_AE_PRIORITY_CONTROL = 0x03, |
| 121 | USB_VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL = 0x04, |
| 122 | USB_VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL = 0x05, |
| 123 | USB_VIDEO_CT_FOCUS_ABSOLUTE_CONTROL = 0x06, |
| 124 | USB_VIDEO_CT_FOCUS_RELATIVE_CONTROL = 0x07, |
| 125 | USB_VIDEO_CT_FOCUS_AUTO_CONTROL = 0x08, |
| 126 | USB_VIDEO_CT_IRIS_ABSOLUTE_CONTROL = 0x09, |
| 127 | USB_VIDEO_CT_IRIS_RELATIVE_CONTROL = 0x0A, |
| 128 | USB_VIDEO_CT_ZOOM_ABSOLUTE_CONTROL = 0x0B, |
| 129 | USB_VIDEO_CT_ZOOM_RELATIVE_CONTROL = 0x0C, |
| 130 | USB_VIDEO_CT_PANTILT_ABSOLUTE_CONTROL = 0x0D, |
| 131 | USB_VIDEO_CT_PANTILT_RELATIVE_CONTROL = 0x0E, |
| 132 | USB_VIDEO_CT_ROLL_ABSOLUTE_CONTROL = 0x0F, |
| 133 | USB_VIDEO_CT_ROLL_RELATIVE_CONTROL = 0x10, |
| 134 | USB_VIDEO_CT_PRIVACY_CONTROL = 0x11 |
| 135 | }; |
| 136 | |
| 137 | |
| 138 | enum { // Processing Unit Control Selectors |
| 139 | USB_VIDEO_PU_CONTROL_UNDEFINED = 0x00, |
| 140 | USB_VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL = 0x01, |
| 141 | USB_VIDEO_PU_BRIGHTNESS_CONTROL = 0x02, |
| 142 | USB_VIDEO_PU_CONTRAST_CONTROL = 0x03, |
| 143 | USB_VIDEO_PU_GAIN_CONTROL = 0x04, |
| 144 | USB_VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL = 0x05, |
| 145 | USB_VIDEO_PU_HUE_CONTROL = 0x06, |
| 146 | USB_VIDEO_PU_SATURATION_CONTROL = 0x07, |
| 147 | USB_VIDEO_PU_SHARPNESS_CONTROL = 0x08, |
| 148 | USB_VIDEO_PU_GAMMA_CONTROL = 0x09, |
| 149 | USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL = 0x0A, |
| 150 | USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL = 0x0B, |
| 151 | USB_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_COMPONENT_CONTROL = 0x0C, |
| 152 | USB_VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL = 0x0D, |
| 153 | USB_VIDEO_PU_DIGITAL_MULTIPLEXER_CONTROL = 0x0E, |
| 154 | USB_VIDEO_PU_DIGITAL_MULTIPLEXER_LIMIT_CONTROL = 0x0F, |
| 155 | USB_VIDEO_PU_HUE_AUTO_CONTROL = 0x10, |
| 156 | USB_VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL = 0x11, |
| 157 | USB_VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL = 0x12 |
| 158 | }; |
| 159 | |
| 160 | |
| 161 | enum { // Extension Unit Control Selectors |
| 162 | USB_VIDEO_XU_CONTROL_UNDEFINED = 0x00 |
| 163 | }; |
| 164 | |
| 165 | |
| 166 | enum { // Video Streaming Interface Control Selectors |
| 167 | USB_VIDEO_VS_CONTROL_UNDEFINED = 0x00, |
| 168 | USB_VIDEO_VS_PROBE_CONTROL = 0x01, |
| 169 | USB_VIDEO_VS_COMMIT_CONTROL = 0x02, |
| 170 | USB_VIDEO_VS_STILL_PROBE_CONTROL = 0x03, |
| 171 | USB_VIDEO_VS_STILL_COMMIT_CONTROL = 0x04, |
| 172 | USB_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL = 0x05, |
| 173 | USB_VIDEO_VS_STREAM_ERROR_CODE_CONTROL = 0x06, |
| 174 | USB_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL = 0x07, |
| 175 | USB_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL = 0x08, |
| 176 | USB_VIDEO_VS_SYNCH_DELAY_CONTROL = 0x09 |
| 177 | }; |
| 178 | |
| 179 | |
| 180 | enum { // USB Terminal types |
| 181 | USB_VIDEO_TT_VENDOR_SPECIFIC = 0x0100, |
| 182 | USB_VIDEO_TT_STREAMING = 0x0101 |
| 183 | }; |
| 184 | |
| 185 | |
| 186 | enum { // Input terminal types |
| 187 | USB_VIDEO_ITT_VENDOR_SPECIFIC = 0x0200, |
| 188 | USB_VIDEO_ITT_CAMERA = 0x0201, |
| 189 | USB_VIDEO_ITT_MEDIA_TRANSPORT_INPUT = 0x0202 |
| 190 | }; |
| 191 | |
| 192 | |
| 193 | enum { // Output terminal types |
| 194 | USB_VIDEO_OTT_VENDOR_SPECIFIC = 0x0300, |
| 195 | USB_VIDEO_OTT_DISPLAY = 0x0301, |
| 196 | USB_VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT = 0x0302 |
| 197 | }; |
| 198 | |
| 199 | |
| 200 | enum { // External terminal types |
| 201 | USB_VIDEO_EXTERNAL_VENDOR_SPECIFIC = 0x0400, |
| 202 | USB_VIDEO_COMPOSITE_CONNECTOR = 0x0401, |
| 203 | USB_VIDEO_SVIDEO_CONNECTOR = 0x0402, |
| 204 | USB_VIDEO_COMPONENT_CONNECTOR = 0x0403 |
| 205 | }; |
| 206 | |
| 207 | /*! |
| 208 | Struct status_packet_format includes two common fields and other fields |
| 209 | that depend on the type of the originator field of the first status_type |
| 210 | struct. The orignator bitfield of the status_type struct can have the |
| 211 | following values: 0 = reserved, 1 = VideoControl interface, |
| 212 | 2 = VideoStreaming interface. The second common status_packet_format field |
| 213 | orignator includes ID of the Terminal, Unit or Interface that reports the |
| 214 | interrupt. |
| 215 | If the orginator bitfield value is 1 (VideoControl interface) then third |
| 216 | field of the status_packet_format is event field that includes value 0x00 |
| 217 | for control change. Other values (0x01 - 0xFF) are reserved. |
| 218 | The fourth field selector reports the Control Selector of the control that |
| 219 | have issued the interrupt. |
| 220 | The fifth field attribute specifies the type of control change: 0x00 is |
| 221 | Control value change, 0x01 is Control info change, 0x02 is Control failure |
| 222 | change and values 0x03 - 0xFF are reserved. |
| 223 | After that can be several value fields that can include values 0x00, 0x01 |
| 224 | and 0x02. |
| 225 | If the originator bitfield value is 2 (VideoStreaming interface) then |
| 226 | third field of the status_packet_format is event field that can have |
| 227 | value 0x00 (Button Press) or values 0x01 - 0xFF (Stream errors). |
| 228 | If event value is 0x00 (Button Press) there is only one value field. It |
| 229 | can include values 0x00 (Button released) or 0x01 (Button pressed). If |
| 230 | event value was some Stream error value, then there can be several value |
| 231 | fields. |
| 232 | */ |
| 233 | typedef struct status_packet_format { |
| 234 | struct status_type { |
| 235 | LBITFIELD8_2 ( |
| 236 | originator: 4, |
| 237 | reserved: 4 |
| 238 | ); |
| 239 | } _status_type; |
| 240 | uint8 originator; |
| 241 | union { |
| 242 | struct videocontrol_interface_as_orignator { |
| 243 | uint8 event; |
| 244 | uint8 selector; |
| 245 | uint8 attribute; |
| 246 | uint8* value; |
| 247 | } _videocontrol_interface_as_orignator; |
| 248 | struct videostreaming_interface_as_originator { |
| 249 | uint8 event; |
| 250 | uint8* value; |
| 251 | } _videostreaming_interface_as_originator; |
| 252 | } originators; |
| 253 | } _PACKED usb_video_status_packet_format; |
| 254 | |
| 255 | |
| 256 | typedef struct payload_header_format { |
| 257 | uint8 header_length; |
| 258 | struct header_info { |
| 259 | LBITFIELD8_8 ( |
| 260 | frame_id: 1, |
| 261 | end_of_frame: 1, |
| 262 | presentation_time: 1, |
| 263 | source_clock_reference: 1, |
| 264 | reserved: 1, |
| 265 | still_image: 1, |
| 266 | error: 1, |
| 267 | end_of_header: 1 |
| 268 | ); |
| 269 | } _header_info; |
| 270 | } _PACKED usb_video_payload_header_format; |
| 271 | |
| 272 | |
| 273 | struct payload_header_format_extended_fields { |
| 274 | uint32 presentation_time; |
| 275 | uint8 source_clock[6]; |
| 276 | } _PACKED usb_video_payload_header_format_extended_fields; |
| 277 | |
| 278 | |
| 279 | typedef struct std_video_interface_collection_iad { |
| 280 | uint8 length; // 8 bytes |
| 281 | uint8 descriptor_type; |
| 282 | uint8 first_interface; |
| 283 | uint8 interface_count; |
| 284 | uint8 function_class; |
| 285 | uint8 function_sub_class; |
| 286 | // Not used. Must be set to USB_VIDEO_PC_PROTOCOL_UNDEFINED |
| 287 | uint8 function_protocol; |
| 288 | uint8 function; |
| 289 | } _PACKED usb_video_standard_video_interface_collection_iad; |
| 290 | |
| 291 | |
| 292 | typedef struct std_vc_interface_descriptor { |
| 293 | uint8 length; // 9 bytes |
| 294 | uint8 descriptor_type; |
| 295 | uint8 interface_number; |
| 296 | uint8 alternate_setting; |
| 297 | uint8 num_endpoints; |
| 298 | uint8 interface_class; |
| 299 | uint8 interface_sub_class; |
| 300 | // Not used. Must be set to USB_VIDEO_PC_PROTOCOL_UNDEFINED |
| 301 | uint8 interface_protocol; |
| 302 | uint8 interface; |
| 303 | } _PACKED usb_video_standard_vc_interface_descriptor; |
| 304 | |
| 305 | |
| 306 | typedef struct class_specific_vc_interface_header_descriptor { |
| 307 | uint8 length; // 12 + in_collection bytes |
| 308 | uint8 descriptor_type; |
| 309 | uint8 descriptor_sub_type; |
| 310 | uint16 bcdUVC; |
| 311 | uint16 total_length; |
| 312 | uint32 clock_frequency; |
| 313 | uint8 in_collection; |
| 314 | uint8* interface_nr; |
| 315 | } _PACKED usb_video_vc_interface_header_descriptor; |
| 316 | |
| 317 | |
| 318 | typedef struct input_terminal_descriptor { |
| 319 | uint8 length; // 8 bytes + x |
| 320 | uint8 descriptor_type; |
| 321 | uint8 descriptor_sub_type; |
| 322 | uint8 terminal_id; |
| 323 | uint16 terminal_type; |
| 324 | uint8 assoc_terminal; |
| 325 | union { |
| 326 | uint8 terminal; |
| 327 | struct { |
| 328 | uint8 terminal; |
| 329 | uint8* additional_fields; |
| 330 | } some_terminals; |
| 331 | } terminal; |
| 332 | } _PACKED usb_video_input_terminal_descriptor; |
| 333 | |
| 334 | |
| 335 | typedef struct output_terminal_descriptor { |
| 336 | uint8 length; // 9 bytes + x |
| 337 | uint8 descriptor_type; |
| 338 | uint8 descriptor_sub_type; |
| 339 | uint8 terminal_id; |
| 340 | uint16 terminal_type; |
| 341 | uint8 assoc_terminal; |
| 342 | uint8 source_id; |
| 343 | union { |
| 344 | uint8 terminal; |
| 345 | struct { |
| 346 | uint8 terminal; |
| 347 | uint8* additional_fields; |
| 348 | } some_terminals; |
| 349 | } terminal; |
| 350 | } _PACKED usb_video_output_terminal_descriptor; |
| 351 | |
| 352 | |
| 353 | typedef struct camera_terminal_descriptor { |
| 354 | uint8 length; // 15 + control_size bytes |
| 355 | uint8 descriptor_type; |
| 356 | uint8 descriptor_sub_type; |
| 357 | uint8 terminal_id; |
| 358 | uint16 terminal_type; |
| 359 | uint8 assoc_terminal; |
| 360 | uint8 terminal; |
| 361 | uint16 objective_focal_length_min; |
| 362 | uint16 objective_focal_length_max; |
| 363 | uint16 ocular_focal_length; |
| 364 | uint8 control_size; |
| 365 | #if B_HOST_IS_LENDIAN |
| 366 | struct controls { |
| 367 | struct control_a { |
| 368 | LBITFIELD16 ( |
| 369 | scanning_mode: 1, |
| 370 | auto_exposure_mode: 1, |
| 371 | auto_exposure_priority: 1, |
| 372 | exposure_time_absolute: 1, |
| 373 | exposure_time_relative: 1, |
| 374 | focus_absolute: 1, |
| 375 | focus_relative: 1, |
| 376 | iris_absolute: 1, |
| 377 | iris_relative: 1, |
| 378 | zoom_absolute: 1, |
| 379 | zoom_relative: 1, |
| 380 | pan_tilt_absolute: 1, |
| 381 | pan_tilt_relative: 1, |
| 382 | roll_absolute: 1, |
| 383 | roll_relative: 1, |
| 384 | reserved15: 1 |
| 385 | ); |
| 386 | } _control_a; |
| 387 | struct control_b { |
| 388 | LBITFIELD4 ( |
| 389 | reserved16: 1, |
| 390 | focus_auto: 1, |
| 391 | privacy: 1, |
| 392 | // D19...(control_size*8-1): Reserved, set to zero. |
| 393 | reserved: 13 |
| 394 | ); |
| 395 | } _contorl_b; |
| 396 | } _controls; |
| 397 | #else |
| 398 | struct controls { |
| 399 | struct control_b { |
| 400 | LBITFIELD4 ( |
| 401 | reserved16: 1, |
| 402 | focus_auto: 1, |
| 403 | privacy: 1, |
| 404 | // D19...(control_size*8-1): Reserved, set to zero. |
| 405 | reserved: 13 |
| 406 | ); |
| 407 | } _contorl_b; |
| 408 | struct control_a { |
| 409 | LBITFIELD16 ( |
| 410 | scanning_mode: 1, |
| 411 | auto_exposure_mode: 1, |
| 412 | auto_exposure_priority: 1, |
| 413 | exposure_time_absolute: 1, |
| 414 | exposure_time_relative: 1, |
| 415 | focus_absolute: 1, |
| 416 | focus_relative: 1, |
| 417 | iris_absolute: 1, |
| 418 | iris_relative: 1, |
| 419 | zoom_absolute: 1, |
| 420 | zoom_relative: 1, |
| 421 | pan_tilt_absolute: 1, |
| 422 | pan_tilt_relative: 1, |
| 423 | roll_absolute: 1, |
| 424 | roll_relative: 1, |
| 425 | reserved15: 1 |
| 426 | ); |
| 427 | } _control_a; |
| 428 | } _controls; |
| 429 | #endif |
| 430 | } _PACKED usb_video_camera_terminal_descriptor; |
| 431 | |
| 432 | |
| 433 | typedef struct selector_unit_descriptor { |
| 434 | uint8 length; // 6 bytes + nr_in_pins |
| 435 | uint8 descriptor_type; |
| 436 | uint8 descriptor_sub_type; |
| 437 | uint8 unit_id; |
| 438 | uint8 nr_in_pins; |
| 439 | uint8* source_id; |
| 440 | uint8 selector; |
| 441 | } _PACKED usb_video_selector_unit_descriptor; |
| 442 | |
| 443 | |
| 444 | typedef struct processing_unit_descriptor { |
| 445 | uint8 length; // 10 bytes + control_size |
| 446 | uint8 descriptor_type; |
| 447 | uint8 descriptor_sub_type; |
| 448 | uint8 unit_id; |
| 449 | uint8 source_id; |
| 450 | uint16 max_multiplier; |
| 451 | uint8 control_size; |
| 452 | #if B_HOST_IS_LENDIAN |
| 453 | struct controls { |
| 454 | struct control_a { |
| 455 | LBITFIELD16 ( |
| 456 | brightness: 1, |
| 457 | contrast: 1, |
| 458 | hue: 1, |
| 459 | saturation: 1, |
| 460 | sharpness: 1, |
| 461 | gamma: 1, |
| 462 | white_balance_temperature: 1, |
| 463 | white_balance_component: 1, |
| 464 | backlight_compensation: 1, |
| 465 | gain: 1, |
| 466 | power_line_frequency: 1, |
| 467 | hue_auto: 1, |
| 468 | white_balance_temperature_auto: 1, |
| 469 | white_balance_component_auto: 1, |
| 470 | digital_multiplier: 1, |
| 471 | digital_multiplier_limit: 1 |
| 472 | ); |
| 473 | } _control_a; |
| 474 | struct control_b { |
| 475 | LBITFIELD3 ( |
| 476 | analog_video_standard: 1, |
| 477 | analog_video_lock_status: 1, |
| 478 | reserved: 14 // Reserved. Se to zero. |
| 479 | ); |
| 480 | } _control_b; |
| 481 | } _controls; |
| 482 | #else |
| 483 | struct controls { |
| 484 | struct control_b { |
| 485 | LBITFIELD3 ( |
| 486 | analog_video_standard: 1, |
| 487 | analog_video_lock_status: 1, |
| 488 | reserved: 14 // Reserved. Se to zero. |
| 489 | ); |
| 490 | } _control_b; |
| 491 | struct control_a { |
| 492 | LBITFIELD16 ( |
| 493 | brightness: 1, |
| 494 | contrast: 1, |
| 495 | hue: 1, |
| 496 | saturation: 1, |
| 497 | sharpness: 1, |
| 498 | gamma: 1, |
| 499 | white_balance_temperature: 1, |
| 500 | white_balance_component: 1, |
| 501 | backlight_compensation: 1, |
| 502 | gain: 1, |
| 503 | power_line_frequency: 1, |
| 504 | hue_auto: 1, |
| 505 | white_balance_temperature_auto: 1, |
| 506 | white_balance_component_auto: 1, |
| 507 | digital_multiplier: 1, |
| 508 | digital_multiplier_limit: 1 |
| 509 | ); |
| 510 | } _control_a; |
| 511 | } _controls; |
| 512 | #endif |
| 513 | uint8 processing; |
| 514 | struct video_standards { |
| 515 | LBITFIELD8_8 ( |
| 516 | none: 1, |
| 517 | ntsc_525_60: 1, |
| 518 | pal_625_50: 1, |
| 519 | secam_625_50: 1, |
| 520 | ntsc_625_50: 1, |
| 521 | pal_525_60: 1, |
| 522 | reserved6: 1, // Reserved. Set to zero. |
| 523 | reserved7: 1 // Reserved. Set to zero. |
| 524 | ); |
| 525 | } _video_standards; |
| 526 | } _PACKED usb_video_processing_unit_descriptor; |
| 527 | |
| 528 | |
| 529 | typedef struct extension_unit_descriptor { |
| 530 | uint8 length; // 24 bytes + nr_in_pins + control_size |
| 531 | uint8 descriptor_type; |
| 532 | uint8 descriptor_sub_type; |
| 533 | uint8 unit_id; |
| 534 | uint8 guid_extension_code[16]; |
| 535 | uint8 num_controls; |
| 536 | uint8 nr_in_pins; |
| 537 | uint8* source_id; |
| 538 | uint8 control_size; |
| 539 | struct controls { |
| 540 | LBITFIELD8_8 ( |
| 541 | vendor_specific0 : 1, |
| 542 | vendor_specific1 : 1, |
| 543 | vendor_specific2 : 1, |
| 544 | vendor_specific3 : 1, |
| 545 | vendor_specific4 : 1, |
| 546 | vendor_specific5 : 1, |
| 547 | vendor_specific6 : 1, |
| 548 | vendor_specific7 : 1 |
| 549 | ); |
| 550 | } * _controls; |
| 551 | uint8 extension; |
| 552 | } _PACKED usb_video_extension_unit_descriptor; |
| 553 | |
| 554 | |
| 555 | typedef struct std_vc_interrupt_endpoint_descriptor { |
| 556 | uint8 length; // 7 bytes |
| 557 | uint8 descriptor_type; |
| 558 | struct end_point_address { |
| 559 | LBITFIELD8_3 ( |
| 560 | endpoint_number: 4, // Determined by the designer |
| 561 | reserved: 3, // Reserved. Set to zero. |
| 562 | direction: 1 // 0 = OUT, 1 = IN |
| 563 | ); |
| 564 | } _end_point_address; |
| 565 | struct attributes { |
| 566 | LBITFIELD8_3 ( |
| 567 | transfer_type: 2, // Must be set to 11 (Interrupt) |
| 568 | synchronization_type: 2, // Must be set to 00 (None) |
| 569 | reserved: 4 // Reserved. Must be set to zero |
| 570 | ); |
| 571 | } _attributes; |
| 572 | uint16 max_packet_size; |
| 573 | uint8 interval; |
| 574 | } _PACKED usb_video_vc_interrupt_endpoint_descriptor; |
| 575 | |
| 576 | typedef struct class_specific_vc_interrupt_endpoint_descriptor { |
| 577 | uint8 length; // 5 bytes |
| 578 | uint8 descriptor_type; |
| 579 | uint8 descriptor_sub_type; |
| 580 | uint16 max_transfer_size; |
| 581 | } _PACKED usb_video_class_specific_vc_interrupt_endpoint_descriptor; |
| 582 | |
| 583 | |
| 584 | typedef struct std_vs_interface_descriptor { |
| 585 | uint8 length; // 9 bytes |
| 586 | uint8 descriptor_type; |
| 587 | uint8 interface_number; |
| 588 | uint8 alternate_setting; |
| 589 | uint8 num_endpoints; |
| 590 | uint8 interface_class; |
| 591 | uint8 interface_sub_class; |
| 592 | // Not used. Must be set to USB_VIDEO_PC_PROTOCOL_UNDEFINED |
| 593 | uint8 interface_protocol; |
| 594 | uint8 interface; |
| 595 | } _PACKED usb_video_standard_vs_interface_descriptor; |
| 596 | |
| 597 | |
| 598 | typedef struct class_specific_vs_interface_input_header_descriptor { |
| 599 | uint8 length; // 13 bytes + (num_formats*control_size) |
| 600 | uint8 descriptor_type; |
| 601 | uint8 descriptor_sub_type; |
| 602 | uint8 num_formats; |
| 603 | uint16 total_length; |
| 604 | struct endpoint_address { |
| 605 | LBITFIELD8_3 ( |
| 606 | endpoint_number: 4, // Determined by the designer |
| 607 | reserved: 3, // Set to zero. |
| 608 | direction: 1 // 0 = OUT, 1 = IN |
| 609 | ); |
| 610 | } _endpoint_address; |
| 611 | struct info { |
| 612 | LBITFIELD8_2 ( |
| 613 | dynamic_format_change_support: 1, |
| 614 | reserved: 7 // Set to zero. |
| 615 | ); |
| 616 | } _info; |
| 617 | uint8 terminal_link; |
| 618 | uint8 still_capture_method; |
| 619 | uint8 trigger_support; |
| 620 | uint8 trigger_usage; |
| 621 | uint8 control_size; |
| 622 | struct ma_controls { |
| 623 | // For four first bits, a bit set to 1 indicates that the named field |
| 624 | // is supported by the Video Probe and Commit Control when |
| 625 | // its format_index is 1: |
| 626 | LBITFIELD8_7 ( |
| 627 | key_frame_rate: 1, |
| 628 | p_frame_rate: 1, |
| 629 | comp_quality: 1, |
| 630 | comp_window_size: 1, |
| 631 | // For the next two bits, a bit set to 1 indicates that the named |
| 632 | // control is supported by the device when |
| 633 | // format_index is 1: |
| 634 | generate_key_frame: 1, |
| 635 | update_frame_segment: 1, |
| 636 | reserved: 2 // (control_size*8-1): Set to zero. |
| 637 | ); |
| 638 | } * _ma_controls; |
| 639 | } _PACKED usb_video_class_specific_vs_interface_input_header_descriptor; |
| 640 | |
| 641 | |
| 642 | typedef struct class_specific_vs_interface_output_header_descriptor { |
| 643 | uint8 length; // 9 + (num_formats*control_size) |
| 644 | uint8 descriptor_type; |
| 645 | uint8 descriptor_sub_type; |
| 646 | uint8 num_formats; |
| 647 | uint16 total_length; |
| 648 | struct endpoint_address { |
| 649 | LBITFIELD8_3 ( |
| 650 | endpoint_number: 4, // Determined by the designer |
| 651 | reserved: 3, // Set to zero. |
| 652 | direction: 1 // 0 = OUT |
| 653 | ); |
| 654 | } _endpoint_address; |
| 655 | uint8 terminal_link; |
| 656 | uint8 control_size; |
| 657 | struct ma_controls { |
| 658 | // For four first bits, a bit set to 1 indicates that the named field |
| 659 | // is supported by the Video Probe and Commit Control when its |
| 660 | // format_index is 1: |
| 661 | LBITFIELD8_5 ( |
| 662 | key_frame_rate: 1, |
| 663 | p_frame_rate: 1, |
| 664 | comp_quality: 1, |
| 665 | comp_window_size: 1, |
| 666 | reserved: 4 // (control_size*8-1) Set to zero. |
| 667 | ); |
| 668 | } * _ma_controls; |
| 669 | } _PACKED usb_video_class_specific_vs_interface_output_header_descriptor; |
| 670 | |
| 671 | |
| 672 | typedef struct still_image_frame_descriptor { |
| 673 | // 10 bytes + (4 * num_image_size_patterns) - 4 + num_compression_pattern |
| 674 | uint8 length; |
| 675 | uint8 descriptor_type; |
| 676 | uint8 descriptor_sub_type; |
| 677 | uint8 endpoint_address; |
| 678 | uint8 num_image_size_patterns; |
| 679 | struct pattern_size { |
| 680 | uint16 width; |
| 681 | uint16 height; |
| 682 | } * _pattern_size; |
| 683 | uint8 num_compression_pattern; |
| 684 | uint8* compression; |
| 685 | } _PACKED usb_video_still_image_frame_descriptor; |
| 686 | |
| 687 | |
| 688 | typedef struct color_matching_descriptor { |
| 689 | uint8 length; // 6 bytes |
| 690 | uint8 descriptor_type; |
| 691 | uint8 descriptor_sub_type; |
| 692 | uint8 color_primaries; |
| 693 | uint8 transfer_characteristics; |
| 694 | uint8 matrix_coefficients; |
| 695 | } _PACKED usb_video_color_matching_descriptor; |
| 696 | |
| 697 | |
| 698 | typedef struct std_vs_isochronous_video_data_endpoint_descriptor { |
| 699 | uint8 length; // 7 bytes |
| 700 | uint8 descriptor_type; |
| 701 | struct endpoint_address { |
| 702 | LBITFIELD8_3 ( |
| 703 | endpoint_number: 4, // Determined by the designer |
| 704 | reserved: 3, // Reset to zero. |
| 705 | direction: 1 // 0 = OUT endpoint, 1 = IN endpoint |
| 706 | ); |
| 707 | } _endpoint_address; |
| 708 | struct attributes { |
| 709 | LBITFIELD8_3 ( |
| 710 | transfer_type: 2, // 01 = isochronous |
| 711 | synchronization_type: 2, // 01 = asynchronous |
| 712 | reserved: 4 |
| 713 | ); |
| 714 | } _attributes; |
| 715 | uint16 max_packet_size; |
| 716 | uint8 interval; |
| 717 | } _PACKED usb_video_std_vs_isochronous_video_data_endpoint_descriptor; |
| 718 | |
| 719 | |
| 720 | typedef struct std_vs_bulk_video_data_endpoint_descriptor { |
| 721 | uint8 length; // 7 bytes |
| 722 | uint8 descriptor_type; |
| 723 | struct endpoint_address { |
| 724 | LBITFIELD8_3 ( |
| 725 | endpoint_number: 4, // Determined by the designer |
| 726 | reserved: 3, // Reset to zero. |
| 727 | direction: 1 // 0 = OUT endpoint |
| 728 | ); |
| 729 | } _endpoint_address; |
| 730 | struct attributes { |
| 731 | LBITFIELD8_2 ( |
| 732 | transfer_type: 2, // Set to 10 = Bulk |
| 733 | reserved: 6 |
| 734 | ); |
| 735 | } _attributes; |
| 736 | uint16 max_packet_size; |
| 737 | uint8 interval; |
| 738 | } _PACKED usb_video_standard_vs_bulk_video_data_endpoint_descriptor; |
| 739 | |
| 740 | |
| 741 | typedef struct std_vs_bulk_still_image_data_endpoint_descriptor { |
| 742 | uint8 length; // 7 bytes |
| 743 | struct endpoint_address { |
| 744 | LBITFIELD8_3 ( |
| 745 | endpoint_number: 4, // Determined by the designer |
| 746 | reserved: 3, |
| 747 | direction: 1 // Set to 1 = IN endpoint) |
| 748 | ); |
| 749 | } _endpoint_address; |
| 750 | struct attributes { |
| 751 | LBITFIELD8_2 ( |
| 752 | transfer_type: 2, // Set to 10 = Bulk |
| 753 | reserved: 6 |
| 754 | ); |
| 755 | } _attributes; |
| 756 | uint16 max_packet_size; |
| 757 | uint8 interval; |
| 758 | } _PACKED usb_video_standard_vs_bulk_still_image_data_endpoint_descriptor; |
| 759 | |
| 760 | |
| 761 | typedef struct video_probe_and_commit_controls { |
| 762 | uint8 length; // 34 bytes |
| 763 | struct hint { |
| 764 | LBITFIELD5 ( |
| 765 | frame_interval: 1, |
| 766 | key_frame_rate: 1, |
| 767 | p_frame_rate: 1, |
| 768 | comp_quality: 1, |
| 769 | reserved: 12 |
| 770 | ); |
| 771 | } _hint; |
| 772 | uint8 format_index; |
| 773 | uint8 frame_index; |
| 774 | uint32 frame_interval; |
| 775 | uint16 key_frame_rate; |
| 776 | uint16 p_frame_rate; |
| 777 | uint16 comp_quality; |
| 778 | uint16 comp_window_size; |
| 779 | uint16 delay; |
| 780 | uint32 max_video_frame_size; |
| 781 | uint32 max_payload_transfer_size; |
| 782 | uint32 clock_frequency; |
| 783 | struct framing_info { |
| 784 | LBITFIELD8_3 ( |
| 785 | is_frame_id_required: 1, |
| 786 | is_end_of_frame_present: 1, |
| 787 | reserved: 6 |
| 788 | ); |
| 789 | } _framing_info; |
| 790 | uint8 prefered_version; |
| 791 | uint8 min_version; |
| 792 | uint8 max_version; |
| 793 | } _PACKED usb_video_video_probe_and_commit_controls; |
| 794 | |
| 795 | |
| 796 | typedef struct video_still_probe_control_and_still_commit_control { |
| 797 | uint8 length; // 11 bytes |
| 798 | uint8 frame_index; |
| 799 | uint8 compression_index; |
| 800 | uint32 max_video_frame_size; |
| 801 | uint32 max_payload_transfer_size; |
| 802 | } _PACKED usb_video_video_still_probe_control_and_still_commit_control; |
| 803 | |
| 804 | |
| 805 | #endif // USB_VIDEO_H |