1b711ef9cSBaptiste Daroussin /* $OpenBSD: uvideo.h,v 1.71 2025/09/06 13:45:41 kirill Exp $ */ 2b711ef9cSBaptiste Daroussin 3b711ef9cSBaptiste Daroussin /* 4b711ef9cSBaptiste Daroussin * Copyright (c) 2007 Robert Nagy <robert@openbsd.org> 5b711ef9cSBaptiste Daroussin * Copyright (c) 2008 Marcus Glocker <mglocker@openbsd.org> 6b711ef9cSBaptiste Daroussin * 7b711ef9cSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 8b711ef9cSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 9b711ef9cSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 10b711ef9cSBaptiste Daroussin * 11b711ef9cSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12b711ef9cSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13b711ef9cSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14b711ef9cSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15b711ef9cSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16b711ef9cSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17b711ef9cSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18b711ef9cSBaptiste Daroussin */ 19b711ef9cSBaptiste Daroussin 20b711ef9cSBaptiste Daroussin #ifndef _UVIDEO_H_ 21b711ef9cSBaptiste Daroussin #define _UVIDEO_H_ 22b711ef9cSBaptiste Daroussin 23b711ef9cSBaptiste Daroussin #include <sys/queue.h> 24b711ef9cSBaptiste Daroussin #include "uvideo_v4l2.h" 25b711ef9cSBaptiste Daroussin 26b711ef9cSBaptiste Daroussin /* 27b711ef9cSBaptiste Daroussin * USB Video Class 28b711ef9cSBaptiste Daroussin */ 29b711ef9cSBaptiste Daroussin /* Table A-7: Video Class-Specific Endpoint Descriptor Subtypes */ 30b711ef9cSBaptiste Daroussin #define EP_UNDEFINED 0x00 31b711ef9cSBaptiste Daroussin #define EP_GENERAL 0x01 32b711ef9cSBaptiste Daroussin #define EP_ENDPOINT 0x02 33b711ef9cSBaptiste Daroussin #define EP_INTERRUPT 0x03 34b711ef9cSBaptiste Daroussin 35b711ef9cSBaptiste Daroussin /* Table A-5: Video Class-Specific VC Interface Descriptor Subtypes */ 36b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_DESCRIPTOR_UNDEFINED 0x00 37b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_HEADER 0x01 38b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_INPUT_TERMINAL 0x02 39b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_OUTPUT_TERMINAL 0x03 40b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_SELECTOR_UNIT 0x04 41b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_PROCESSING_UNIT 0x05 42b711ef9cSBaptiste Daroussin #define UDESCSUB_VC_EXTENSION_UNIT 0x06 43b711ef9cSBaptiste Daroussin 44b711ef9cSBaptiste Daroussin /* Table A-6: Video Class-Specific VS Interface Descriptor Subtypes */ 45b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_UNDEFINED 0x00 46b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_INPUT_HEADER 0x01 47b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_OUTPUT_HEADER 0x02 48b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_STILL_IMAGE_FRAME 0x03 49b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_UNCOMPRESSED 0x04 50b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_UNCOMPRESSED 0x05 51b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_MJPEG 0x06 52b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_MJPEG 0x07 53b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_MPEG2TS 0x0a 54b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_DV 0x0c 55b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_COLORFORMAT 0x0d 56b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_FRAME_BASED 0x10 57b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_FRAME_BASED 0x11 58b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_STREAM_BASED 0x12 59b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_H264 0x13 60b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FRAME_H264 0x14 61b711ef9cSBaptiste Daroussin #define UDESCSUB_VS_FORMAT_H264_SIMULCAST 0x15 62b711ef9cSBaptiste Daroussin 63b711ef9cSBaptiste Daroussin /* Table A-8: Video Class-Specific Request Codes */ 64b711ef9cSBaptiste Daroussin #define RC_UNDEFINED 0x00 65b711ef9cSBaptiste Daroussin #define SET_CUR 0x01 66b711ef9cSBaptiste Daroussin #define GET_CUR 0x81 67b711ef9cSBaptiste Daroussin #define GET_MIN 0x82 68b711ef9cSBaptiste Daroussin #define GET_MAX 0x83 69b711ef9cSBaptiste Daroussin #define GET_RES 0x84 70b711ef9cSBaptiste Daroussin #define GET_LEN 0x85 71b711ef9cSBaptiste Daroussin #define GET_INFO 0x86 72b711ef9cSBaptiste Daroussin #define GET_DEF 0x87 73b711ef9cSBaptiste Daroussin 74b711ef9cSBaptiste Daroussin /* Table A-9: Video Control Interface Control Selectors */ 75b711ef9cSBaptiste Daroussin #define VC_CONTROL_UNDEFINED 0x00 76b711ef9cSBaptiste Daroussin #define VC_VIDEO_POWER_MODE_CONTROL 0x01 77b711ef9cSBaptiste Daroussin #define VC_REQUEST_ERROR_CODE_CONTROL 0x02 78b711ef9cSBaptiste Daroussin 79b711ef9cSBaptiste Daroussin /* Table A-11: Selector Unit Control Selectors */ 80b711ef9cSBaptiste Daroussin #define SU_CONTROL_UNDEFINED 0x00 81b711ef9cSBaptiste Daroussin #define SU_INPUT_SELECT_CONTROL 0x01 82b711ef9cSBaptiste Daroussin 83b711ef9cSBaptiste Daroussin /* Table A-12: Camera Terminal Control Selectors */ 84b711ef9cSBaptiste Daroussin #define CT_CONTROL_UNDEFINED 0x00 85b711ef9cSBaptiste Daroussin #define CT_SCANNING_MODE_CONTROL 0x01 86b711ef9cSBaptiste Daroussin #define CT_AE_MODE_CONTROL 0x02 87b711ef9cSBaptiste Daroussin #define CT_AE_PRIORITY_CONTROL 0x03 88b711ef9cSBaptiste Daroussin #define CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04 89b711ef9cSBaptiste Daroussin #define CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05 90b711ef9cSBaptiste Daroussin #define CT_FOCUS_ABSOLUTE_CONTROL 0x06 91b711ef9cSBaptiste Daroussin #define CT_FOCUS_RELATIVE_CONTROL 0x07 92b711ef9cSBaptiste Daroussin #define CT_FOCUS_AUTO_CONTROL 0x08 93b711ef9cSBaptiste Daroussin #define CT_IRIS_ABSOLUTE_CONTROL 0x09 94b711ef9cSBaptiste Daroussin #define CT_IRIS_RELATIVE_CONTROL 0x0a 95b711ef9cSBaptiste Daroussin #define CT_ZOOM_ABSOLUTE_CONTROL 0x0b 96b711ef9cSBaptiste Daroussin #define CT_ZOOM_RELATIVE_CONTROL 0x0c 97b711ef9cSBaptiste Daroussin #define CT_PANTILT_ABSOLUTE_CONTROL 0x0d 98b711ef9cSBaptiste Daroussin #define CT_PANTILT_RELATIVE_CONTROL 0x0e 99b711ef9cSBaptiste Daroussin #define CT_ROLL_ABSOLUTE_CONTROL 0x0f 100b711ef9cSBaptiste Daroussin #define CT_ROLL_RELATIVE_CONTROL 0x10 101b711ef9cSBaptiste Daroussin #define CT_PRIVACY_CONTROL 0x11 102b711ef9cSBaptiste Daroussin 103b711ef9cSBaptiste Daroussin /* Table A-13: Processing Unit Control Selectors */ 104b711ef9cSBaptiste Daroussin #define PU_CONTROL_UNDEFINED 0x00 105b711ef9cSBaptiste Daroussin #define PU_BACKLIGHT_COMPENSATION_CONTROL 0x01 106b711ef9cSBaptiste Daroussin #define PU_BRIGHTNESS_CONTROL 0x02 107b711ef9cSBaptiste Daroussin #define PU_CONTRAST_CONTROL 0x03 108b711ef9cSBaptiste Daroussin #define PU_GAIN_CONTROL 0x04 109b711ef9cSBaptiste Daroussin #define PU_POWER_LINE_FREQUENCY_CONTROL 0x05 110b711ef9cSBaptiste Daroussin #define PU_HUE_CONTROL 0x06 111b711ef9cSBaptiste Daroussin #define PU_SATURATION_CONTROL 0x07 112b711ef9cSBaptiste Daroussin #define PU_SHARPNESS_CONTROL 0x08 113b711ef9cSBaptiste Daroussin #define PU_GAMMA_CONTROL 0x09 114b711ef9cSBaptiste Daroussin #define PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x0a 115b711ef9cSBaptiste Daroussin #define PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0b 116b711ef9cSBaptiste Daroussin #define PU_WHITE_BALANCE_COMPONENT_CONTROL 0x0c 117b711ef9cSBaptiste Daroussin #define PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL 0x0d 118b711ef9cSBaptiste Daroussin #define PU_DIGITAL_MULTIPLIER_CONTROL 0x0e 119b711ef9cSBaptiste Daroussin #define PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL 0x0f 120b711ef9cSBaptiste Daroussin #define PU_HUE_AUTO_CONTROL 0x10 121b711ef9cSBaptiste Daroussin #define PU_ANALOG_VIDEO_STANDARD_CONTROL 0x11 122b711ef9cSBaptiste Daroussin #define PU_ANALOG_LOCK_STATUS_CONTROL 0x12 123b711ef9cSBaptiste Daroussin 124b711ef9cSBaptiste Daroussin /* Table A-15: VideoStreaming Interface Control Selectors */ 125b711ef9cSBaptiste Daroussin #define VS_CONTROL_UNDEFINED 0x00 126b711ef9cSBaptiste Daroussin #define VS_PROBE_CONTROL 0x01 127b711ef9cSBaptiste Daroussin #define VS_COMMIT_CONTROL 0x02 128b711ef9cSBaptiste Daroussin #define VS_STILL_PROBE_CONTROL 0x03 129b711ef9cSBaptiste Daroussin #define VS_STILL_COMMIT_CONTROL 0x04 130b711ef9cSBaptiste Daroussin #define VS_STILL_IMAGE_TRIGGER_CONTROL 0x05 131b711ef9cSBaptiste Daroussin #define VS_STREAM_ERROR_CODE_CONTROL 0x06 132b711ef9cSBaptiste Daroussin #define VS_GENERATE_KEY_FRAME_CONTROL 0x07 133b711ef9cSBaptiste Daroussin #define VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08 134b711ef9cSBaptiste Daroussin #define VS_SYNC_DELAY_CONTROL 0x09 135b711ef9cSBaptiste Daroussin 136b711ef9cSBaptiste Daroussin /* probe commit bmRequests */ 137b711ef9cSBaptiste Daroussin #define UVIDEO_SET_IF 0x21 138b711ef9cSBaptiste Daroussin #define UVIDEO_GET_IF 0xa1 139b711ef9cSBaptiste Daroussin #define UVIDEO_SET_EP 0x22 140b711ef9cSBaptiste Daroussin #define UVIDEO_GET_EP 0xa2 141b711ef9cSBaptiste Daroussin 142b711ef9cSBaptiste Daroussin /* Table B-1: USB Terminal Types */ 143b711ef9cSBaptiste Daroussin #define TT_VENDOR_SPECIFIC 0x0100 144b711ef9cSBaptiste Daroussin #define TT_STREAMING 0x0101 145b711ef9cSBaptiste Daroussin 146b711ef9cSBaptiste Daroussin /* Table B-2: Input Terminal Types */ 147b711ef9cSBaptiste Daroussin #define ITT_VENDOR_SPECIFIC 0x0200 148b711ef9cSBaptiste Daroussin #define ITT_CAMERA 0x0201 149b711ef9cSBaptiste Daroussin #define ITT_MEDIA_TRANSPORT_INPUT 0x0202 150b711ef9cSBaptiste Daroussin 151b711ef9cSBaptiste Daroussin /* Table B-3: Output Terminal Types */ 152b711ef9cSBaptiste Daroussin #define OTT_VENDOR_SPECIFIC 0x0300 153b711ef9cSBaptiste Daroussin #define OTT_DISPLAY 0x0301 154b711ef9cSBaptiste Daroussin #define OTT_MEDIA_TRANSPORT_OUTPUT 0x0302 155b711ef9cSBaptiste Daroussin 156b711ef9cSBaptiste Daroussin /* Table B-4: External Terminal Types */ 157b711ef9cSBaptiste Daroussin #define EXTERNAL_VENDOR_SPECIFIC 0x0400 158b711ef9cSBaptiste Daroussin #define COMPOSITE_CONNECTOR 0x0401 159b711ef9cSBaptiste Daroussin #define SVIDEO_CONNECTOR 0x0402 160b711ef9cSBaptiste Daroussin #define COMPONENT_CONNECTOR 0x0403 161b711ef9cSBaptiste Daroussin 162b711ef9cSBaptiste Daroussin /* Table 3-3: VC Interface Header Descriptor */ 163b711ef9cSBaptiste Daroussin struct usb_video_header_desc { 164b711ef9cSBaptiste Daroussin uByte bLength; 165b711ef9cSBaptiste Daroussin uByte bDescriptorType; 166b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 167b711ef9cSBaptiste Daroussin uWord bcdUVC; 168b711ef9cSBaptiste Daroussin uWord wTotalLength; 169b711ef9cSBaptiste Daroussin uDWord dwClockFrequency; 170b711ef9cSBaptiste Daroussin uByte bInCollection; 171b711ef9cSBaptiste Daroussin } __packed; 172b711ef9cSBaptiste Daroussin 173b711ef9cSBaptiste Daroussin struct usb_video_header_desc_all { 174b711ef9cSBaptiste Daroussin struct usb_video_header_desc *fix; 175b711ef9cSBaptiste Daroussin uByte *baInterfaceNr; 176b711ef9cSBaptiste Daroussin }; 177b711ef9cSBaptiste Daroussin 178b711ef9cSBaptiste Daroussin /* Table 3-4: Input Terminal Descriptor */ 179b711ef9cSBaptiste Daroussin struct usb_video_input_terminal_desc { 180b711ef9cSBaptiste Daroussin uByte bLength; 181b711ef9cSBaptiste Daroussin uByte bDescriptorType; 182b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 183b711ef9cSBaptiste Daroussin uByte bTerminalID; 184b711ef9cSBaptiste Daroussin uWord wTerminalType; 185b711ef9cSBaptiste Daroussin uByte bAssocTerminal; 186b711ef9cSBaptiste Daroussin uByte iTerminal; 187b711ef9cSBaptiste Daroussin } __packed; 188b711ef9cSBaptiste Daroussin 189b711ef9cSBaptiste Daroussin /* Table 3-5: Output Terminal Descriptor */ 190b711ef9cSBaptiste Daroussin struct usb_video_output_terminal_desc { 191b711ef9cSBaptiste Daroussin uByte bLength; 192b711ef9cSBaptiste Daroussin uByte bDescriptorType; 193b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 194b711ef9cSBaptiste Daroussin uByte bTerminalID; 195b711ef9cSBaptiste Daroussin uWord wTerminalType; 196b711ef9cSBaptiste Daroussin uByte bAssocTerminal; 197b711ef9cSBaptiste Daroussin uByte bSourceID; 198b711ef9cSBaptiste Daroussin uByte iTerminal; 199b711ef9cSBaptiste Daroussin } __packed; 200b711ef9cSBaptiste Daroussin 201b711ef9cSBaptiste Daroussin /* Table 3-6: Camera Terminal Descriptor */ 202b711ef9cSBaptiste Daroussin struct usb_video_camera_terminal_desc { 203b711ef9cSBaptiste Daroussin uByte bLength; 204b711ef9cSBaptiste Daroussin uByte bDescriptorType; 205b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 206b711ef9cSBaptiste Daroussin uByte bTerminalID; 207b711ef9cSBaptiste Daroussin uWord wTerminalType; 208b711ef9cSBaptiste Daroussin uByte bAssocTerminal; 209b711ef9cSBaptiste Daroussin uByte iTerminal; 210b711ef9cSBaptiste Daroussin uWord wObjectiveFocalLengthMin; 211b711ef9cSBaptiste Daroussin uWord wObjectiveFocalLengthMax; 212b711ef9cSBaptiste Daroussin uWord wOcularFocalLength; 213b711ef9cSBaptiste Daroussin uByte bControlSize; 214d0450cbeSBaptiste Daroussin uByte bmControls[255]; /* [bControlSize] */ 215b711ef9cSBaptiste Daroussin } __packed; 216b711ef9cSBaptiste Daroussin 217b711ef9cSBaptiste Daroussin /* Table 3-8: VC Processing Unit Descriptor */ 218b711ef9cSBaptiste Daroussin struct usb_video_vc_processing_desc { 219b711ef9cSBaptiste Daroussin uByte bLength; 220b711ef9cSBaptiste Daroussin uByte bDescriptorType; 221b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 222b711ef9cSBaptiste Daroussin uByte bUnitID; 223b711ef9cSBaptiste Daroussin uByte bSourceID; 224b711ef9cSBaptiste Daroussin uWord wMaxMultiplier; 225b711ef9cSBaptiste Daroussin uByte bControlSize; 226b711ef9cSBaptiste Daroussin uByte bmControls[255]; /* [bControlSize] */ 227b711ef9cSBaptiste Daroussin /* uByte iProcessing; */ 228b711ef9cSBaptiste Daroussin /* uByte bmVideoStandards; */ 229b711ef9cSBaptiste Daroussin } __packed; 230b711ef9cSBaptiste Daroussin 231b711ef9cSBaptiste Daroussin /* Table 3-9: VC Extension Unit Descriptor */ 232b711ef9cSBaptiste Daroussin struct usb_video_vc_extension_desc { 233b711ef9cSBaptiste Daroussin uByte bLength; 234b711ef9cSBaptiste Daroussin uByte bDescriptorType; 235b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 236b711ef9cSBaptiste Daroussin uByte bUnitID; 237b711ef9cSBaptiste Daroussin uByte guidExtensionCode[16]; 238b711ef9cSBaptiste Daroussin uByte bNumControls; 239b711ef9cSBaptiste Daroussin uByte bNrInPins; 240b711ef9cSBaptiste Daroussin } __packed; 241b711ef9cSBaptiste Daroussin 242b711ef9cSBaptiste Daroussin /* Table 3-11: VC Endpoint Descriptor */ 243b711ef9cSBaptiste Daroussin struct usb_video_vc_endpoint_desc { 244b711ef9cSBaptiste Daroussin uByte bLength; 245b711ef9cSBaptiste Daroussin uByte bDescriptorType; 246b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 247b711ef9cSBaptiste Daroussin uWord wMaxTransferSize; 248b711ef9cSBaptiste Daroussin } __packed; 249b711ef9cSBaptiste Daroussin 250b711ef9cSBaptiste Daroussin /* Table 3-13: Interface Input Header Descriptor */ 251b711ef9cSBaptiste Daroussin struct usb_video_input_header_desc { 252b711ef9cSBaptiste Daroussin uByte bLength; 253b711ef9cSBaptiste Daroussin uByte bDescriptorType; 254b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 255b711ef9cSBaptiste Daroussin uByte bNumFormats; 256b711ef9cSBaptiste Daroussin uWord wTotalLength; 257b711ef9cSBaptiste Daroussin uByte bEndpointAddress; 258b711ef9cSBaptiste Daroussin uByte bmInfo; 259b711ef9cSBaptiste Daroussin uByte bTerminalLink; 260b711ef9cSBaptiste Daroussin uByte bStillCaptureMethod; 261b711ef9cSBaptiste Daroussin uByte bTriggerSupport; 262b711ef9cSBaptiste Daroussin uByte bTriggerUsage; 263b711ef9cSBaptiste Daroussin uByte bControlSize; 264b711ef9cSBaptiste Daroussin } __packed; 265b711ef9cSBaptiste Daroussin 266b711ef9cSBaptiste Daroussin struct usb_video_input_header_desc_all { 267b711ef9cSBaptiste Daroussin struct usb_video_input_header_desc *fix; 268b711ef9cSBaptiste Daroussin uByte *bmaControls; 269b711ef9cSBaptiste Daroussin }; 270b711ef9cSBaptiste Daroussin 271b711ef9cSBaptiste Daroussin /* Table 3-18: Color Matching Descriptor */ 272b711ef9cSBaptiste Daroussin struct usb_video_color_matching_descr { 273b711ef9cSBaptiste Daroussin uByte bLength; 274b711ef9cSBaptiste Daroussin uByte bDescriptorType; 275b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 276b711ef9cSBaptiste Daroussin uByte bColorPrimaries; 277b711ef9cSBaptiste Daroussin uByte bTransferCharacteristics; 278b711ef9cSBaptiste Daroussin uByte bMatrixCoefficients; 279b711ef9cSBaptiste Daroussin } __packed; 280b711ef9cSBaptiste Daroussin 281b711ef9cSBaptiste Daroussin /* Table 4-75: Video Probe and Commit Controls */ 282b711ef9cSBaptiste Daroussin struct usb_video_probe_commit { 283b711ef9cSBaptiste Daroussin uWord bmHint; 284b711ef9cSBaptiste Daroussin uByte bFormatIndex; 285b711ef9cSBaptiste Daroussin uByte bFrameIndex; 286b711ef9cSBaptiste Daroussin uDWord dwFrameInterval; 287b711ef9cSBaptiste Daroussin uWord wKeyFrameRate; 288b711ef9cSBaptiste Daroussin uWord wPFrameRate; 289b711ef9cSBaptiste Daroussin uWord wCompQuality; 290b711ef9cSBaptiste Daroussin uWord wCompWindowSize; 291b711ef9cSBaptiste Daroussin uWord wDelay; 292b711ef9cSBaptiste Daroussin uDWord dwMaxVideoFrameSize; 293b711ef9cSBaptiste Daroussin uDWord dwMaxPayloadTransferSize; 294b711ef9cSBaptiste Daroussin uDWord dwClockFrequency; 295b711ef9cSBaptiste Daroussin uByte bmFramingInfo; 296b711ef9cSBaptiste Daroussin uByte bPreferedVersion; 297b711ef9cSBaptiste Daroussin uByte bMinVersion; 298b711ef9cSBaptiste Daroussin uByte bMaxVersion; 299b711ef9cSBaptiste Daroussin uByte bUsage; 300b711ef9cSBaptiste Daroussin uByte bBitDepthLuma; 301b711ef9cSBaptiste Daroussin uByte bmSettings; 302b711ef9cSBaptiste Daroussin uByte bMaxNumberOfRefFramesPlus1; 303b711ef9cSBaptiste Daroussin uWord bmRateControlModes; 304b711ef9cSBaptiste Daroussin uByte bmLayoutPerStream[8]; 305b711ef9cSBaptiste Daroussin } __packed; 306b711ef9cSBaptiste Daroussin 307b711ef9cSBaptiste Daroussin /* 308b711ef9cSBaptiste Daroussin * USB Video Payload Uncompressed 309b711ef9cSBaptiste Daroussin */ 310b711ef9cSBaptiste Daroussin /* Table 2-1: Compression Formats */ 311b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_YUY2 { \ 312b711ef9cSBaptiste Daroussin 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, \ 313b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 314b711ef9cSBaptiste Daroussin 3158bc06ffbSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_NV12 { \ 3168bc06ffbSBaptiste Daroussin 'N', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ 3178bc06ffbSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3188bc06ffbSBaptiste Daroussin 3198bc06ffbSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_NV21 { \ 3208bc06ffbSBaptiste Daroussin 'N', 'V', '2', '1', 0x00, 0x00, 0x10, 0x00, \ 3218bc06ffbSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3228bc06ffbSBaptiste Daroussin 323b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_YV12 { \ 324b711ef9cSBaptiste Daroussin 'Y', 'V', '1', '2', 0x00, 0x00, 0x10, 0x00, \ 325b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 326b711ef9cSBaptiste Daroussin 327b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_I420 { \ 328b711ef9cSBaptiste Daroussin 'I', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ 329b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 330b711ef9cSBaptiste Daroussin 3318bc06ffbSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_M420 { \ 3328bc06ffbSBaptiste Daroussin 'M', '4', '2', '0', 0x00, 0x00, 0x10, 0x00, \ 3338bc06ffbSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3348bc06ffbSBaptiste Daroussin 3358bc06ffbSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_UYVY { \ 3368bc06ffbSBaptiste Daroussin 'U', 'Y', 'V', 'Y', 0x00, 0x00, 0x10, 0x00, \ 3378bc06ffbSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3388bc06ffbSBaptiste Daroussin 339b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_Y800 { \ 340b711ef9cSBaptiste Daroussin 'Y', '8', '0', '0', 0x00, 0x00, 0x10, 0x00, \ 341b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 342b711ef9cSBaptiste Daroussin 343b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_Y8 { \ 344b711ef9cSBaptiste Daroussin 'Y', '8', ' ', ' ', 0x00, 0x00, 0x10, 0x00, \ 345b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 346b711ef9cSBaptiste Daroussin 347b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_D3DFMT_L8 { \ 348b711ef9cSBaptiste Daroussin 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, \ 349b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 350b711ef9cSBaptiste Daroussin 351b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_KSMEDIA_L8_IR { \ 352b711ef9cSBaptiste Daroussin 0x32, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, \ 353b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 354b711ef9cSBaptiste Daroussin 3558bc06ffbSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_Y12 { \ 3568bc06ffbSBaptiste Daroussin 'Y', '1', '2', ' ', 0x00, 0x00, 0x10, 0x00, \ 3578bc06ffbSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3588bc06ffbSBaptiste Daroussin 3598bc06ffbSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_Y16 { \ 3608bc06ffbSBaptiste Daroussin 'Y', '1', '6', ' ', 0x00, 0x00, 0x10, 0x00, \ 3618bc06ffbSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 3628bc06ffbSBaptiste Daroussin 363b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_BY8 { \ 364b711ef9cSBaptiste Daroussin 'B', 'Y', '8', ' ', 0x00, 0x00, 0x10, 0x00, \ 365b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 366b711ef9cSBaptiste Daroussin 367b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_BA81 { \ 368b711ef9cSBaptiste Daroussin 'B', 'A', '8', '1', 0x00, 0x00, 0x10, 0x00, \ 369b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 370b711ef9cSBaptiste Daroussin 371b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_GBRG { \ 372b711ef9cSBaptiste Daroussin 'G', 'B', 'R', 'G', 0x00, 0x00, 0x10, 0x00, \ 373b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 374b711ef9cSBaptiste Daroussin 375b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_GRBG { \ 376b711ef9cSBaptiste Daroussin 'G', 'R', 'B', 'G', 0x00, 0x00, 0x10, 0x00, \ 377b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 378b711ef9cSBaptiste Daroussin 379b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_RGGB { \ 380b711ef9cSBaptiste Daroussin 'R', 'G', 'G', 'B', 0x00, 0x00, 0x10, 0x00, \ 381b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 382b711ef9cSBaptiste Daroussin 383b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_RGBP { \ 384b711ef9cSBaptiste Daroussin 'R', 'G', 'B', 'P', 0x00, 0x00, 0x10, 0x00, \ 385b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 386b711ef9cSBaptiste Daroussin 387b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_D3DFMT_R5G6B5 { \ 388b711ef9cSBaptiste Daroussin 0x7b, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ 389b711ef9cSBaptiste Daroussin 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } 390b711ef9cSBaptiste Daroussin 391b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_BGR3 { \ 392b711ef9cSBaptiste Daroussin 0x7d, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ 393b711ef9cSBaptiste Daroussin 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } 394b711ef9cSBaptiste Daroussin 395b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_BGR4 { \ 396b711ef9cSBaptiste Daroussin 0x7e, 0xeb, 0x36, 0xe4, 0x4f, 0x52, 0xce, 0x11, \ 397b711ef9cSBaptiste Daroussin 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70 } 398b711ef9cSBaptiste Daroussin 399b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_H265 { \ 400b711ef9cSBaptiste Daroussin 'H', '2', '6', '5', 0x00, 0x00, 0x10, 0x00, \ 401b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 402b711ef9cSBaptiste Daroussin 403b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_RW10 { \ 404b711ef9cSBaptiste Daroussin 'R', 'W', '1', '0', 0x00, 0x00, 0x10, 0x00, \ 405b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 406b711ef9cSBaptiste Daroussin 407b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_BG16 { \ 408b711ef9cSBaptiste Daroussin 'B', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 409b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 410b711ef9cSBaptiste Daroussin 411b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_GB16 { \ 412b711ef9cSBaptiste Daroussin 'G', 'B', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 413b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 414b711ef9cSBaptiste Daroussin 415b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_RG16 { \ 416b711ef9cSBaptiste Daroussin 'R', 'G', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 417b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 418b711ef9cSBaptiste Daroussin 419b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_GR16 { \ 420b711ef9cSBaptiste Daroussin 'G', 'R', '1', '6', 0x00, 0x00, 0x10, 0x00, \ 421b711ef9cSBaptiste Daroussin 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } 422b711ef9cSBaptiste Daroussin 423b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_INVZ { \ 424b711ef9cSBaptiste Daroussin 'I', 'N', 'V', 'Z', 0x90, 0x2d, 0x58, 0x4a, \ 425b711ef9cSBaptiste Daroussin 0x92, 0x0b, 0x77, 0x3f, 0x1f, 0x2c, 0x55, 0x6b } 426b711ef9cSBaptiste Daroussin 427b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_GUID_INVI { \ 428b711ef9cSBaptiste Daroussin 'I', 'N', 'V', 'I', 0xdb, 0x57, 0x49, 0x5e, \ 429b711ef9cSBaptiste Daroussin 0x8e, 0x3f, 0xf4, 0x79, 0x53, 0x2b, 0x94, 0x6f } 430b711ef9cSBaptiste Daroussin 431b711ef9cSBaptiste Daroussin /* 432b711ef9cSBaptiste Daroussin * USB Video Payload MJPEG 433b711ef9cSBaptiste Daroussin */ 434b711ef9cSBaptiste Daroussin /* Table 2-1: Stream Header Format for the Motion-JPEG */ 435b711ef9cSBaptiste Daroussin #define UVIDEO_SH_MAX_LEN 12 436b711ef9cSBaptiste Daroussin #define UVIDEO_SH_MIN_LEN 2 437b711ef9cSBaptiste Daroussin struct usb_video_stream_header { 438b711ef9cSBaptiste Daroussin uByte bLength; 439b711ef9cSBaptiste Daroussin uByte bFlags; 440b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_FID (1 << 0) 441b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_EOF (1 << 1) 442b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_PTS (1 << 2) 443b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_SCR (1 << 3) 444b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_RES (1 << 4) 445b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_STI (1 << 5) 446b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_ERR (1 << 6) 447b711ef9cSBaptiste Daroussin #define UVIDEO_SH_FLAG_EOH (1 << 7) 448b711ef9cSBaptiste Daroussin /* TODO complete struct */ 449b711ef9cSBaptiste Daroussin } __packed; 450b711ef9cSBaptiste Daroussin 451b711ef9cSBaptiste Daroussin /* Table 3-19: Color Matching Descriptor */ 452b711ef9cSBaptiste Daroussin struct usb_video_colorformat_desc { 453b711ef9cSBaptiste Daroussin uByte bLength; 454b711ef9cSBaptiste Daroussin uByte bDescriptorType; 455b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 456b711ef9cSBaptiste Daroussin uByte bColorPrimaries; 457b711ef9cSBaptiste Daroussin uByte bTransferCharacteristics; 458b711ef9cSBaptiste Daroussin uByte bMatrixCoefficients; 459b711ef9cSBaptiste Daroussin } __packed; 460b711ef9cSBaptiste Daroussin 461b711ef9cSBaptiste Daroussin struct usb_video_frame_desc { 462b711ef9cSBaptiste Daroussin uByte bLength; 463b711ef9cSBaptiste Daroussin uByte bDescriptorType; 464b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 465b711ef9cSBaptiste Daroussin uByte bFrameIndex; 466b711ef9cSBaptiste Daroussin union { 467b711ef9cSBaptiste Daroussin /* 468b711ef9cSBaptiste Daroussin * Table 3-2: Video Frame Descriptor 469b711ef9cSBaptiste Daroussin * (same for mjpeg and uncompressed) 470b711ef9cSBaptiste Daroussin */ 471b711ef9cSBaptiste Daroussin struct { 472b711ef9cSBaptiste Daroussin uByte bmCapabilities; 473b711ef9cSBaptiste Daroussin uWord wWidth; 474b711ef9cSBaptiste Daroussin uWord wHeight; 475b711ef9cSBaptiste Daroussin uDWord dwMinBitRate; 476b711ef9cSBaptiste Daroussin uDWord dwMaxBitRate; 477b711ef9cSBaptiste Daroussin uDWord dwMaxVideoFrameBufferSize; 478b711ef9cSBaptiste Daroussin uDWord dwDefaultFrameInterval; 479b711ef9cSBaptiste Daroussin uByte bFrameIntervalType; 480b711ef9cSBaptiste Daroussin } uc; 481b711ef9cSBaptiste Daroussin 482b711ef9cSBaptiste Daroussin /* 483b711ef9cSBaptiste Daroussin * Table 3-2 Frame Based Payload Video Frame Descriptors */ 484b711ef9cSBaptiste Daroussin struct { 485b711ef9cSBaptiste Daroussin uByte bmCapabilities; 486b711ef9cSBaptiste Daroussin uWord wWidth; 487b711ef9cSBaptiste Daroussin uWord wHeight; 488b711ef9cSBaptiste Daroussin uDWord dwMinBitRate; 489b711ef9cSBaptiste Daroussin uDWord dwMaxBitRate; 490b711ef9cSBaptiste Daroussin uDWord dwDefaultFrameInterval; 491b711ef9cSBaptiste Daroussin uByte bFrameIntervalType; 492b711ef9cSBaptiste Daroussin uDWord dwBytesPerLine; 493b711ef9cSBaptiste Daroussin } fb; 494b711ef9cSBaptiste Daroussin 495b711ef9cSBaptiste Daroussin /* Table 3-2: H.264 Payload Video Frame Descriptor */ 496b711ef9cSBaptiste Daroussin struct { 497b711ef9cSBaptiste Daroussin uWord wWidth; 498b711ef9cSBaptiste Daroussin uWord wHeight; 499b711ef9cSBaptiste Daroussin uWord wSARwidth; 500b711ef9cSBaptiste Daroussin uWord wSARheight; 501b711ef9cSBaptiste Daroussin uWord wProfile; 502b711ef9cSBaptiste Daroussin uByte bLevelIDC; 503b711ef9cSBaptiste Daroussin uWord wConstrainedToolset; 504b711ef9cSBaptiste Daroussin uDWord bmSupportedUsages; 505b711ef9cSBaptiste Daroussin uWord bmCapabilities; 506b711ef9cSBaptiste Daroussin uDWord bmSVCCapabilities; 507b711ef9cSBaptiste Daroussin uDWord bmMVCCapabilities; 508b711ef9cSBaptiste Daroussin uDWord dwMinBitRate; 509b711ef9cSBaptiste Daroussin uDWord dwMaxBitRate; 510b711ef9cSBaptiste Daroussin uDWord dwDefaultFrameInterval; 511b711ef9cSBaptiste Daroussin uByte bNumFrameIntervals; 512b711ef9cSBaptiste Daroussin } h264; 513b711ef9cSBaptiste Daroussin 514b711ef9cSBaptiste Daroussin } u; 515b711ef9cSBaptiste Daroussin 516b711ef9cSBaptiste Daroussin #define UVIDEO_FRAME_MIN_LEN(frm) \ 517b711ef9cSBaptiste Daroussin (offsetof(struct usb_video_frame_desc, u) + \ 518b711ef9cSBaptiste Daroussin ( \ 519b711ef9cSBaptiste Daroussin ((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_H264) ? \ 520b711ef9cSBaptiste Daroussin sizeof(((struct usb_video_frame_desc *)0)->u.h264) : \ 521b711ef9cSBaptiste Daroussin ((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_FRAME_BASED) ? \ 522b711ef9cSBaptiste Daroussin sizeof(((struct usb_video_frame_desc *)0)->u.fb) : \ 523b711ef9cSBaptiste Daroussin sizeof(((struct usb_video_frame_desc *)0)->u.uc) \ 524b711ef9cSBaptiste Daroussin ) \ 525b711ef9cSBaptiste Daroussin ) 526b711ef9cSBaptiste Daroussin 527b711ef9cSBaptiste Daroussin #define UVIDEO_FRAME_FIELD(frm, field) \ 528b711ef9cSBaptiste Daroussin ( \ 529b711ef9cSBaptiste Daroussin ((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_H264) ? \ 530b711ef9cSBaptiste Daroussin (frm)->u.h264.field : \ 531b711ef9cSBaptiste Daroussin ((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_FRAME_BASED) ? \ 532b711ef9cSBaptiste Daroussin (frm)->u.fb.field : \ 533b711ef9cSBaptiste Daroussin (frm)->u.uc.field \ 534b711ef9cSBaptiste Daroussin ) 535b711ef9cSBaptiste Daroussin 536b711ef9cSBaptiste Daroussin #define UVIDEO_FRAME_NUM_INTERVALS(frm) \ 537b711ef9cSBaptiste Daroussin ( \ 538b711ef9cSBaptiste Daroussin ((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_H264) ? \ 539b711ef9cSBaptiste Daroussin (frm)->u.h264.bNumFrameIntervals : \ 540b711ef9cSBaptiste Daroussin ((frm)->bDescriptorSubtype == UDESCSUB_VS_FRAME_FRAME_BASED) ? \ 541b711ef9cSBaptiste Daroussin (frm)->u.fb.bFrameIntervalType : \ 542b711ef9cSBaptiste Daroussin (frm)->u.uc.bFrameIntervalType \ 543b711ef9cSBaptiste Daroussin ) 544b711ef9cSBaptiste Daroussin 545b711ef9cSBaptiste Daroussin /* uDWord ivals[]; frame intervals, length varies */ 546b711ef9cSBaptiste Daroussin } __packed; 547b711ef9cSBaptiste Daroussin 548b711ef9cSBaptiste Daroussin struct usb_video_format_desc { 549b711ef9cSBaptiste Daroussin uByte bLength; 550b711ef9cSBaptiste Daroussin uByte bDescriptorType; 551b711ef9cSBaptiste Daroussin uByte bDescriptorSubtype; 552b711ef9cSBaptiste Daroussin uByte bFormatIndex; 553b711ef9cSBaptiste Daroussin uByte bNumFrameDescriptors; 554b711ef9cSBaptiste Daroussin union { 555b711ef9cSBaptiste Daroussin /* Table 3-1: Motion-JPEG Video Format Descriptor */ 556b711ef9cSBaptiste Daroussin struct { 557b711ef9cSBaptiste Daroussin uByte bmFlags; 558b711ef9cSBaptiste Daroussin uByte bDefaultFrameIndex; 559b711ef9cSBaptiste Daroussin uByte bAspectRatioX; 560b711ef9cSBaptiste Daroussin uByte bAspectRatioY; 561b711ef9cSBaptiste Daroussin uByte bmInterlaceFlags; 562b711ef9cSBaptiste Daroussin uByte bCopyProtect; 563b711ef9cSBaptiste Daroussin } mjpeg; 564b711ef9cSBaptiste Daroussin 565b711ef9cSBaptiste Daroussin /* Table 3-1: Uncompressed Video Format Descriptor */ 566b711ef9cSBaptiste Daroussin struct { 567b711ef9cSBaptiste Daroussin uByte guidFormat[16]; 568b711ef9cSBaptiste Daroussin uByte bBitsPerPixel; 569b711ef9cSBaptiste Daroussin uByte bDefaultFrameIndex; 570b711ef9cSBaptiste Daroussin uByte bAspectRatioX; 571b711ef9cSBaptiste Daroussin uByte bAspectRatioY; 572b711ef9cSBaptiste Daroussin uByte bmInterlaceFlags; 573b711ef9cSBaptiste Daroussin uByte bCopyProtect; 574b711ef9cSBaptiste Daroussin } uc; 575b711ef9cSBaptiste Daroussin 576b711ef9cSBaptiste Daroussin /* Table 3-1: Frame Based Payload Video Format Descriptor */ 577b711ef9cSBaptiste Daroussin struct { 578b711ef9cSBaptiste Daroussin uByte guidFormat[16]; 579b711ef9cSBaptiste Daroussin uByte bBitsPerPixel; 580b711ef9cSBaptiste Daroussin uByte bDefaultFrameIndex; 581b711ef9cSBaptiste Daroussin uByte bAspectRatioX; 582b711ef9cSBaptiste Daroussin uByte bAspectRatioY; 583b711ef9cSBaptiste Daroussin uByte bmInterlaceFlags; 584b711ef9cSBaptiste Daroussin uByte bCopyProtect; 585b711ef9cSBaptiste Daroussin uByte bVariableSize; 586b711ef9cSBaptiste Daroussin } fb; 587b711ef9cSBaptiste Daroussin 588b711ef9cSBaptiste Daroussin /* Table 3-1: H.264 Payload Video Format Descriptor */ 589b711ef9cSBaptiste Daroussin struct { 590b711ef9cSBaptiste Daroussin uByte bDefaultFrameIndex; 591b711ef9cSBaptiste Daroussin uByte bMaxCodecConfigDelay; 592b711ef9cSBaptiste Daroussin uByte bmSupportedSliceModes; 593b711ef9cSBaptiste Daroussin uByte bmSupportedSyncFrameTypes; 594b711ef9cSBaptiste Daroussin uByte bResolutionScaling; 595b711ef9cSBaptiste Daroussin uByte _reserved1; 596b711ef9cSBaptiste Daroussin uByte bmSupportedRateControlModes; 597b711ef9cSBaptiste Daroussin uWord wMaxMBperSecOneResolutionNoScalability; 598b711ef9cSBaptiste Daroussin uWord wMaxMBperSecTwoResolutionsNoScalability; 599b711ef9cSBaptiste Daroussin uWord wMaxMBperSecThreeResolutionsNoScalability; 600b711ef9cSBaptiste Daroussin uWord wMaxMBperSecFourResolutionsNoScalability; 601b711ef9cSBaptiste Daroussin uWord wMaxMBperSecOneResolutionTemporalScalability; 602b711ef9cSBaptiste Daroussin uWord wMaxMBperSecTwoResolutionsTemporalScalablility; 603b711ef9cSBaptiste Daroussin uWord wMaxMBperSecThreeResolutionsTemporalScalability; 604b711ef9cSBaptiste Daroussin uWord wMaxMBperSecFourResolutionsTemporalScalability; 605b711ef9cSBaptiste Daroussin uWord wMaxMBperSecOneResolutionTemporalQualityScalability; 606b711ef9cSBaptiste Daroussin uWord wMaxMBperSecTwoResolutionsTemporalQualityScalability; 607b711ef9cSBaptiste Daroussin uWord wMaxMBperSecThreeResolutionsTemporalQualityScalablity; 608b711ef9cSBaptiste Daroussin uWord wMaxMBperSecFourResolutionsTemporalQualityScalability; 609b711ef9cSBaptiste Daroussin uWord wMaxMBperSecOneResolutionTemporalSpatialScalability; 610b711ef9cSBaptiste Daroussin uWord wMaxMBperSecTwoResolutionsTemporalSpatialScalability; 611b711ef9cSBaptiste Daroussin uWord wMaxMBperSecThreeResolutionsTemporalSpatialScalablity; 612b711ef9cSBaptiste Daroussin uWord wMaxMBperSecFourResolutionsTemporalSpatialScalability; 613b711ef9cSBaptiste Daroussin uWord wMaxMBperSecOneResolutionFullScalability; 614b711ef9cSBaptiste Daroussin uWord wMaxMBperSecTwoResolutionsFullScalability; 615b711ef9cSBaptiste Daroussin uWord wMaxMBperSecThreeResolutionsFullScalability; 616b711ef9cSBaptiste Daroussin uWord wMaxMBperSecFourResolutionsFullScalability; 617b711ef9cSBaptiste Daroussin } h264; 618b711ef9cSBaptiste Daroussin } u; 619b711ef9cSBaptiste Daroussin 620b711ef9cSBaptiste Daroussin #define UVIDEO_FORMAT_LEN(fmt) \ 621b711ef9cSBaptiste Daroussin ( \ 622b711ef9cSBaptiste Daroussin (((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_H264) || \ 623b711ef9cSBaptiste Daroussin ((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_H264_SIMULCAST)) ? \ 624b711ef9cSBaptiste Daroussin (offsetof(struct usb_video_format_desc, u) + \ 625b711ef9cSBaptiste Daroussin sizeof(((struct usb_video_format_desc *)0)->u.h264)) : \ 626b711ef9cSBaptiste Daroussin ((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_FRAME_BASED) ? \ 627b711ef9cSBaptiste Daroussin (offsetof(struct usb_video_format_desc, u) + \ 628b711ef9cSBaptiste Daroussin sizeof(((struct usb_video_format_desc *)0)->u.fb)) : \ 629b711ef9cSBaptiste Daroussin ((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_UNCOMPRESSED) ? \ 630b711ef9cSBaptiste Daroussin (offsetof(struct usb_video_format_desc, u) + \ 631b711ef9cSBaptiste Daroussin sizeof(((struct usb_video_format_desc *)0)->u.uc)) : \ 632b711ef9cSBaptiste Daroussin ((fmt)->bDescriptorSubtype == UDESCSUB_VS_FORMAT_MJPEG) ? \ 633b711ef9cSBaptiste Daroussin (offsetof(struct usb_video_format_desc, u) + \ 634b711ef9cSBaptiste Daroussin sizeof(((struct usb_video_format_desc *)0)->u.mjpeg)) : \ 635b711ef9cSBaptiste Daroussin sizeof(struct usb_video_colorformat_desc) \ 636b711ef9cSBaptiste Daroussin ) 637b711ef9cSBaptiste Daroussin 638b711ef9cSBaptiste Daroussin } __packed; 639b711ef9cSBaptiste Daroussin 640b711ef9cSBaptiste Daroussin /* 641b711ef9cSBaptiste Daroussin * Driver specific private definitions. 642b711ef9cSBaptiste Daroussin */ 643*3b6f833cSBaptiste Daroussin #define UVIDEO_NFRAMES_MAX 128 644b711ef9cSBaptiste Daroussin 645*3b6f833cSBaptiste Daroussin #define UVIDEO_IXFERS 5 646b711ef9cSBaptiste Daroussin struct uvideo_vs_iface { 647b711ef9cSBaptiste Daroussin uint8_t iface_index; 648b711ef9cSBaptiste Daroussin int numalts; 649b711ef9cSBaptiste Daroussin int curalt; 650b711ef9cSBaptiste Daroussin int endpoint; 651b711ef9cSBaptiste Daroussin uint32_t psize; 652b711ef9cSBaptiste Daroussin int bulk_endpoint; 653b711ef9cSBaptiste Daroussin int bulk_running; 654b711ef9cSBaptiste Daroussin }; 655b711ef9cSBaptiste Daroussin 656b711ef9cSBaptiste Daroussin struct uvideo_frame_buffer { 657b711ef9cSBaptiste Daroussin int sample; 658b711ef9cSBaptiste Daroussin uint8_t fid; 659b711ef9cSBaptiste Daroussin uint8_t error; 660b711ef9cSBaptiste Daroussin uint8_t mmap_q_full; 661b711ef9cSBaptiste Daroussin int offset; 662b711ef9cSBaptiste Daroussin int buf_size; 663b711ef9cSBaptiste Daroussin uint8_t *buf; 664b711ef9cSBaptiste Daroussin uint32_t fmt_flags; 665b711ef9cSBaptiste Daroussin }; 666b711ef9cSBaptiste Daroussin 667b711ef9cSBaptiste Daroussin /* 668b711ef9cSBaptiste Daroussin * 1920x1080 uncompressed (e.g. YUYV422) requires ~4MB image data per frame. 669b711ef9cSBaptiste Daroussin * 4MB * 8 frame buffers = 32MB kernel memory required. 670b711ef9cSBaptiste Daroussin * With 8 frame buffers we are pretty safe not to run out of kernel memory. 671b711ef9cSBaptiste Daroussin */ 672b711ef9cSBaptiste Daroussin #define UVIDEO_MAX_BUFFERS 8 673b711ef9cSBaptiste Daroussin struct uvideo_mmap { 674b711ef9cSBaptiste Daroussin STAILQ_ENTRY(uvideo_mmap) q_frames; 675b711ef9cSBaptiste Daroussin uint8_t *buf; 676b711ef9cSBaptiste Daroussin struct v4l2_buffer v4l2_buf; 677b711ef9cSBaptiste Daroussin }; 678b711ef9cSBaptiste Daroussin typedef STAILQ_HEAD(, uvideo_mmap) q_mmap; 679b711ef9cSBaptiste Daroussin 680b711ef9cSBaptiste Daroussin struct uvideo_format_group { 681b711ef9cSBaptiste Daroussin uint32_t pixelformat; 682b711ef9cSBaptiste Daroussin int has_colorformat; 683b711ef9cSBaptiste Daroussin uint32_t colorspace; 684b711ef9cSBaptiste Daroussin uint32_t xfer_func; 685b711ef9cSBaptiste Daroussin uint32_t ycbcr_enc; 686b711ef9cSBaptiste Daroussin uint8_t format_dfidx; 687b711ef9cSBaptiste Daroussin struct usb_video_format_desc *format; 688b711ef9cSBaptiste Daroussin /* frame descriptors for mjpeg and uncompressed are identical */ 689b711ef9cSBaptiste Daroussin #define UVIDEO_MAX_FRAME 32 690b711ef9cSBaptiste Daroussin struct usb_video_frame_desc *frame_cur; 691b711ef9cSBaptiste Daroussin struct usb_video_frame_desc *frame[UVIDEO_MAX_FRAME]; 692b711ef9cSBaptiste Daroussin int frame_num; 693b711ef9cSBaptiste Daroussin }; 694b711ef9cSBaptiste Daroussin 695b711ef9cSBaptiste Daroussin struct uvideo_res { 696b711ef9cSBaptiste Daroussin int width; 697b711ef9cSBaptiste Daroussin int height; 698b711ef9cSBaptiste Daroussin int fidx; 699b711ef9cSBaptiste Daroussin }; 700b711ef9cSBaptiste Daroussin 701b711ef9cSBaptiste Daroussin struct uvideo_controls { 702b711ef9cSBaptiste Daroussin int cid; 703b711ef9cSBaptiste Daroussin int type; 704b711ef9cSBaptiste Daroussin char name[32]; 705b711ef9cSBaptiste Daroussin uint8_t ctrl_bit; 706b711ef9cSBaptiste Daroussin uint16_t ctrl_selector; 707b711ef9cSBaptiste Daroussin uint16_t ctrl_len; 708b711ef9cSBaptiste Daroussin int sig; 709b711ef9cSBaptiste Daroussin }; 710b711ef9cSBaptiste Daroussin 711b711ef9cSBaptiste Daroussin #endif /* _UVIDEO_H_ */ 712