1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 /* 3 * USB Video Class definitions. 4 * 5 * Copyright (C) 2009 Laurent Pinchart <laurent.pinchart@skynet.be> 6 * 7 * This file holds USB constants and structures defined by the USB Device 8 * Class Definition for Video Devices. Unless otherwise stated, comments 9 * below reference relevant sections of the USB Video Class 1.1 specification 10 * available at 11 * 12 * http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip 13 */ 14 15 #ifndef __LINUX_USB_VIDEO_H 16 #define __LINUX_USB_VIDEO_H 17 18 #include <linux/types.h> 19 20 /* -------------------------------------------------------------------------- 21 * UVC constants 22 */ 23 24 /* A.2. Video Interface Subclass Codes */ 25 #define UVC_SC_UNDEFINED 0x00 26 #define UVC_SC_VIDEOCONTROL 0x01 27 #define UVC_SC_VIDEOSTREAMING 0x02 28 #define UVC_SC_VIDEO_INTERFACE_COLLECTION 0x03 29 30 /* A.3. Video Interface Protocol Codes */ 31 #define UVC_PC_PROTOCOL_UNDEFINED 0x00 32 #define UVC_PC_PROTOCOL_15 0x01 33 34 /* A.5. Video Class-Specific VC Interface Descriptor Subtypes */ 35 #define UVC_VC_DESCRIPTOR_UNDEFINED 0x00 36 #define UVC_VC_HEADER 0x01 37 #define UVC_VC_INPUT_TERMINAL 0x02 38 #define UVC_VC_OUTPUT_TERMINAL 0x03 39 #define UVC_VC_SELECTOR_UNIT 0x04 40 #define UVC_VC_PROCESSING_UNIT 0x05 41 #define UVC_VC_EXTENSION_UNIT 0x06 42 43 /* A.6. Video Class-Specific VS Interface Descriptor Subtypes */ 44 #define UVC_VS_UNDEFINED 0x00 45 #define UVC_VS_INPUT_HEADER 0x01 46 #define UVC_VS_OUTPUT_HEADER 0x02 47 #define UVC_VS_STILL_IMAGE_FRAME 0x03 48 #define UVC_VS_FORMAT_UNCOMPRESSED 0x04 49 #define UVC_VS_FRAME_UNCOMPRESSED 0x05 50 #define UVC_VS_FORMAT_MJPEG 0x06 51 #define UVC_VS_FRAME_MJPEG 0x07 52 #define UVC_VS_FORMAT_MPEG2TS 0x0a 53 #define UVC_VS_FORMAT_DV 0x0c 54 #define UVC_VS_COLORFORMAT 0x0d 55 #define UVC_VS_FORMAT_FRAME_BASED 0x10 56 #define UVC_VS_FRAME_FRAME_BASED 0x11 57 #define UVC_VS_FORMAT_STREAM_BASED 0x12 58 59 /* A.7. Video Class-Specific Endpoint Descriptor Subtypes */ 60 #define UVC_EP_UNDEFINED 0x00 61 #define UVC_EP_GENERAL 0x01 62 #define UVC_EP_ENDPOINT 0x02 63 #define UVC_EP_INTERRUPT 0x03 64 65 /* A.8. Video Class-Specific Request Codes */ 66 #define UVC_RC_UNDEFINED 0x00 67 #define UVC_SET_CUR 0x01 68 #define UVC_GET_CUR 0x81 69 #define UVC_GET_MIN 0x82 70 #define UVC_GET_MAX 0x83 71 #define UVC_GET_RES 0x84 72 #define UVC_GET_LEN 0x85 73 #define UVC_GET_INFO 0x86 74 #define UVC_GET_DEF 0x87 75 76 /* A.9.1. VideoControl Interface Control Selectors */ 77 #define UVC_VC_CONTROL_UNDEFINED 0x00 78 #define UVC_VC_VIDEO_POWER_MODE_CONTROL 0x01 79 #define UVC_VC_REQUEST_ERROR_CODE_CONTROL 0x02 80 81 /* A.9.2. Terminal Control Selectors */ 82 #define UVC_TE_CONTROL_UNDEFINED 0x00 83 84 /* A.9.3. Selector Unit Control Selectors */ 85 #define UVC_SU_CONTROL_UNDEFINED 0x00 86 #define UVC_SU_INPUT_SELECT_CONTROL 0x01 87 88 /* A.9.4. Camera Terminal Control Selectors */ 89 #define UVC_CT_CONTROL_UNDEFINED 0x00 90 #define UVC_CT_SCANNING_MODE_CONTROL 0x01 91 #define UVC_CT_AE_MODE_CONTROL 0x02 92 #define UVC_CT_AE_PRIORITY_CONTROL 0x03 93 #define UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 94 #define UVC_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 95 #define UVC_CT_FOCUS_ABSOLUTE_CONTROL 0x06 96 #define UVC_CT_FOCUS_RELATIVE_CONTROL 0x07 97 #define UVC_CT_FOCUS_AUTO_CONTROL 0x08 98 #define UVC_CT_IRIS_ABSOLUTE_CONTROL 0x09 99 #define UVC_CT_IRIS_RELATIVE_CONTROL 0x0a 100 #define UVC_CT_ZOOM_ABSOLUTE_CONTROL 0x0b 101 #define UVC_CT_ZOOM_RELATIVE_CONTROL 0x0c 102 #define UVC_CT_PANTILT_ABSOLUTE_CONTROL 0x0d 103 #define UVC_CT_PANTILT_RELATIVE_CONTROL 0x0e 104 #define UVC_CT_ROLL_ABSOLUTE_CONTROL 0x0f 105 #define UVC_CT_ROLL_RELATIVE_CONTROL 0x10 106 #define UVC_CT_PRIVACY_CONTROL 0x11 107 108 /* A.9.5. Processing Unit Control Selectors */ 109 #define UVC_PU_CONTROL_UNDEFINED 0x00 110 #define UVC_PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 111 #define UVC_PU_BRIGHTNESS_CONTROL 0x02 112 #define UVC_PU_CONTRAST_CONTROL 0x03 113 #define UVC_PU_GAIN_CONTROL 0x04 114 #define UVC_PU_POWER_LINE_FREQUENCY_CONTROL 0x05 115 #define UVC_PU_HUE_CONTROL 0x06 116 #define UVC_PU_SATURATION_CONTROL 0x07 117 #define UVC_PU_SHARPNESS_CONTROL 0x08 118 #define UVC_PU_GAMMA_CONTROL 0x09 119 #define UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a 120 #define UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b 121 #define UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c 122 #define UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d 123 #define UVC_PU_DIGITAL_MULTIPLIER_CONTROL 0x0e 124 #define UVC_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f 125 #define UVC_PU_HUE_AUTO_CONTROL 0x10 126 #define UVC_PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 127 #define UVC_PU_ANALOG_LOCK_STATUS_CONTROL 0x12 128 129 /* A.9.7. VideoStreaming Interface Control Selectors */ 130 #define UVC_VS_CONTROL_UNDEFINED 0x00 131 #define UVC_VS_PROBE_CONTROL 0x01 132 #define UVC_VS_COMMIT_CONTROL 0x02 133 #define UVC_VS_STILL_PROBE_CONTROL 0x03 134 #define UVC_VS_STILL_COMMIT_CONTROL 0x04 135 #define UVC_VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 136 #define UVC_VS_STREAM_ERROR_CODE_CONTROL 0x06 137 #define UVC_VS_GENERATE_KEY_FRAME_CONTROL 0x07 138 #define UVC_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 139 #define UVC_VS_SYNC_DELAY_CONTROL 0x09 140 141 /* B.1. USB Terminal Types */ 142 #define UVC_TT_VENDOR_SPECIFIC 0x0100 143 #define UVC_TT_STREAMING 0x0101 144 145 /* B.2. Input Terminal Types */ 146 #define UVC_ITT_VENDOR_SPECIFIC 0x0200 147 #define UVC_ITT_CAMERA 0x0201 148 #define UVC_ITT_MEDIA_TRANSPORT_INPUT 0x0202 149 150 /* B.3. Output Terminal Types */ 151 #define UVC_OTT_VENDOR_SPECIFIC 0x0300 152 #define UVC_OTT_DISPLAY 0x0301 153 #define UVC_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 154 155 /* B.4. External Terminal Types */ 156 #define UVC_EXTERNAL_VENDOR_SPECIFIC 0x0400 157 #define UVC_COMPOSITE_CONNECTOR 0x0401 158 #define UVC_SVIDEO_CONNECTOR 0x0402 159 #define UVC_COMPONENT_CONNECTOR 0x0403 160 161 /* 2.4.2.2. Status Packet Type */ 162 #define UVC_STATUS_TYPE_CONTROL 1 163 #define UVC_STATUS_TYPE_STREAMING 2 164 165 /* 2.4.3.3. Payload Header Information */ 166 #define UVC_STREAM_EOH (1 << 7) 167 #define UVC_STREAM_ERR (1 << 6) 168 #define UVC_STREAM_STI (1 << 5) 169 #define UVC_STREAM_RES (1 << 4) 170 #define UVC_STREAM_SCR (1 << 3) 171 #define UVC_STREAM_PTS (1 << 2) 172 #define UVC_STREAM_EOF (1 << 1) 173 #define UVC_STREAM_FID (1 << 0) 174 175 /* 4.1.2. Control Capabilities */ 176 #define UVC_CONTROL_CAP_GET (1 << 0) 177 #define UVC_CONTROL_CAP_SET (1 << 1) 178 #define UVC_CONTROL_CAP_DISABLED (1 << 2) 179 #define UVC_CONTROL_CAP_AUTOUPDATE (1 << 3) 180 #define UVC_CONTROL_CAP_ASYNCHRONOUS (1 << 4) 181 182 /* ------------------------------------------------------------------------ 183 * UVC structures 184 */ 185 186 /* All UVC descriptors have these 3 fields at the beginning */ 187 struct uvc_descriptor_header { 188 uint8_t bLength; 189 uint8_t bDescriptorType; 190 uint8_t bDescriptorSubType; 191 } __attribute__((packed)); 192 193 /* 3.7.2. Video Control Interface Header Descriptor */ 194 struct uvc_header_descriptor { 195 uint8_t bLength; 196 uint8_t bDescriptorType; 197 uint8_t bDescriptorSubType; 198 uint16_t bcdUVC; 199 uint16_t wTotalLength; 200 uint32_t dwClockFrequency; 201 uint8_t bInCollection; 202 uint8_t baInterfaceNr[]; 203 } __attribute__((__packed__)); 204 205 #define UVC_DT_HEADER_SIZE(n) (12+(n)) 206 207 #define UVC_HEADER_DESCRIPTOR(n) \ 208 uvc_header_descriptor_##n 209 210 #define DECLARE_UVC_HEADER_DESCRIPTOR(n) \ 211 struct UVC_HEADER_DESCRIPTOR(n) { \ 212 uint8_t bLength; \ 213 uint8_t bDescriptorType; \ 214 uint8_t bDescriptorSubType; \ 215 uint16_t bcdUVC; \ 216 uint16_t wTotalLength; \ 217 uint32_t dwClockFrequency; \ 218 uint8_t bInCollection; \ 219 uint8_t baInterfaceNr[n]; \ 220 } __attribute__ ((packed)) 221 222 /* 3.7.2.1. Input Terminal Descriptor */ 223 struct uvc_input_terminal_descriptor { 224 uint8_t bLength; 225 uint8_t bDescriptorType; 226 uint8_t bDescriptorSubType; 227 uint8_t bTerminalID; 228 uint16_t wTerminalType; 229 uint8_t bAssocTerminal; 230 uint8_t iTerminal; 231 } __attribute__((__packed__)); 232 233 #define UVC_DT_INPUT_TERMINAL_SIZE 8 234 235 /* 3.7.2.2. Output Terminal Descriptor */ 236 struct uvc_output_terminal_descriptor { 237 uint8_t bLength; 238 uint8_t bDescriptorType; 239 uint8_t bDescriptorSubType; 240 uint8_t bTerminalID; 241 uint16_t wTerminalType; 242 uint8_t bAssocTerminal; 243 uint8_t bSourceID; 244 uint8_t iTerminal; 245 } __attribute__((__packed__)); 246 247 #define UVC_DT_OUTPUT_TERMINAL_SIZE 9 248 249 /* 3.7.2.3. Camera Terminal Descriptor */ 250 struct uvc_camera_terminal_descriptor { 251 uint8_t bLength; 252 uint8_t bDescriptorType; 253 uint8_t bDescriptorSubType; 254 uint8_t bTerminalID; 255 uint16_t wTerminalType; 256 uint8_t bAssocTerminal; 257 uint8_t iTerminal; 258 uint16_t wObjectiveFocalLengthMin; 259 uint16_t wObjectiveFocalLengthMax; 260 uint16_t wOcularFocalLength; 261 uint8_t bControlSize; 262 uint8_t bmControls[3]; 263 } __attribute__((__packed__)); 264 265 #define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n)) 266 267 /* 3.7.2.4. Selector Unit Descriptor */ 268 struct uvc_selector_unit_descriptor { 269 uint8_t bLength; 270 uint8_t bDescriptorType; 271 uint8_t bDescriptorSubType; 272 uint8_t bUnitID; 273 uint8_t bNrInPins; 274 uint8_t baSourceID[0]; 275 uint8_t iSelector; 276 } __attribute__((__packed__)); 277 278 #define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n)) 279 280 #define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ 281 uvc_selector_unit_descriptor_##n 282 283 #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ 284 struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \ 285 uint8_t bLength; \ 286 uint8_t bDescriptorType; \ 287 uint8_t bDescriptorSubType; \ 288 uint8_t bUnitID; \ 289 uint8_t bNrInPins; \ 290 uint8_t baSourceID[n]; \ 291 uint8_t iSelector; \ 292 } __attribute__ ((packed)) 293 294 /* 3.7.2.5. Processing Unit Descriptor */ 295 struct uvc_processing_unit_descriptor { 296 uint8_t bLength; 297 uint8_t bDescriptorType; 298 uint8_t bDescriptorSubType; 299 uint8_t bUnitID; 300 uint8_t bSourceID; 301 uint16_t wMaxMultiplier; 302 uint8_t bControlSize; 303 uint8_t bmControls[2]; 304 uint8_t iProcessing; 305 uint8_t bmVideoStandards; 306 } __attribute__((__packed__)); 307 308 #define UVC_DT_PROCESSING_UNIT_SIZE(n) (10+(n)) 309 310 /* 3.7.2.6. Extension Unit Descriptor */ 311 struct uvc_extension_unit_descriptor { 312 uint8_t bLength; 313 uint8_t bDescriptorType; 314 uint8_t bDescriptorSubType; 315 uint8_t bUnitID; 316 uint8_t guidExtensionCode[16]; 317 uint8_t bNumControls; 318 uint8_t bNrInPins; 319 uint8_t baSourceID[0]; 320 uint8_t bControlSize; 321 uint8_t bmControls[0]; 322 uint8_t iExtension; 323 } __attribute__((__packed__)); 324 325 #define UVC_DT_EXTENSION_UNIT_SIZE(p, n) (24+(p)+(n)) 326 327 #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ 328 uvc_extension_unit_descriptor_##p_##n 329 330 #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ 331 struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \ 332 uint8_t bLength; \ 333 uint8_t bDescriptorType; \ 334 uint8_t bDescriptorSubType; \ 335 uint8_t bUnitID; \ 336 uint8_t guidExtensionCode[16]; \ 337 uint8_t bNumControls; \ 338 uint8_t bNrInPins; \ 339 uint8_t baSourceID[p]; \ 340 uint8_t bControlSize; \ 341 uint8_t bmControls[n]; \ 342 uint8_t iExtension; \ 343 } __attribute__ ((packed)) 344 345 /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */ 346 struct uvc_control_endpoint_descriptor { 347 uint8_t bLength; 348 uint8_t bDescriptorType; 349 uint8_t bDescriptorSubType; 350 uint16_t wMaxTransferSize; 351 } __attribute__((__packed__)); 352 353 #define UVC_DT_CONTROL_ENDPOINT_SIZE 5 354 355 /* 3.9.2.1. Input Header Descriptor */ 356 struct uvc_input_header_descriptor { 357 uint8_t bLength; 358 uint8_t bDescriptorType; 359 uint8_t bDescriptorSubType; 360 uint8_t bNumFormats; 361 uint16_t wTotalLength; 362 uint8_t bEndpointAddress; 363 uint8_t bmInfo; 364 uint8_t bTerminalLink; 365 uint8_t bStillCaptureMethod; 366 uint8_t bTriggerSupport; 367 uint8_t bTriggerUsage; 368 uint8_t bControlSize; 369 uint8_t bmaControls[]; 370 } __attribute__((__packed__)); 371 372 #define UVC_DT_INPUT_HEADER_SIZE(n, p) (13+(n*p)) 373 374 #define UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ 375 uvc_input_header_descriptor_##n_##p 376 377 #define DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(n, p) \ 378 struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \ 379 uint8_t bLength; \ 380 uint8_t bDescriptorType; \ 381 uint8_t bDescriptorSubType; \ 382 uint8_t bNumFormats; \ 383 uint16_t wTotalLength; \ 384 uint8_t bEndpointAddress; \ 385 uint8_t bmInfo; \ 386 uint8_t bTerminalLink; \ 387 uint8_t bStillCaptureMethod; \ 388 uint8_t bTriggerSupport; \ 389 uint8_t bTriggerUsage; \ 390 uint8_t bControlSize; \ 391 uint8_t bmaControls[p][n]; \ 392 } __attribute__ ((packed)) 393 394 /* 3.9.2.2. Output Header Descriptor */ 395 struct uvc_output_header_descriptor { 396 uint8_t bLength; 397 uint8_t bDescriptorType; 398 uint8_t bDescriptorSubType; 399 uint8_t bNumFormats; 400 uint16_t wTotalLength; 401 uint8_t bEndpointAddress; 402 uint8_t bTerminalLink; 403 uint8_t bControlSize; 404 uint8_t bmaControls[]; 405 } __attribute__((__packed__)); 406 407 #define UVC_DT_OUTPUT_HEADER_SIZE(n, p) (9+(n*p)) 408 409 #define UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ 410 uvc_output_header_descriptor_##n_##p 411 412 #define DECLARE_UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) \ 413 struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \ 414 uint8_t bLength; \ 415 uint8_t bDescriptorType; \ 416 uint8_t bDescriptorSubType; \ 417 uint8_t bNumFormats; \ 418 uint16_t wTotalLength; \ 419 uint8_t bEndpointAddress; \ 420 uint8_t bTerminalLink; \ 421 uint8_t bControlSize; \ 422 uint8_t bmaControls[p][n]; \ 423 } __attribute__ ((packed)) 424 425 /* 3.9.2.6. Color matching descriptor */ 426 struct uvc_color_matching_descriptor { 427 uint8_t bLength; 428 uint8_t bDescriptorType; 429 uint8_t bDescriptorSubType; 430 uint8_t bColorPrimaries; 431 uint8_t bTransferCharacteristics; 432 uint8_t bMatrixCoefficients; 433 } __attribute__((__packed__)); 434 435 #define UVC_DT_COLOR_MATCHING_SIZE 6 436 437 /* 4.3.1.1. Video Probe and Commit Controls */ 438 struct uvc_streaming_control { 439 uint16_t bmHint; 440 uint8_t bFormatIndex; 441 uint8_t bFrameIndex; 442 uint32_t dwFrameInterval; 443 uint16_t wKeyFrameRate; 444 uint16_t wPFrameRate; 445 uint16_t wCompQuality; 446 uint16_t wCompWindowSize; 447 uint16_t wDelay; 448 uint32_t dwMaxVideoFrameSize; 449 uint32_t dwMaxPayloadTransferSize; 450 uint32_t dwClockFrequency; 451 uint8_t bmFramingInfo; 452 uint8_t bPreferedVersion; 453 uint8_t bMinVersion; 454 uint8_t bMaxVersion; 455 } __attribute__((__packed__)); 456 457 /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */ 458 struct uvc_format_uncompressed { 459 uint8_t bLength; 460 uint8_t bDescriptorType; 461 uint8_t bDescriptorSubType; 462 uint8_t bFormatIndex; 463 uint8_t bNumFrameDescriptors; 464 uint8_t guidFormat[16]; 465 uint8_t bBitsPerPixel; 466 uint8_t bDefaultFrameIndex; 467 uint8_t bAspectRatioX; 468 uint8_t bAspectRatioY; 469 uint8_t bmInterfaceFlags; 470 uint8_t bCopyProtect; 471 } __attribute__((__packed__)); 472 473 #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27 474 475 /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */ 476 struct uvc_frame_uncompressed { 477 uint8_t bLength; 478 uint8_t bDescriptorType; 479 uint8_t bDescriptorSubType; 480 uint8_t bFrameIndex; 481 uint8_t bmCapabilities; 482 uint16_t wWidth; 483 uint16_t wHeight; 484 uint32_t dwMinBitRate; 485 uint32_t dwMaxBitRate; 486 uint32_t dwMaxVideoFrameBufferSize; 487 uint32_t dwDefaultFrameInterval; 488 uint8_t bFrameIntervalType; 489 uint32_t dwFrameInterval[]; 490 } __attribute__((__packed__)); 491 492 #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n)) 493 494 #define UVC_FRAME_UNCOMPRESSED(n) \ 495 uvc_frame_uncompressed_##n 496 497 #define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \ 498 struct UVC_FRAME_UNCOMPRESSED(n) { \ 499 uint8_t bLength; \ 500 uint8_t bDescriptorType; \ 501 uint8_t bDescriptorSubType; \ 502 uint8_t bFrameIndex; \ 503 uint8_t bmCapabilities; \ 504 uint16_t wWidth; \ 505 uint16_t wHeight; \ 506 uint32_t dwMinBitRate; \ 507 uint32_t dwMaxBitRate; \ 508 uint32_t dwMaxVideoFrameBufferSize; \ 509 uint32_t dwDefaultFrameInterval; \ 510 uint8_t bFrameIntervalType; \ 511 uint32_t dwFrameInterval[n]; \ 512 } __attribute__ ((packed)) 513 514 /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */ 515 struct uvc_format_mjpeg { 516 uint8_t bLength; 517 uint8_t bDescriptorType; 518 uint8_t bDescriptorSubType; 519 uint8_t bFormatIndex; 520 uint8_t bNumFrameDescriptors; 521 uint8_t bmFlags; 522 uint8_t bDefaultFrameIndex; 523 uint8_t bAspectRatioX; 524 uint8_t bAspectRatioY; 525 uint8_t bmInterfaceFlags; 526 uint8_t bCopyProtect; 527 } __attribute__((__packed__)); 528 529 #define UVC_DT_FORMAT_MJPEG_SIZE 11 530 531 /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */ 532 struct uvc_frame_mjpeg { 533 uint8_t bLength; 534 uint8_t bDescriptorType; 535 uint8_t bDescriptorSubType; 536 uint8_t bFrameIndex; 537 uint8_t bmCapabilities; 538 uint16_t wWidth; 539 uint16_t wHeight; 540 uint32_t dwMinBitRate; 541 uint32_t dwMaxBitRate; 542 uint32_t dwMaxVideoFrameBufferSize; 543 uint32_t dwDefaultFrameInterval; 544 uint8_t bFrameIntervalType; 545 uint32_t dwFrameInterval[]; 546 } __attribute__((__packed__)); 547 548 #define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n)) 549 550 #define UVC_FRAME_MJPEG(n) \ 551 uvc_frame_mjpeg_##n 552 553 #define DECLARE_UVC_FRAME_MJPEG(n) \ 554 struct UVC_FRAME_MJPEG(n) { \ 555 uint8_t bLength; \ 556 uint8_t bDescriptorType; \ 557 uint8_t bDescriptorSubType; \ 558 uint8_t bFrameIndex; \ 559 uint8_t bmCapabilities; \ 560 uint16_t wWidth; \ 561 uint16_t wHeight; \ 562 uint32_t dwMinBitRate; \ 563 uint32_t dwMaxBitRate; \ 564 uint32_t dwMaxVideoFrameBufferSize; \ 565 uint32_t dwDefaultFrameInterval; \ 566 uint8_t bFrameIntervalType; \ 567 uint32_t dwFrameInterval[n]; \ 568 } __attribute__ ((packed)) 569 570 #endif /* __LINUX_USB_VIDEO_H */ 571 572