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 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 0x01 |
46 | #define 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 | /* 3.9.2.6 Color Matching Descriptor Values */ |
183 | enum uvc_color_primaries_values { |
184 | UVC_COLOR_PRIMARIES_UNSPECIFIED, |
185 | UVC_COLOR_PRIMARIES_BT_709_SRGB, |
186 | UVC_COLOR_PRIMARIES_BT_470_2_M, |
187 | UVC_COLOR_PRIMARIES_BT_470_2_B_G, |
188 | UVC_COLOR_PRIMARIES_SMPTE_170M, |
189 | UVC_COLOR_PRIMARIES_SMPTE_240M, |
190 | }; |
191 | |
192 | enum uvc_transfer_characteristics_values { |
193 | UVC_TRANSFER_CHARACTERISTICS_UNSPECIFIED, |
194 | UVC_TRANSFER_CHARACTERISTICS_BT_709, |
195 | UVC_TRANSFER_CHARACTERISTICS_BT_470_2_M, |
196 | UVC_TRANSFER_CHARACTERISTICS_BT_470_2_B_G, |
197 | UVC_TRANSFER_CHARACTERISTICS_SMPTE_170M, |
198 | UVC_TRANSFER_CHARACTERISTICS_SMPTE_240M, |
199 | UVC_TRANSFER_CHARACTERISTICS_LINEAR, |
200 | UVC_TRANSFER_CHARACTERISTICS_SRGB, |
201 | }; |
202 | |
203 | enum uvc_matrix_coefficients { |
204 | UVC_MATRIX_COEFFICIENTS_UNSPECIFIED, |
205 | UVC_MATRIX_COEFFICIENTS_BT_709, |
206 | UVC_MATRIX_COEFFICIENTS_FCC, |
207 | UVC_MATRIX_COEFFICIENTS_BT_470_2_B_G, |
208 | UVC_MATRIX_COEFFICIENTS_SMPTE_170M, |
209 | UVC_MATRIX_COEFFICIENTS_SMPTE_240M, |
210 | }; |
211 | |
212 | /* ------------------------------------------------------------------------ |
213 | * UVC structures |
214 | */ |
215 | |
216 | /* All UVC descriptors have these 3 fields at the beginning */ |
217 | struct { |
218 | __u8 ; |
219 | __u8 ; |
220 | __u8 ; |
221 | } __attribute__((packed)); |
222 | |
223 | /* 3.7.2. Video Control Interface Header Descriptor */ |
224 | struct { |
225 | __u8 ; |
226 | __u8 ; |
227 | __u8 ; |
228 | __le16 ; |
229 | __le16 ; |
230 | __le32 ; |
231 | __u8 ; |
232 | __u8 []; |
233 | } __attribute__((__packed__)); |
234 | |
235 | #define (n) (12+(n)) |
236 | |
237 | #define (n) \ |
238 | uvc_header_descriptor_##n |
239 | |
240 | #define (n) \ |
241 | struct UVC_HEADER_DESCRIPTOR(n) { \ |
242 | __u8 bLength; \ |
243 | __u8 bDescriptorType; \ |
244 | __u8 bDescriptorSubType; \ |
245 | __le16 bcdUVC; \ |
246 | __le16 wTotalLength; \ |
247 | __le32 dwClockFrequency; \ |
248 | __u8 bInCollection; \ |
249 | __u8 baInterfaceNr[n]; \ |
250 | } __attribute__ ((packed)) |
251 | |
252 | /* 3.7.2.1. Input Terminal Descriptor */ |
253 | struct uvc_input_terminal_descriptor { |
254 | __u8 bLength; |
255 | __u8 bDescriptorType; |
256 | __u8 bDescriptorSubType; |
257 | __u8 bTerminalID; |
258 | __le16 wTerminalType; |
259 | __u8 bAssocTerminal; |
260 | __u8 iTerminal; |
261 | } __attribute__((__packed__)); |
262 | |
263 | #define UVC_DT_INPUT_TERMINAL_SIZE 8 |
264 | |
265 | /* 3.7.2.2. Output Terminal Descriptor */ |
266 | struct uvc_output_terminal_descriptor { |
267 | __u8 bLength; |
268 | __u8 bDescriptorType; |
269 | __u8 bDescriptorSubType; |
270 | __u8 bTerminalID; |
271 | __le16 wTerminalType; |
272 | __u8 bAssocTerminal; |
273 | __u8 bSourceID; |
274 | __u8 iTerminal; |
275 | } __attribute__((__packed__)); |
276 | |
277 | #define UVC_DT_OUTPUT_TERMINAL_SIZE 9 |
278 | |
279 | /* 3.7.2.3. Camera Terminal Descriptor */ |
280 | struct uvc_camera_terminal_descriptor { |
281 | __u8 bLength; |
282 | __u8 bDescriptorType; |
283 | __u8 bDescriptorSubType; |
284 | __u8 bTerminalID; |
285 | __le16 wTerminalType; |
286 | __u8 bAssocTerminal; |
287 | __u8 iTerminal; |
288 | __le16 wObjectiveFocalLengthMin; |
289 | __le16 wObjectiveFocalLengthMax; |
290 | __le16 wOcularFocalLength; |
291 | __u8 bControlSize; |
292 | __u8 bmControls[3]; |
293 | } __attribute__((__packed__)); |
294 | |
295 | #define UVC_DT_CAMERA_TERMINAL_SIZE(n) (15+(n)) |
296 | |
297 | /* 3.7.2.4. Selector Unit Descriptor */ |
298 | struct uvc_selector_unit_descriptor { |
299 | __u8 bLength; |
300 | __u8 bDescriptorType; |
301 | __u8 bDescriptorSubType; |
302 | __u8 bUnitID; |
303 | __u8 bNrInPins; |
304 | __u8 baSourceID[0]; |
305 | __u8 iSelector; |
306 | } __attribute__((__packed__)); |
307 | |
308 | #define UVC_DT_SELECTOR_UNIT_SIZE(n) (6+(n)) |
309 | |
310 | #define UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ |
311 | uvc_selector_unit_descriptor_##n |
312 | |
313 | #define DECLARE_UVC_SELECTOR_UNIT_DESCRIPTOR(n) \ |
314 | struct UVC_SELECTOR_UNIT_DESCRIPTOR(n) { \ |
315 | __u8 bLength; \ |
316 | __u8 bDescriptorType; \ |
317 | __u8 bDescriptorSubType; \ |
318 | __u8 bUnitID; \ |
319 | __u8 bNrInPins; \ |
320 | __u8 baSourceID[n]; \ |
321 | __u8 iSelector; \ |
322 | } __attribute__ ((packed)) |
323 | |
324 | /* 3.7.2.5. Processing Unit Descriptor */ |
325 | struct uvc_processing_unit_descriptor { |
326 | __u8 bLength; |
327 | __u8 bDescriptorType; |
328 | __u8 bDescriptorSubType; |
329 | __u8 bUnitID; |
330 | __u8 bSourceID; |
331 | __le16 wMaxMultiplier; |
332 | __u8 bControlSize; |
333 | __u8 bmControls[2]; |
334 | __u8 iProcessing; |
335 | __u8 bmVideoStandards; |
336 | } __attribute__((__packed__)); |
337 | |
338 | #define UVC_DT_PROCESSING_UNIT_SIZE(n) (10+(n)) |
339 | |
340 | /* 3.7.2.6. Extension Unit Descriptor */ |
341 | struct uvc_extension_unit_descriptor { |
342 | __u8 bLength; |
343 | __u8 bDescriptorType; |
344 | __u8 bDescriptorSubType; |
345 | __u8 bUnitID; |
346 | __u8 guidExtensionCode[16]; |
347 | __u8 bNumControls; |
348 | __u8 bNrInPins; |
349 | __u8 baSourceID[0]; |
350 | __u8 bControlSize; |
351 | __u8 bmControls[0]; |
352 | __u8 iExtension; |
353 | } __attribute__((__packed__)); |
354 | |
355 | #define UVC_DT_EXTENSION_UNIT_SIZE(p, n) (24+(p)+(n)) |
356 | |
357 | #define UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ |
358 | uvc_extension_unit_descriptor_##p_##n |
359 | |
360 | #define DECLARE_UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) \ |
361 | struct UVC_EXTENSION_UNIT_DESCRIPTOR(p, n) { \ |
362 | __u8 bLength; \ |
363 | __u8 bDescriptorType; \ |
364 | __u8 bDescriptorSubType; \ |
365 | __u8 bUnitID; \ |
366 | __u8 guidExtensionCode[16]; \ |
367 | __u8 bNumControls; \ |
368 | __u8 bNrInPins; \ |
369 | __u8 baSourceID[p]; \ |
370 | __u8 bControlSize; \ |
371 | __u8 bmControls[n]; \ |
372 | __u8 iExtension; \ |
373 | } __attribute__ ((packed)) |
374 | |
375 | /* 3.8.2.2. Video Control Interrupt Endpoint Descriptor */ |
376 | struct uvc_control_endpoint_descriptor { |
377 | __u8 bLength; |
378 | __u8 bDescriptorType; |
379 | __u8 bDescriptorSubType; |
380 | __le16 wMaxTransferSize; |
381 | } __attribute__((__packed__)); |
382 | |
383 | #define UVC_DT_CONTROL_ENDPOINT_SIZE 5 |
384 | |
385 | /* 3.9.2.1. Input Header Descriptor */ |
386 | struct { |
387 | __u8 ; |
388 | __u8 ; |
389 | __u8 ; |
390 | __u8 ; |
391 | __le16 ; |
392 | __u8 ; |
393 | __u8 ; |
394 | __u8 ; |
395 | __u8 ; |
396 | __u8 ; |
397 | __u8 ; |
398 | __u8 ; |
399 | __u8 []; |
400 | } __attribute__((__packed__)); |
401 | |
402 | #define (n, p) (13+(n*p)) |
403 | |
404 | #define (n, p) \ |
405 | uvc_input_header_descriptor_##n_##p |
406 | |
407 | #define (n, p) \ |
408 | struct UVC_INPUT_HEADER_DESCRIPTOR(n, p) { \ |
409 | __u8 bLength; \ |
410 | __u8 bDescriptorType; \ |
411 | __u8 bDescriptorSubType; \ |
412 | __u8 bNumFormats; \ |
413 | __le16 wTotalLength; \ |
414 | __u8 bEndpointAddress; \ |
415 | __u8 bmInfo; \ |
416 | __u8 bTerminalLink; \ |
417 | __u8 bStillCaptureMethod; \ |
418 | __u8 bTriggerSupport; \ |
419 | __u8 bTriggerUsage; \ |
420 | __u8 bControlSize; \ |
421 | __u8 bmaControls[p][n]; \ |
422 | } __attribute__ ((packed)) |
423 | |
424 | /* 3.9.2.2. Output Header Descriptor */ |
425 | struct { |
426 | __u8 ; |
427 | __u8 ; |
428 | __u8 ; |
429 | __u8 ; |
430 | __le16 ; |
431 | __u8 ; |
432 | __u8 ; |
433 | __u8 ; |
434 | __u8 []; |
435 | } __attribute__((__packed__)); |
436 | |
437 | #define (n, p) (9+(n*p)) |
438 | |
439 | #define (n, p) \ |
440 | uvc_output_header_descriptor_##n_##p |
441 | |
442 | #define (n, p) \ |
443 | struct UVC_OUTPUT_HEADER_DESCRIPTOR(n, p) { \ |
444 | __u8 bLength; \ |
445 | __u8 bDescriptorType; \ |
446 | __u8 bDescriptorSubType; \ |
447 | __u8 bNumFormats; \ |
448 | __le16 wTotalLength; \ |
449 | __u8 bEndpointAddress; \ |
450 | __u8 bTerminalLink; \ |
451 | __u8 bControlSize; \ |
452 | __u8 bmaControls[p][n]; \ |
453 | } __attribute__ ((packed)) |
454 | |
455 | /* 3.9.2.6. Color matching descriptor */ |
456 | struct uvc_color_matching_descriptor { |
457 | __u8 bLength; |
458 | __u8 bDescriptorType; |
459 | __u8 bDescriptorSubType; |
460 | __u8 bColorPrimaries; |
461 | __u8 bTransferCharacteristics; |
462 | __u8 bMatrixCoefficients; |
463 | } __attribute__((__packed__)); |
464 | |
465 | #define UVC_DT_COLOR_MATCHING_SIZE 6 |
466 | |
467 | /* 4.3.1.1. Video Probe and Commit Controls */ |
468 | struct uvc_streaming_control { |
469 | __u16 bmHint; |
470 | __u8 bFormatIndex; |
471 | __u8 bFrameIndex; |
472 | __u32 dwFrameInterval; |
473 | __u16 wKeyFrameRate; |
474 | __u16 wPFrameRate; |
475 | __u16 wCompQuality; |
476 | __u16 wCompWindowSize; |
477 | __u16 wDelay; |
478 | __u32 dwMaxVideoFrameSize; |
479 | __u32 dwMaxPayloadTransferSize; |
480 | __u32 dwClockFrequency; |
481 | __u8 bmFramingInfo; |
482 | __u8 bPreferedVersion; |
483 | __u8 bMinVersion; |
484 | __u8 bMaxVersion; |
485 | } __attribute__((__packed__)); |
486 | |
487 | /* Uncompressed Payload - 3.1.1. Uncompressed Video Format Descriptor */ |
488 | struct uvc_format_uncompressed { |
489 | __u8 bLength; |
490 | __u8 bDescriptorType; |
491 | __u8 bDescriptorSubType; |
492 | __u8 bFormatIndex; |
493 | __u8 bNumFrameDescriptors; |
494 | __u8 guidFormat[16]; |
495 | __u8 bBitsPerPixel; |
496 | __u8 bDefaultFrameIndex; |
497 | __u8 bAspectRatioX; |
498 | __u8 bAspectRatioY; |
499 | __u8 bmInterfaceFlags; |
500 | __u8 bCopyProtect; |
501 | } __attribute__((__packed__)); |
502 | |
503 | #define UVC_DT_FORMAT_UNCOMPRESSED_SIZE 27 |
504 | |
505 | /* Uncompressed Payload - 3.1.2. Uncompressed Video Frame Descriptor */ |
506 | struct uvc_frame_uncompressed { |
507 | __u8 bLength; |
508 | __u8 bDescriptorType; |
509 | __u8 bDescriptorSubType; |
510 | __u8 bFrameIndex; |
511 | __u8 bmCapabilities; |
512 | __le16 wWidth; |
513 | __le16 wHeight; |
514 | __le32 dwMinBitRate; |
515 | __le32 dwMaxBitRate; |
516 | __le32 dwMaxVideoFrameBufferSize; |
517 | __le32 dwDefaultFrameInterval; |
518 | __u8 bFrameIntervalType; |
519 | __le32 dwFrameInterval[]; |
520 | } __attribute__((__packed__)); |
521 | |
522 | #define UVC_DT_FRAME_UNCOMPRESSED_SIZE(n) (26+4*(n)) |
523 | |
524 | #define UVC_FRAME_UNCOMPRESSED(n) \ |
525 | uvc_frame_uncompressed_##n |
526 | |
527 | #define DECLARE_UVC_FRAME_UNCOMPRESSED(n) \ |
528 | struct UVC_FRAME_UNCOMPRESSED(n) { \ |
529 | __u8 bLength; \ |
530 | __u8 bDescriptorType; \ |
531 | __u8 bDescriptorSubType; \ |
532 | __u8 bFrameIndex; \ |
533 | __u8 bmCapabilities; \ |
534 | __le16 wWidth; \ |
535 | __le16 wHeight; \ |
536 | __le32 dwMinBitRate; \ |
537 | __le32 dwMaxBitRate; \ |
538 | __le32 dwMaxVideoFrameBufferSize; \ |
539 | __le32 dwDefaultFrameInterval; \ |
540 | __u8 bFrameIntervalType; \ |
541 | __le32 dwFrameInterval[n]; \ |
542 | } __attribute__ ((packed)) |
543 | |
544 | /* MJPEG Payload - 3.1.1. MJPEG Video Format Descriptor */ |
545 | struct uvc_format_mjpeg { |
546 | __u8 bLength; |
547 | __u8 bDescriptorType; |
548 | __u8 bDescriptorSubType; |
549 | __u8 bFormatIndex; |
550 | __u8 bNumFrameDescriptors; |
551 | __u8 bmFlags; |
552 | __u8 bDefaultFrameIndex; |
553 | __u8 bAspectRatioX; |
554 | __u8 bAspectRatioY; |
555 | __u8 bmInterfaceFlags; |
556 | __u8 bCopyProtect; |
557 | } __attribute__((__packed__)); |
558 | |
559 | #define UVC_DT_FORMAT_MJPEG_SIZE 11 |
560 | |
561 | /* MJPEG Payload - 3.1.2. MJPEG Video Frame Descriptor */ |
562 | struct uvc_frame_mjpeg { |
563 | __u8 bLength; |
564 | __u8 bDescriptorType; |
565 | __u8 bDescriptorSubType; |
566 | __u8 bFrameIndex; |
567 | __u8 bmCapabilities; |
568 | __le16 wWidth; |
569 | __le16 wHeight; |
570 | __le32 dwMinBitRate; |
571 | __le32 dwMaxBitRate; |
572 | __le32 dwMaxVideoFrameBufferSize; |
573 | __le32 dwDefaultFrameInterval; |
574 | __u8 bFrameIntervalType; |
575 | __le32 dwFrameInterval[]; |
576 | } __attribute__((__packed__)); |
577 | |
578 | #define UVC_DT_FRAME_MJPEG_SIZE(n) (26+4*(n)) |
579 | |
580 | #define UVC_FRAME_MJPEG(n) \ |
581 | uvc_frame_mjpeg_##n |
582 | |
583 | #define DECLARE_UVC_FRAME_MJPEG(n) \ |
584 | struct UVC_FRAME_MJPEG(n) { \ |
585 | __u8 bLength; \ |
586 | __u8 bDescriptorType; \ |
587 | __u8 bDescriptorSubType; \ |
588 | __u8 bFrameIndex; \ |
589 | __u8 bmCapabilities; \ |
590 | __le16 wWidth; \ |
591 | __le16 wHeight; \ |
592 | __le32 dwMinBitRate; \ |
593 | __le32 dwMaxBitRate; \ |
594 | __le32 dwMaxVideoFrameBufferSize; \ |
595 | __le32 dwDefaultFrameInterval; \ |
596 | __u8 bFrameIntervalType; \ |
597 | __le32 dwFrameInterval[n]; \ |
598 | } __attribute__ ((packed)) |
599 | |
600 | #endif /* __LINUX_USB_VIDEO_H */ |
601 | |
602 | |