1 /*
2  * Copyright (c) 2022, sakumisu
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef USB_VIDEO_H
7 #define USB_VIDEO_H
8 
9 #define USB_DEVICE_VIDEO_CLASS_VERSION_1_5 0
10 
11 /*! @brief Video device subclass code */
12 #define VIDEO_SC_UNDEFINED                  0x00U
13 #define VIDEO_SC_VIDEOCONTROL               0x01U
14 #define VIDEO_SC_VIDEOSTREAMING             0x02U
15 #define VIDEO_SC_VIDEO_INTERFACE_COLLECTION 0x03U
16 
17 /*! @brief Video device protocol code */
18 #define VIDEO_PC_PROTOCOL_UNDEFINED 0x00U
19 #define VIDEO_PC_PROTOCOL_15        0x01U
20 
21 /*! @brief Video device class-specific descriptor type */
22 #define VIDEO_CS_UNDEFINED_DESCRIPTOR_TYPE     0x20U
23 #define VIDEO_CS_DEVICE_DESCRIPTOR_TYPE        0x21U
24 #define VIDEO_CS_CONFIGURATION_DESCRIPTOR_TYPE 0x22U
25 #define VIDEO_CS_STRING_DESCRIPTOR_TYPE        0x23U
26 #define VIDEO_CS_INTERFACE_DESCRIPTOR_TYPE     0x24U
27 #define VIDEO_CS_ENDPOINT_DESCRIPTOR_TYPE      0x25U
28 
29 /*! @brief Video device class-specific VC interface descriptor subtype */
30 #define VIDEO_VC_DESCRIPTOR_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U
31 #define VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE               0x01U
32 #define VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE       0x02U
33 #define VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE      0x03U
34 #define VIDEO_VC_SELECTOR_UNIT_DESCRIPTOR_SUBTYPE        0x04U
35 #define VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE      0x05U
36 #define VIDEO_VC_EXTENSION_UNIT_DESCRIPTOR_SUBTYPE       0x06U
37 #define VIDEO_VC_ENCODING_UNIT_DESCRIPTOR_SUBTYPE        0x07U
38 
39 /*! @brief Video device class-specific VS interface descriptor subtype */
40 #define VIDEO_VS_UNDEFINED_DESCRIPTOR_SUBTYPE             0x00U
41 #define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE          0x01U
42 #define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE         0x02U
43 #define VIDEO_VS_STILL_IMAGE_FRAME_DESCRIPTOR_SUBTYPE     0x03U
44 #define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE   0x04U
45 #define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE    0x05U
46 #define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_SUBTYPE          0x06U
47 #define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE           0x07U
48 #define VIDEO_VS_FORMAT_MPEG2TS_DESCRIPTOR_SUBTYPE        0x0AU
49 #define VIDEO_VS_FORMAT_DV_DESCRIPTOR_SUBTYPE             0x0CU
50 #define VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE           0x0DU
51 #define VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE    0x10U
52 #define VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE     0x11U
53 #define VIDEO_VS_FORMAT_STREAM_BASED_DESCRIPTOR_SUBTYPE   0x12U
54 #define VIDEO_VS_FORMAT_H264_DESCRIPTOR_SUBTYPE           0x13U
55 #define VIDEO_VS_FRAME_H264_DESCRIPTOR_SUBTYPE            0x14U
56 #define VIDEO_VS_FORMAT_H264_SIMULCAST_DESCRIPTOR_SUBTYPE 0x15U
57 #define VIDEO_VS_FORMAT_VP8_DESCRIPTOR_SUBTYPE            0x16U
58 #define VIDEO_VS_FRAME_VP8_DESCRIPTOR_SUBTYPE             0x17U
59 #define VIDEO_VS_FORMAT_VP8_SIMULCAST_DESCRIPTOR_SUBTYPE  0x18U
60 
61 /*! @brief Video device class-specific VC endpoint descriptor subtype */
62 #define VIDEO_EP_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U
63 #define VIDEO_EP_GENERAL_DESCRIPTOR_SUBTYPE   0x01U
64 #define VIDEO_EP_ENDPOINT_DESCRIPTOR_SUBTYPE  0x02U
65 #define VIDEO_EP_INTERRUPT_DESCRIPTOR_SUBTYPE 0x03U
66 
67 /*! @brief Video device class-specific request code */
68 #define VIDEO_REQUEST_UNDEFINED   0x00U
69 #define VIDEO_REQUEST_SET_CUR     0x01U
70 #define VIDEO_REQUEST_SET_CUR_ALL 0x11U
71 #define VIDEO_REQUEST_GET_CUR     0x81U
72 #define VIDEO_REQUEST_GET_MIN     0x82U
73 #define VIDEO_REQUEST_GET_MAX     0x83U
74 #define VIDEO_REQUEST_GET_RES     0x84U
75 #define VIDEO_REQUEST_GET_LEN     0x85U
76 #define VIDEO_REQUEST_GET_INFO    0x86U
77 #define VIDEO_REQUEST_GET_DEF     0x87U
78 #define VIDEO_REQUEST_GET_CUR_ALL 0x91U
79 #define VIDEO_REQUEST_GET_MIN_ALL 0x92U
80 #define VIDEO_REQUEST_GET_MAX_ALL 0x93U
81 #define VIDEO_REQUEST_GET_RES_ALL 0x94U
82 #define VIDEO_REQUEST_GET_DEF_ALL 0x97U
83 
84 /*! @brief Video device class-specific VideoControl interface control selector */
85 #define VIDEO_VC_CONTROL_UNDEFINED          0x00U
86 #define VIDEO_VC_VIDEO_POWER_MODE_CONTROL   0x01U
87 #define VIDEO_VC_REQUEST_ERROR_CODE_CONTROL 0x02U
88 
89 /*! @brief Video device class-specific Terminal control selector */
90 #define VIDEO_TE_CONTROL_UNDEFINED 0x00U
91 
92 /*! @brief Video device class-specific Selector Unit control selector */
93 #define VIDEO_SU_CONTROL_UNDEFINED    0x00U
94 #define VIDEO_SU_INPUT_SELECT_CONTROL 0x01U
95 
96 /*! @brief Video device class-specific Camera Terminal control selector */
97 #define VIDEO_CT_CONTROL_UNDEFINED              0x00U
98 #define VIDEO_CT_SCANNING_MODE_CONTROL          0x01U
99 #define VIDEO_CT_AE_MODE_CONTROL                0x02U
100 #define VIDEO_CT_AE_PRIORITY_CONTROL            0x03U
101 #define VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04U
102 #define VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05U
103 #define VIDEO_CT_FOCUS_ABSOLUTE_CONTROL         0x06U
104 #define VIDEO_CT_FOCUS_RELATIVE_CONTROL         0x07U
105 #define VIDEO_CT_FOCUS_AUTO_CONTROL             0x08U
106 #define VIDEO_CT_IRIS_ABSOLUTE_CONTROL          0x09U
107 #define VIDEO_CT_IRIS_RELATIVE_CONTROL          0x0AU
108 #define VIDEO_CT_ZOOM_ABSOLUTE_CONTROL          0x0BU
109 #define VIDEO_CT_ZOOM_RELATIVE_CONTROL          0x0CU
110 #define VIDEO_CT_PANTILT_ABSOLUTE_CONTROL       0x0DU
111 #define VIDEO_CT_PANTILT_RELATIVE_CONTROL       0x0EU
112 #define VIDEO_CT_ROLL_ABSOLUTE_CONTROL          0x0FU
113 #define VIDEO_CT_ROLL_RELATIVE_CONTROL          0x10U
114 #define VIDEO_CT_PRIVACY_CONTROL                0x11U
115 #define VIDEO_CT_FOCUS_SIMPLE_CONTROL           0x12U
116 #define VIDEO_CT_WINDOW_CONTROL                 0x13U
117 #define VIDEO_CT_REGION_OF_INTEREST_CONTROL     0x14U
118 
119 /*! @brief Video device class-specific Processing Unit control selector */
120 #define VIDEO_PU_CONTROL_UNDEFINED                      0x00U
121 #define VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL         0x01U
122 #define VIDEO_PU_BRIGHTNESS_CONTROL                     0x02U
123 #define VIDEO_PU_CONTRAST_CONTROL                       0x03U
124 #define VIDEO_PU_GAIN_CONTROL                           0x04U
125 #define VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL           0x05U
126 #define VIDEO_PU_HUE_CONTROL                            0x06U
127 #define VIDEO_PU_SATURATION_CONTROL                     0x07U
128 #define VIDEO_PU_SHARPNESS_CONTROL                      0x08U
129 #define VIDEO_PU_GAMMA_CONTROL                          0x09U
130 #define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x0AU
131 #define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0BU
132 #define VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x0CU
133 #define VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x0DU
134 #define VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL             0x0EU
135 #define VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x0FU
136 #define VIDEO_PU_HUE_AUTO_CONTROL                       0x10U
137 #define VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL          0x11U
138 #define VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL             0x12U
139 #define VIDEO_PU_CONTRAST_AUTO_CONTROL                  0x13U
140 
141 /*! @brief Video device class-specific Encoding Unit control selector */
142 #define VIDEO_EU_CONTROL_UNDEFINED           0x00U
143 #define VIDEO_EU_SELECT_LAYER_CONTROL        0x01U
144 #define VIDEO_EU_PROFILE_TOOLSET_CONTROL     0x02U
145 #define VIDEO_EU_VIDEO_RESOLUTION_CONTROL    0x03U
146 #define VIDEO_EU_MIN_FRAME_INTERVAL_CONTROL  0x04U
147 #define VIDEO_EU_SLICE_MODE_CONTROL          0x05U
148 #define VIDEO_EU_RATE_CONTROL_MODE_CONTROL   0x06U
149 #define VIDEO_EU_AVERAGE_BITRATE_CONTROL     0x07U
150 #define VIDEO_EU_CPB_SIZE_CONTROL            0x08U
151 #define VIDEO_EU_PEAK_BIT_RATE_CONTROL       0x09U
152 #define VIDEO_EU_QUANTIZATION_PARAMS_CONTROL 0x0AU
153 #define VIDEO_EU_SYNC_REF_FRAME_CONTROL      0x0BU
154 #define VIDEO_EU_LTR_BUFFER_CONTROL          0x0CU
155 #define VIDEO_EU_LTR_PICTURE_CONTROL         0x0DU
156 #define VIDEO_EU_LTR_VALIDATION_CONTROL      0x0EU
157 #define VIDEO_EU_LEVEL_IDC_LIMIT_CONTROL     0x0FU
158 #define VIDEO_EU_SEI_PAYLOADTYPE_CONTROL     0x10U
159 #define VIDEO_EU_QP_RANGE_CONTROL            0x11U
160 #define VIDEO_EU_PRIORITY_CONTROL            0x12U
161 #define VIDEO_EU_START_OR_STOP_LAYER_CONTROL 0x13U
162 #define VIDEO_EU_ERROR_RESILIENCY_CONTROL    0x14U
163 
164 /*! @brief Video device class-specific Extension Unit control selector */
165 #define VIDEO_XU_CONTROL_UNDEFINED 0x00U
166 
167 /*! @brief Video device class-specific VideoStreaming Interface control selector */
168 #define VIDEO_VS_CONTROL_UNDEFINED            0x00U
169 #define VIDEO_VS_PROBE_CONTROL                0x01U
170 #define VIDEO_VS_COMMIT_CONTROL               0x02U
171 #define VIDEO_VS_STILL_PROBE_CONTROL          0x03U
172 #define VIDEO_VS_STILL_COMMIT_CONTROL         0x04U
173 #define VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL  0x05U
174 #define VIDEO_VS_STREAM_ERROR_CODE_CONTROL    0x06U
175 #define VIDEO_VS_GENERATE_KEY_FRAME_CONTROL   0x07U
176 #define VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08U
177 #define VIDEO_VS_SYNCH_DELAY_CONTROL          0x09U
178 
179 /*! @}*/
180 
181 /*!
182  * @name USB Video class terminal types
183  * @{
184  */
185 
186 /*! @brief Video device USB terminal type */
187 #define VIDEO_TT_VENDOR_SPECIFIC 0x0100U
188 #define VIDEO_TT_STREAMING       0x0101U
189 
190 /*! @brief Video device input terminal type */
191 #define VIDEO_ITT_VENDOR_SPECIFIC       0x0200U
192 #define VIDEO_ITT_CAMERA                0x0201U
193 #define VIDEO_ITT_MEDIA_TRANSPORT_INPUT 0x0202U
194 
195 /*! @brief Video device output terminal type */
196 #define VIDEO_OTT_VENDOR_SPECIFIC        0x0300U
197 #define VIDEO_OTT_DISPLAY                0x0301U
198 #define VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302U
199 
200 /*! @brief Video device external terminal type */
201 #define VIDEO_ET_VENDOR_SPECIFIC     0x0400U
202 #define VIDEO_ET_COMPOSITE_CONNECTOR 0x0401U
203 #define VIDEO_ET_SVIDEO_CONNECTOR    0x0402U
204 #define VIDEO_ET_COMPONENT_CONNECTOR 0x0403U
205 
206 /*! @}*/
207 
208 /*!
209  * @name USB Video class setup request types
210  * @{
211  */
212 
213 /*! @brief Video device class setup request set type */
214 #define VIDEO_SET_REQUEST_INTERFACE 0x21U
215 #define VIDEO_SET_REQUEST_ENDPOINT  0x22U
216 
217 /*! @brief Video device class setup request get type */
218 #define VIDEO_GET_REQUEST_INTERFACE 0xA1U
219 #define VIDEO_GET_REQUEST_ENDPOINT  0xA2U
220 
221 /*! @}*/
222 
223 /*! @brief Video device still image trigger control */
224 #define VIDEO_STILL_IMAGE_TRIGGER_NORMAL_OPERATION                            0x00U
225 #define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE                        0x01U
226 #define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE_VS_DEDICATED_BULK_PIPE 0x02U
227 #define VIDEO_STILL_IMAGE_TRIGGER_ABORT_STILL_IMAGE_TRANSMISSION              0x03U
228 
229 /*!
230  * @name USB Video device class-specific request commands
231  * @{
232  */
233 
234 /*! @brief Video device class-specific request GET CUR COMMAND */
235 #define VIDEO_GET_CUR_VC_POWER_MODE_CONTROL 0x8101U
236 #define VIDEO_GET_CUR_VC_ERROR_CODE_CONTROL 0x8102U
237 
238 #define VIDEO_GET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL         0x8121U
239 #define VIDEO_GET_CUR_PU_BRIGHTNESS_CONTROL                     0x8122U
240 #define VIDEO_GET_CUR_PU_CONTRACT_CONTROL                       0x8123U
241 #define VIDEO_GET_CUR_PU_GAIN_CONTROL                           0x8124U
242 #define VIDEO_GET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL           0x8125U
243 #define VIDEO_GET_CUR_PU_HUE_CONTROL                            0x8126U
244 #define VIDEO_GET_CUR_PU_SATURATION_CONTROL                     0x8127U
245 #define VIDEO_GET_CUR_PU_SHARRNESS_CONTROL                      0x8128U
246 #define VIDEO_GET_CUR_PU_GAMMA_CONTROL                          0x8129U
247 #define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x812AU
248 #define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x812BU
249 #define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x812CU
250 #define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x812DU
251 #define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL             0x812EU
252 #define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x812FU
253 #define VIDEO_GET_CUR_PU_HUE_AUTO_CONTROL                       0x8130U
254 #define VIDEO_GET_CUR_PU_ANALOG_VIDEO_STANDARD_CONTROL          0x8131U
255 #define VIDEO_GET_CUR_PU_ANALOG_LOCK_STATUS_CONTROL             0x8132U
256 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
257 #define VIDEO_GET_CUR_PU_CONTRAST_AUTO_CONTROL 0x8133U
258 #endif
259 
260 #define VIDEO_GET_CUR_CT_SCANNING_MODE_CONTROL          0x8141U
261 #define VIDEO_GET_CUR_CT_AE_MODE_CONTROL                0x8142U
262 #define VIDEO_GET_CUR_CT_AE_PRIORITY_CONTROL            0x8143U
263 #define VIDEO_GET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8144U
264 #define VIDEO_GET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8145U
265 #define VIDEO_GET_CUR_CT_FOCUS_ABSOLUTE_CONTROL         0x8146U
266 #define VIDEO_GET_CUR_CT_FOCUS_RELATIVE_CONTROL         0x8147U
267 #define VIDEO_GET_CUR_CT_FOCUS_AUTO_CONTROL             0x8148U
268 #define VIDEO_GET_CUR_CT_IRIS_ABSOLUTE_CONTROL          0x8149U
269 #define VIDEO_GET_CUR_CT_IRIS_RELATIVE_CONTROL          0x814AU
270 #define VIDEO_GET_CUR_CT_ZOOM_ABSOLUTE_CONTROL          0x814BU
271 #define VIDEO_GET_CUR_CT_ZOOM_RELATIVE_CONTROL          0x814CU
272 #define VIDEO_GET_CUR_CT_PANTILT_ABSOLUTE_CONTROL       0x814DU
273 #define VIDEO_GET_CUR_CT_PANTILT_RELATIVE_CONTROL       0x814EU
274 #define VIDEO_GET_CUR_CT_ROLL_ABSOLUTE_CONTROL          0x814FU
275 #define VIDEO_GET_CUR_CT_ROLL_RELATIVE_CONTROL          0x8150U
276 #define VIDEO_GET_CUR_CT_PRIVACY_CONTROL                0x8151U
277 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
278 #define VIDEO_GET_CUR_CT_FOCUS_SIMPLE_CONTROL       0x8152U
279 #define VIDEO_GET_CUR_CT_DIGITAL_WINDOW_CONTROL     0x8153U
280 #define VIDEO_GET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x8154U
281 #endif
282 
283 #define VIDEO_GET_CUR_VS_PROBE_CONTROL                0x8161U
284 #define VIDEO_GET_CUR_VS_COMMIT_CONTROL               0x8162U
285 #define VIDEO_GET_CUR_VS_STILL_PROBE_CONTROL          0x8163U
286 #define VIDEO_GET_CUR_VS_STILL_COMMIT_CONTROL         0x8164U
287 #define VIDEO_GET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL  0x8165U
288 #define VIDEO_GET_CUR_VS_STREAM_ERROR_CODE_CONTROL    0x8166U
289 #define VIDEO_GET_CUR_VS_GENERATE_KEY_FRAME_CONTROL   0x8167U
290 #define VIDEO_GET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8168U
291 #define VIDEO_GET_CUR_VS_SYNCH_DELAY_CONTROL          0x8169U
292 
293 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
294 #define VIDEO_GET_CUR_EU_SELECT_LAYER_CONTROL        0x8181U
295 #define VIDEO_GET_CUR_EU_PROFILE_TOOLSET_CONTROL     0x8182U
296 #define VIDEO_GET_CUR_EU_VIDEO_RESOLUTION_CONTROL    0x8183U
297 #define VIDEO_GET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL  0x8184U
298 #define VIDEO_GET_CUR_EU_SLICE_MODE_CONTROL          0x8185U
299 #define VIDEO_GET_CUR_EU_RATE_CONTROL_MODE_CONTROL   0x8186U
300 #define VIDEO_GET_CUR_EU_AVERAGE_BITRATE_CONTROL     0x8187U
301 #define VIDEO_GET_CUR_EU_CPB_SIZE_CONTROL            0x8188U
302 #define VIDEO_GET_CUR_EU_PEAK_BIT_RATE_CONTROL       0x8189U
303 #define VIDEO_GET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x818AU
304 #define VIDEO_GET_CUR_EU_SYNC_REF_FRAME_CONTROL      0x818BU
305 #define VIDEO_GET_CUR_EU_LTR_BUFFER_CONTROL          0x818CU
306 #define VIDEO_GET_CUR_EU_LTR_PICTURE_CONTROL         0x818DU
307 #define VIDEO_GET_CUR_EU_LTR_VALIDATION_CONTROL      0x818EU
308 #define VIDEO_GET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL     0x818FU
309 #define VIDEO_GET_CUR_EU_SEI_PAYLOADTYPE_CONTROL     0x8190U
310 #define VIDEO_GET_CUR_EU_QP_RANGE_CONTROL            0x8191U
311 #define VIDEO_GET_CUR_EU_PRIORITY_CONTROL            0x8192U
312 #define VIDEO_GET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x8193U
313 #define VIDEO_GET_CUR_EU_ERROR_RESILIENCY_CONTROL    0x8194U
314 #endif
315 
316 /*! @brief Video device class-specific request GET MIN COMMAND */
317 #define VIDEO_GET_MIN_PU_BACKLIGHT_COMPENSATION_CONTROL    0x8221U
318 #define VIDEO_GET_MIN_PU_BRIGHTNESS_CONTROL                0x8222U
319 #define VIDEO_GET_MIN_PU_CONTRACT_CONTROL                  0x8223U
320 #define VIDEO_GET_MIN_PU_GAIN_CONTROL                      0x8224U
321 #define VIDEO_GET_MIN_PU_HUE_CONTROL                       0x8226U
322 #define VIDEO_GET_MIN_PU_SATURATION_CONTROL                0x8227U
323 #define VIDEO_GET_MIN_PU_SHARRNESS_CONTROL                 0x8228U
324 #define VIDEO_GET_MIN_PU_GAMMA_CONTROL                     0x8229U
325 #define VIDEO_GET_MIN_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x822AU
326 #define VIDEO_GET_MIN_PU_WHITE_BALANCE_COMPONENT_CONTROL   0x822CU
327 #define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_CONTROL        0x822EU
328 #define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL  0x822FU
329 
330 #define VIDEO_GET_MIN_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8244U
331 #define VIDEO_GET_MIN_CT_FOCUS_ABSOLUTE_CONTROL         0x8246U
332 #define VIDEO_GET_MIN_CT_FOCUS_RELATIVE_CONTROL         0x8247U
333 #define VIDEO_GET_MIN_CT_IRIS_ABSOLUTE_CONTROL          0x8249U
334 #define VIDEO_GET_MIN_CT_ZOOM_ABSOLUTE_CONTROL          0x824BU
335 #define VIDEO_GET_MIN_CT_ZOOM_RELATIVE_CONTROL          0x824CU
336 #define VIDEO_GET_MIN_CT_PANTILT_ABSOLUTE_CONTROL       0x824DU
337 #define VIDEO_GET_MIN_CT_PANTILT_RELATIVE_CONTROL       0x824EU
338 #define VIDEO_GET_MIN_CT_ROLL_ABSOLUTE_CONTROL          0x824FU
339 #define VIDEO_GET_MIN_CT_ROLL_RELATIVE_CONTROL          0x8250U
340 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
341 #define VIDEO_GET_MIN_CT_DIGITAL_WINDOW_CONTROL     0x8251U
342 #define VIDEO_GET_MIN_CT_REGION_OF_INTEREST_CONTROL 0x8252U
343 #endif
344 
345 #define VIDEO_GET_MIN_VS_PROBE_CONTROL                0x8261U
346 #define VIDEO_GET_MIN_VS_STILL_PROBE_CONTROL          0x8263U
347 #define VIDEO_GET_MIN_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8268U
348 #define VIDEO_GET_MIN_VS_SYNCH_DELAY_CONTROL          0x8269U
349 
350 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
351 #define VIDEO_GET_MIN_EU_VIDEO_RESOLUTION_CONTROL    0x8283U
352 #define VIDEO_GET_MIN_EU_MIN_FRAME_INTERVAL_CONTROL  0x8284U
353 #define VIDEO_GET_MIN_EU_SLICE_MODE_CONTROL          0x8285U
354 #define VIDEO_GET_MIN_EU_AVERAGE_BITRATE_CONTROL     0x8287U
355 #define VIDEO_GET_MIN_EU_CPB_SIZE_CONTROL            0x8288U
356 #define VIDEO_GET_MIN_EU_PEAK_BIT_RATE_CONTROL       0x8289U
357 #define VIDEO_GET_MIN_EU_QUANTIZATION_PARAMS_CONTROL 0x828AU
358 #define VIDEO_GET_MIN_EU_SYNC_REF_FRAME_CONTROL      0x828BU
359 #define VIDEO_GET_MIN_EU_LEVEL_IDC_LIMIT_CONTROL     0x828FU
360 #define VIDEO_GET_MIN_EU_SEI_PAYLOADTYPE_CONTROL     0x8290U
361 #define VIDEO_GET_MIN_EU_QP_RANGE_CONTROL            0x8291U
362 #endif
363 
364 /*! @brief Video device class-specific request GET MAX COMMAND */
365 #define VIDEO_GET_MAX_PU_BACKLIGHT_COMPENSATION_CONTROL    0x8321U
366 #define VIDEO_GET_MAX_PU_BRIGHTNESS_CONTROL                0x8322U
367 #define VIDEO_GET_MAX_PU_CONTRACT_CONTROL                  0x8323U
368 #define VIDEO_GET_MAX_PU_GAIN_CONTROL                      0x8324U
369 #define VIDEO_GET_MAX_PU_HUE_CONTROL                       0x8326U
370 #define VIDEO_GET_MAX_PU_SATURATION_CONTROL                0x8327U
371 #define VIDEO_GET_MAX_PU_SHARRNESS_CONTROL                 0x8328U
372 #define VIDEO_GET_MAX_PU_GAMMA_CONTROL                     0x8329U
373 #define VIDEO_GET_MAX_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x832AU
374 #define VIDEO_GET_MAX_PU_WHITE_BALANCE_COMPONENT_CONTROL   0x832CU
375 #define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_CONTROL        0x832EU
376 #define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL  0x832FU
377 
378 #define VIDEO_GET_MAX_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8344U
379 #define VIDEO_GET_MAX_CT_FOCUS_ABSOLUTE_CONTROL         0x8346U
380 #define VIDEO_GET_MAX_CT_FOCUS_RELATIVE_CONTROL         0x8347U
381 #define VIDEO_GET_MAX_CT_IRIS_ABSOLUTE_CONTROL          0x8349U
382 #define VIDEO_GET_MAX_CT_ZOOM_ABSOLUTE_CONTROL          0x834BU
383 #define VIDEO_GET_MAX_CT_ZOOM_RELATIVE_CONTROL          0x834CU
384 #define VIDEO_GET_MAX_CT_PANTILT_ABSOLUTE_CONTROL       0x834DU
385 #define VIDEO_GET_MAX_CT_PANTILT_RELATIVE_CONTROL       0x834EU
386 #define VIDEO_GET_MAX_CT_ROLL_ABSOLUTE_CONTROL          0x834FU
387 #define VIDEO_GET_MAX_CT_ROLL_RELATIVE_CONTROL          0x8350U
388 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
389 #define VIDEO_GET_MAX_CT_DIGITAL_WINDOW_CONTROL     0x8351U
390 #define VIDEO_GET_MAX_CT_REGION_OF_INTEREST_CONTROL 0x8352U
391 #endif
392 
393 #define VIDEO_GET_MAX_VS_PROBE_CONTROL                0x8361U
394 #define VIDEO_GET_MAX_VS_STILL_PROBE_CONTROL          0x8363U
395 #define VIDEO_GET_MAX_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8368U
396 #define VIDEO_GET_MAX_VS_SYNCH_DELAY_CONTROL          0x8369U
397 
398 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
399 #define VIDEO_GET_MAX_EU_VIDEO_RESOLUTION_CONTROL    0x8383U
400 #define VIDEO_GET_MAX_EU_MIN_FRAME_INTERVAL_CONTROL  0x8384U
401 #define VIDEO_GET_MAX_EU_SLICE_MODE_CONTROL          0x8385U
402 #define VIDEO_GET_MAX_EU_AVERAGE_BITRATE_CONTROL     0x8387U
403 #define VIDEO_GET_MAX_EU_CPB_SIZE_CONTROL            0x8388U
404 #define VIDEO_GET_MAX_EU_PEAK_BIT_RATE_CONTROL       0x8389U
405 #define VIDEO_GET_MAX_EU_QUANTIZATION_PARAMS_CONTROL 0x838AU
406 #define VIDEO_GET_MAX_EU_SYNC_REF_FRAME_CONTROL      0x838BU
407 #define VIDEO_GET_MAX_EU_LTR_BUFFER_CONTROL          0x838CU
408 #define VIDEO_GET_MAX_EU_LEVEL_IDC_LIMIT_CONTROL     0x838FU
409 #define VIDEO_GET_MAX_EU_SEI_PAYLOADTYPE_CONTROL     0x8390U
410 #define VIDEO_GET_MAX_EU_QP_RANGE_CONTROL            0x8391U
411 #endif
412 
413 /*! @brief Video device class-specific request GET RES COMMAND */
414 #define VIDEO_GET_RES_PU_BACKLIGHT_COMPENSATION_CONTROL    0x8421U
415 #define VIDEO_GET_RES_PU_BRIGHTNESS_CONTROL                0x8422U
416 #define VIDEO_GET_RES_PU_CONTRACT_CONTROL                  0x8423U
417 #define VIDEO_GET_RES_PU_GAIN_CONTROL                      0x8424U
418 #define VIDEO_GET_RES_PU_HUE_CONTROL                       0x8426U
419 #define VIDEO_GET_RES_PU_SATURATION_CONTROL                0x8427U
420 #define VIDEO_GET_RES_PU_SHARRNESS_CONTROL                 0x8428U
421 #define VIDEO_GET_RES_PU_GAMMA_CONTROL                     0x8429U
422 #define VIDEO_GET_RES_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x842AU
423 #define VIDEO_GET_RES_PU_WHITE_BALANCE_COMPONENT_CONTROL   0x842CU
424 #define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_CONTROL        0x842EU
425 #define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL  0x842FU
426 
427 #define VIDEO_GET_RES_CT_AE_MODE_CONTROL                0x8442U
428 #define VIDEO_GET_RES_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8444U
429 #define VIDEO_GET_RES_CT_FOCUS_ABSOLUTE_CONTROL         0x8446U
430 #define VIDEO_GET_RES_CT_FOCUS_RELATIVE_CONTROL         0x8447U
431 #define VIDEO_GET_RES_CT_IRIS_ABSOLUTE_CONTROL          0x8449U
432 #define VIDEO_GET_RES_CT_ZOOM_ABSOLUTE_CONTROL          0x844BU
433 #define VIDEO_GET_RES_CT_ZOOM_RELATIVE_CONTROL          0x844CU
434 #define VIDEO_GET_RES_CT_PANTILT_ABSOLUTE_CONTROL       0x844DU
435 #define VIDEO_GET_RES_CT_PANTILT_RELATIVE_CONTROL       0x844EU
436 #define VIDEO_GET_RES_CT_ROLL_ABSOLUTE_CONTROL          0x844FU
437 #define VIDEO_GET_RES_CT_ROLL_RELATIVE_CONTROL          0x8450U
438 
439 #define VIDEO_GET_RES_VS_PROBE_CONTROL                0x8461U
440 #define VIDEO_GET_RES_VS_STILL_PROBE_CONTROL          0x8463U
441 #define VIDEO_GET_RES_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8468U
442 #define VIDEO_GET_RES_VS_SYNCH_DELAY_CONTROL          0x8469U
443 
444 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
445 #define VIDEO_GET_RES_EU_AVERAGE_BITRATE_CONTROL     0x8487U
446 #define VIDEO_GET_RES_EU_CPB_SIZE_CONTROL            0x8488U
447 #define VIDEO_GET_RES_EU_PEAK_BIT_RATE_CONTROL       0x8489U
448 #define VIDEO_GET_RES_EU_QUANTIZATION_PARAMS_CONTROL 0x848AU
449 #define VIDEO_GET_RES_EU_ERROR_RESILIENCY_CONTROL    0x8494U
450 #endif
451 
452 /*! @brief Video device class-specific request GET LEN COMMAND */
453 
454 #define VIDEO_GET_LEN_VS_PROBE_CONTROL        0x8561U
455 #define VIDEO_GET_LEN_VS_COMMIT_CONTROL       0x8562U
456 #define VIDEO_GET_LEN_VS_STILL_PROBE_CONTROL  0x8563U
457 #define VIDEO_GET_LEN_VS_STILL_COMMIT_CONTROL 0x8564U
458 
459 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
460 #define VIDEO_GET_LEN_EU_SELECT_LAYER_CONTROL        0x8581U
461 #define VIDEO_GET_LEN_EU_PROFILE_TOOLSET_CONTROL     0x8582U
462 #define VIDEO_GET_LEN_EU_VIDEO_RESOLUTION_CONTROL    0x8583U
463 #define VIDEO_GET_LEN_EU_MIN_FRAME_INTERVAL_CONTROL  0x8584U
464 #define VIDEO_GET_LEN_EU_SLICE_MODE_CONTROL          0x8585U
465 #define VIDEO_GET_LEN_EU_RATE_CONTROL_MODE_CONTROL   0x8586U
466 #define VIDEO_GET_LEN_EU_AVERAGE_BITRATE_CONTROL     0x8587U
467 #define VIDEO_GET_LEN_EU_CPB_SIZE_CONTROL            0x8588U
468 #define VIDEO_GET_LEN_EU_PEAK_BIT_RATE_CONTROL       0x8589U
469 #define VIDEO_GET_LEN_EU_QUANTIZATION_PARAMS_CONTROL 0x858AU
470 #define VIDEO_GET_LEN_EU_SYNC_REF_FRAME_CONTROL      0x858BU
471 #define VIDEO_GET_LEN_EU_LTR_BUFFER_CONTROL          0x858CU
472 #define VIDEO_GET_LEN_EU_LTR_PICTURE_CONTROL         0x858DU
473 #define VIDEO_GET_LEN_EU_LTR_VALIDATION_CONTROL      0x858EU
474 #define VIDEO_GET_LEN_EU_QP_RANGE_CONTROL            0x8591U
475 #define VIDEO_GET_LEN_EU_PRIORITY_CONTROL            0x8592U
476 #define VIDEO_GET_LEN_EU_START_OR_STOP_LAYER_CONTROL 0x8593U
477 #endif
478 
479 /*! @brief Video device class-specific request GET INFO COMMAND */
480 #define VIDEO_GET_INFO_VC_POWER_MODE_CONTROL 0x8601U
481 #define VIDEO_GET_INFO_VC_ERROR_CODE_CONTROL 0x8602U
482 
483 #define VIDEO_GET_INFO_PU_BACKLIGHT_COMPENSATION_CONTROL         0x8621U
484 #define VIDEO_GET_INFO_PU_BRIGHTNESS_CONTROL                     0x8622U
485 #define VIDEO_GET_INFO_PU_CONTRACT_CONTROL                       0x8623U
486 #define VIDEO_GET_INFO_PU_GAIN_CONTROL                           0x8624U
487 #define VIDEO_GET_INFO_PU_POWER_LINE_FREQUENCY_CONTROL           0x8625U
488 #define VIDEO_GET_INFO_PU_HUE_CONTROL                            0x8626U
489 #define VIDEO_GET_INFO_PU_SATURATION_CONTROL                     0x8627U
490 #define VIDEO_GET_INFO_PU_SHARRNESS_CONTROL                      0x8628U
491 #define VIDEO_GET_INFO_PU_GAMMA_CONTROL                          0x8629U
492 #define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x862AU
493 #define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x862BU
494 #define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x862CU
495 #define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x862DU
496 #define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_CONTROL             0x862EU
497 #define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x862FU
498 #define VIDEO_GET_INFO_PU_HUE_AUTO_CONTROL                       0x8630U
499 #define VIDEO_GET_INFO_PU_ANALOG_VIDEO_STANDARD_CONTROL          0x8631U
500 #define VIDEO_GET_INFO_PU_ANALOG_LOCK_STATUS_CONTROL             0x8632U
501 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
502 #define VIDEO_GET_INFO_PU_CONTRAST_AUTO_CONTROL 0x8633U
503 #endif
504 
505 #define VIDEO_GET_INFO_CT_SCANNING_MODE_CONTROL          0x8641U
506 #define VIDEO_GET_INFO_CT_AE_MODE_CONTROL                0x8642U
507 #define VIDEO_GET_INFO_CT_AE_PRIORITY_CONTROL            0x8643U
508 #define VIDEO_GET_INFO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8644U
509 #define VIDEO_GET_INFO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8645U
510 #define VIDEO_GET_INFO_CT_FOCUS_ABSOLUTE_CONTROL         0x8646U
511 #define VIDEO_GET_INFO_CT_FOCUS_RELATIVE_CONTROL         0x8647U
512 #define VIDEO_GET_INFO_CT_FOCUS_AUTO_CONTROL             0x8648U
513 #define VIDEO_GET_INFO_CT_IRIS_ABSOLUTE_CONTROL          0x8649U
514 #define VIDEO_GET_INFO_CT_IRIS_RELATIVE_CONTROL          0x864AU
515 #define VIDEO_GET_INFO_CT_ZOOM_ABSOLUTE_CONTROL          0x864BU
516 #define VIDEO_GET_INFO_CT_ZOOM_RELATIVE_CONTROL          0x864CU
517 #define VIDEO_GET_INFO_CT_PANTILT_ABSOLUTE_CONTROL       0x864DU
518 #define VIDEO_GET_INFO_CT_PANTILT_RELATIVE_CONTROL       0x864EU
519 #define VIDEO_GET_INFO_CT_ROLL_ABSOLUTE_CONTROL          0x864FU
520 #define VIDEO_GET_INFO_CT_ROLL_RELATIVE_CONTROL          0x8650U
521 #define VIDEO_GET_INFO_CT_PRIVACY_CONTROL                0x8651U
522 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
523 #define VIDEO_GET_INFO_CT_FOCUS_SIMPLE_CONTROL 0x8652U
524 #endif
525 
526 #define VIDEO_GET_INFO_VS_PROBE_CONTROL                0x8661U
527 #define VIDEO_GET_INFO_VS_COMMIT_CONTROL               0x8662U
528 #define VIDEO_GET_INFO_VS_STILL_PROBE_CONTROL          0x8663U
529 #define VIDEO_GET_INFO_VS_STILL_COMMIT_CONTROL         0x8664U
530 #define VIDEO_GET_INFO_VS_STILL_IMAGE_TRIGGER_CONTROL  0x8665U
531 #define VIDEO_GET_INFO_VS_STREAM_ERROR_CODE_CONTROL    0x8666U
532 #define VIDEO_GET_INFO_VS_GENERATE_KEY_FRAME_CONTROL   0x8667U
533 #define VIDEO_GET_INFO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8668U
534 #define VIDEO_GET_INFO_VS_SYNCH_DELAY_CONTROL          0x8669U
535 
536 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
537 #define VIDEO_GET_INFO_EU_SELECT_LAYER_CONTROL        0x8681U
538 #define VIDEO_GET_INFO_EU_PROFILE_TOOLSET_CONTROL     0x8682U
539 #define VIDEO_GET_INFO_EU_VIDEO_RESOLUTION_CONTROL    0x8683U
540 #define VIDEO_GET_INFO_EU_MIN_FRAME_INTERVAL_CONTROL  0x8684U
541 #define VIDEO_GET_INFO_EU_SLICE_MODE_CONTROL          0x8685U
542 #define VIDEO_GET_INFO_EU_RATE_CONTROL_MODE_CONTROL   0x8686U
543 #define VIDEO_GET_INFO_EU_AVERAGE_BITRATE_CONTROL     0x8687U
544 #define VIDEO_GET_INFO_EU_CPB_SIZE_CONTROL            0x8688U
545 #define VIDEO_GET_INFO_EU_PEAK_BIT_RATE_CONTROL       0x8689U
546 #define VIDEO_GET_INFO_EU_QUANTIZATION_PARAMS_CONTROL 0x868AU
547 #define VIDEO_GET_INFO_EU_SYNC_REF_FRAME_CONTROL      0x868BU
548 #define VIDEO_GET_INFO_EU_LTR_BUFFER_CONTROL          0x868CU
549 #define VIDEO_GET_INFO_EU_LTR_PICTURE_CONTROL         0x868DU
550 #define VIDEO_GET_INFO_EU_LTR_VALIDATION_CONTROL      0x868EU
551 #define VIDEO_GET_INFO_EU_SEI_PAYLOADTYPE_CONTROL     0x8690U
552 #define VIDEO_GET_INFO_EU_QP_RANGE_CONTROL            0x8691U
553 #define VIDEO_GET_INFO_EU_PRIORITY_CONTROL            0x8692U
554 #define VIDEO_GET_INFO_EU_START_OR_STOP_LAYER_CONTROL 0x8693U
555 #endif
556 
557 /*! @brief Video device class-specific request GET DEF COMMAND */
558 #define VIDEO_GET_DEF_PU_BACKLIGHT_COMPENSATION_CONTROL         0x8721U
559 #define VIDEO_GET_DEF_PU_BRIGHTNESS_CONTROL                     0x8722U
560 #define VIDEO_GET_DEF_PU_CONTRACT_CONTROL                       0x8723U
561 #define VIDEO_GET_DEF_PU_GAIN_CONTROL                           0x8724U
562 #define VIDEO_GET_DEF_PU_POWER_LINE_FREQUENCY_CONTROL           0x8725U
563 #define VIDEO_GET_DEF_PU_HUE_CONTROL                            0x8726U
564 #define VIDEO_GET_DEF_PU_SATURATION_CONTROL                     0x8727U
565 #define VIDEO_GET_DEF_PU_SHARRNESS_CONTROL                      0x8728U
566 #define VIDEO_GET_DEF_PU_GAMMA_CONTROL                          0x8729U
567 #define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x872AU
568 #define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x872BU
569 #define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x872CU
570 #define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x872DU
571 #define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_CONTROL             0x872EU
572 #define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x872FU
573 #define VIDEO_GET_DEF_PU_HUE_AUTO_CONTROL                       0x8730U
574 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
575 #define VIDEO_GET_DEF_PU_CONTRAST_AUTO_CONTROL 0x8731U
576 #endif
577 
578 #define VIDEO_GET_DEF_CT_AE_MODE_CONTROL                0x8742U
579 #define VIDEO_GET_DEF_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8744U
580 #define VIDEO_GET_DEF_CT_FOCUS_ABSOLUTE_CONTROL         0x8746U
581 #define VIDEO_GET_DEF_CT_FOCUS_RELATIVE_CONTROL         0x8747U
582 #define VIDEO_GET_DEF_CT_FOCUS_AUTO_CONTROL             0x8748U
583 #define VIDEO_GET_DEF_CT_IRIS_ABSOLUTE_CONTROL          0x8749U
584 #define VIDEO_GET_DEF_CT_ZOOM_ABSOLUTE_CONTROL          0x874BU
585 #define VIDEO_GET_DEF_CT_ZOOM_RELATIVE_CONTROL          0x874CU
586 #define VIDEO_GET_DEF_CT_PANTILT_ABSOLUTE_CONTROL       0x874DU
587 #define VIDEO_GET_DEF_CT_PANTILT_RELATIVE_CONTROL       0x874EU
588 #define VIDEO_GET_DEF_CT_ROLL_ABSOLUTE_CONTROL          0x874FU
589 #define VIDEO_GET_DEF_CT_ROLL_RELATIVE_CONTROL          0x8750U
590 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
591 #define VIDEO_GET_DEF_CT_FOCUS_SIMPLE_CONTROL       0x8751U
592 #define VIDEO_GET_DEF_CT_DIGITAL_WINDOW_CONTROL     0x8752U
593 #define VIDEO_GET_DEF_CT_REGION_OF_INTEREST_CONTROL 0x8753U
594 #endif
595 
596 #define VIDEO_GET_DEF_VS_PROBE_CONTROL                0x8761U
597 #define VIDEO_GET_DEF_VS_STILL_PROBE_CONTROL          0x8763U
598 #define VIDEO_GET_DEF_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8768U
599 #define VIDEO_GET_DEF_VS_SYNCH_DELAY_CONTROL          0x8769U
600 
601 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
602 #define VIDEO_GET_DEF_EU_PROFILE_TOOLSET_CONTROL     0x8782U
603 #define VIDEO_GET_DEF_EU_VIDEO_RESOLUTION_CONTROL    0x8783U
604 #define VIDEO_GET_DEF_EU_MIN_FRAME_INTERVAL_CONTROL  0x8784U
605 #define VIDEO_GET_DEF_EU_SLICE_MODE_CONTROL          0x8785U
606 #define VIDEO_GET_DEF_EU_RATE_CONTROL_MODE_CONTROL   0x8786U
607 #define VIDEO_GET_DEF_EU_AVERAGE_BITRATE_CONTROL     0x8787U
608 #define VIDEO_GET_DEF_EU_CPB_SIZE_CONTROL            0x8788U
609 #define VIDEO_GET_DEF_EU_PEAK_BIT_RATE_CONTROL       0x8789U
610 #define VIDEO_GET_DEF_EU_QUANTIZATION_PARAMS_CONTROL 0x878AU
611 #define VIDEO_GET_DEF_EU_LTR_BUFFER_CONTROL          0x878CU
612 #define VIDEO_GET_DEF_EU_LTR_PICTURE_CONTROL         0x878DU
613 #define VIDEO_GET_DEF_EU_LTR_VALIDATION_CONTROL      0x878EU
614 #define VIDEO_GET_DEF_EU_LEVEL_IDC_LIMIT_CONTROL     0x878FU
615 #define VIDEO_GET_DEF_EU_SEI_PAYLOADTYPE_CONTROL     0x8790U
616 #define VIDEO_GET_DEF_EU_QP_RANGE_CONTROL            0x8791U
617 #define VIDEO_GET_DEF_EU_ERROR_RESILIENCY_CONTROL    0x8794U
618 #endif
619 
620 /*! @brief Video device class-specific request SET CUR COMMAND */
621 #define VIDEO_SET_CUR_VC_POWER_MODE_CONTROL 0x0101U
622 
623 #define VIDEO_SET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL         0x0121U
624 #define VIDEO_SET_CUR_PU_BRIGHTNESS_CONTROL                     0x0122U
625 #define VIDEO_SET_CUR_PU_CONTRACT_CONTROL                       0x0123U
626 #define VIDEO_SET_CUR_PU_GAIN_CONTROL                           0x0124U
627 #define VIDEO_SET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL           0x0125U
628 #define VIDEO_SET_CUR_PU_HUE_CONTROL                            0x0126U
629 #define VIDEO_SET_CUR_PU_SATURATION_CONTROL                     0x0127U
630 #define VIDEO_SET_CUR_PU_SHARRNESS_CONTROL                      0x0128U
631 #define VIDEO_SET_CUR_PU_GAMMA_CONTROL                          0x0129U
632 #define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x012AU
633 #define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x012BU
634 #define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x012CU
635 #define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x012DU
636 #define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL             0x012EU
637 #define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x012FU
638 #define VIDEO_SET_CUR_PU_HUE_AUTO_CONTROL                       0x0130U
639 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
640 #define VIDEO_SET_CUR_PU_CONTRAST_AUTO_CONTROL 0x0131U
641 #endif
642 
643 #define VIDEO_SET_CUR_CT_SCANNING_MODE_CONTROL          0x0141U
644 #define VIDEO_SET_CUR_CT_AE_MODE_CONTROL                0x0142U
645 #define VIDEO_SET_CUR_CT_AE_PRIORITY_CONTROL            0x0143U
646 #define VIDEO_SET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x0144U
647 #define VIDEO_SET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x0145U
648 #define VIDEO_SET_CUR_CT_FOCUS_ABSOLUTE_CONTROL         0x0146U
649 #define VIDEO_SET_CUR_CT_FOCUS_RELATIVE_CONTROL         0x0147U
650 #define VIDEO_SET_CUR_CT_FOCUS_AUTO_CONTROL             0x0148U
651 #define VIDEO_SET_CUR_CT_IRIS_ABSOLUTE_CONTROL          0x0149U
652 #define VIDEO_SET_CUR_CT_IRIS_RELATIVE_CONTROL          0x014AU
653 #define VIDEO_SET_CUR_CT_ZOOM_ABSOLUTE_CONTROL          0x014BU
654 #define VIDEO_SET_CUR_CT_ZOOM_RELATIVE_CONTROL          0x014CU
655 #define VIDEO_SET_CUR_CT_PANTILT_ABSOLUTE_CONTROL       0x014DU
656 #define VIDEO_SET_CUR_CT_PANTILT_RELATIVE_CONTROL       0x014EU
657 #define VIDEO_SET_CUR_CT_ROLL_ABSOLUTE_CONTROL          0x014FU
658 #define VIDEO_SET_CUR_CT_ROLL_RELATIVE_CONTROL          0x0150U
659 #define VIDEO_SET_CUR_CT_PRIVACY_CONTROL                0x0151U
660 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
661 #define VIDEO_SET_CUR_CT_FOCUS_SIMPLE_CONTROL       0x0152U
662 #define VIDEO_SET_CUR_CT_DIGITAL_WINDOW_CONTROL     0x0153U
663 #define VIDEO_SET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x0154U
664 #endif
665 
666 #define VIDEO_SET_CUR_VS_PROBE_CONTROL                0x0161U
667 #define VIDEO_SET_CUR_VS_COMMIT_CONTROL               0x0162U
668 #define VIDEO_SET_CUR_VS_STILL_PROBE_CONTROL          0x0163U
669 #define VIDEO_SET_CUR_VS_STILL_COMMIT_CONTROL         0x0164U
670 #define VIDEO_SET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL  0x0165U
671 #define VIDEO_SET_CUR_VS_STREAM_ERROR_CODE_CONTROL    0x0166U
672 #define VIDEO_SET_CUR_VS_GENERATE_KEY_FRAME_CONTROL   0x0167U
673 #define VIDEO_SET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x0168U
674 #define VIDEO_SET_CUR_VS_SYNCH_DELAY_CONTROL          0x0169U
675 
676 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
677 #define VIDEO_SET_CUR_EU_SELECT_LAYER_CONTROL        0x0181U
678 #define VIDEO_SET_CUR_EU_PROFILE_TOOLSET_CONTROL     0x0182U
679 #define VIDEO_SET_CUR_EU_VIDEO_RESOLUTION_CONTROL    0x0183U
680 #define VIDEO_SET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL  0x0184U
681 #define VIDEO_SET_CUR_EU_SLICE_MODE_CONTROL          0x0185U
682 #define VIDEO_SET_CUR_EU_RATE_CONTROL_MODE_CONTROL   0x0186U
683 #define VIDEO_SET_CUR_EU_AVERAGE_BITRATE_CONTROL     0x0187U
684 #define VIDEO_SET_CUR_EU_CPB_SIZE_CONTROL            0x0188U
685 #define VIDEO_SET_CUR_EU_PEAK_BIT_RATE_CONTROL       0x0189U
686 #define VIDEO_SET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x018AU
687 #define VIDEO_SET_CUR_EU_SYNC_REF_FRAME_CONTROL      0x018BU
688 #define VIDEO_SET_CUR_EU_LTR_BUFFER_CONTROL          0x018CU
689 #define VIDEO_SET_CUR_EU_LTR_PICTURE_CONTROL         0x018DU
690 #define VIDEO_SET_CUR_EU_LTR_VALIDATION_CONTROL      0x018EU
691 #define VIDEO_SET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL     0x018FU
692 #define VIDEO_SET_CUR_EU_SEI_PAYLOADTYPE_CONTROL     0x0190U
693 #define VIDEO_SET_CUR_EU_QP_RANGE_CONTROL            0x0191U
694 #define VIDEO_SET_CUR_EU_PRIORITY_CONTROL            0x0192U
695 #define VIDEO_SET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x0193U
696 #define VIDEO_SET_CUR_EU_ERROR_RESILIENCY_CONTROL    0x0194U
697 #endif
698 
699 /*! @brief The payload header structure. */
700 struct video_payload_header {
701     uint8_t bHeaderLength; /*!< The payload header length. */
702     union {
703         uint8_t bmheaderInfo; /*!< The payload header bitmap field. */
704         struct
705         {
706             uint8_t frameIdentifier : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays
707                                              constant for the rest of the frame.*/
708             uint8_t endOfFrame      : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the
709                                         last video sample that belongs to a frame.*/
710             uint8_t
711                 presentationTimeStamp    : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of
712                                                a PTS field.*/
713             uint8_t sourceClockReference : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence
714                                                   of a SCR field.*/
715             uint8_t reserved             : 1U; /*!< Reserved. Set to 0. */
716             uint8_t stillImage           : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a
717                                          still image.*/
718             uint8_t errorBit             : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/
719             uint8_t endOfHeader          : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/
720         } headerInfoBits;
721         struct
722         {
723             uint8_t FID : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays constant
724                                  for the rest of the frame.*/
725             uint8_t EOI : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the last
726                                  video sample that belongs to a frame.*/
727             uint8_t PTS : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of a PTS field.*/
728             uint8_t SCR : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence of a SCR field.*/
729             uint8_t RES : 1U; /*!< Reserved. Set to 0. */
730             uint8_t STI : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a still
731                                  image.*/
732             uint8_t ERR : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/
733             uint8_t EOH : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/
734         } headerInfoBitmap;
735     } headerInfoUnion;
736     uint32_t dwPresentationTime;      /*!< Presentation time stamp (PTS) field.*/
737     uint8_t bSourceClockReference[6]; /*!< Source clock reference (SCR) field.*/
738 } __PACKED;
739 
740 /*! @brief The Video probe and commit controls structure.*/
741 struct video_probe_and_commit_controls {
742     union {
743         uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */
744         struct
745         {
746             uint8_t dwFrameInterval : 1U; /*!< dwFrameInterval field.*/
747             uint8_t wKeyFrameRate   : 1U; /*!< wKeyFrameRate field.*/
748             uint8_t wPFrameRate     : 1U; /*!< wPFrameRate field.*/
749             uint8_t wCompQuality    : 1U; /*!< wCompQuality field.*/
750             uint8_t wCompWindowSize : 1U; /*!< wCompWindowSize field.*/
751             uint8_t reserved        : 3U; /*!< Reserved field.*/
752         } hintBitmap;
753     } hintUnion;
754     union {
755         uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */
756         struct
757         {
758             uint8_t reserved : 8U; /*!< Reserved field.*/
759         } hintBitmap;
760     } hintUnion1;
761     uint8_t bFormatIndex;              /*!< Video format index from a format descriptor.*/
762     uint8_t bFrameIndex;               /*!< Video frame index from a frame descriptor.*/
763     uint32_t dwFrameInterval;          /*!< Frame interval in 100ns units.*/
764     uint16_t wKeyFrameRate;            /*!< Key frame rate in key-frame per video-frame units.*/
765     uint16_t wPFrameRate;              /*!< PFrame rate in PFrame/key frame units.*/
766     uint16_t wCompQuality;             /*!< Compression quality control in abstract units 0U (lowest) to 10000U (highest).*/
767     uint16_t wCompWindowSize;          /*!< Window size for average bit rate control.*/
768     uint16_t wDelay;                   /*!< Internal video streaming interface latency in ms from video data capture to presentation on
769                         the USB.*/
770     uint32_t dwMaxVideoFrameSize;      /*!< Maximum video frame or codec-specific segment size in bytes.*/
771     uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or
772                                           receive in a single payload transfer.*/
773     uint32_t dwClockFrequency;         /*!< The device clock frequency in Hz for the specified format. This specifies the
774                                   units used for the time information fields in the Video Payload Headers in the data
775                                   stream.*/
776     uint8_t bmFramingInfo;             /*!< Bit-field control supporting the following values: D0 Frame ID, D1 EOF.*/
777     uint8_t bPreferedVersion;          /*!< The preferred payload format version supported by the host or device for the
778                                   specified bFormatIndex value.*/
779     uint8_t bMinVersion;               /*!< The minimum payload format version supported by the device for the specified bFormatIndex
780                             value.*/
781     uint8_t bMaxVersion;               /*!< The maximum payload format version supported by the device for the specified bFormatIndex
782                             value.*/
783 #if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
784     uint8_t bUsage; /*!< This bitmap enables features reported by the bmUsages field of the Video Frame Descriptor.*/
785     uint8_t
786         bBitDepthLuma;                  /*!< Represents bit_depth_luma_minus8 + 8U, which must be the same as bit_depth_chroma_minus8 +
787                            8.*/
788     uint8_t bmSettings;                 /*!< A bitmap of flags that is used to discover and control specific features of a temporally
789                            encoded video stream.*/
790     uint8_t bMaxNumberOfRefFramesPlus1; /*!< Host indicates the maximum number of frames stored for use as references.*/
791     uint16_t bmRateControlModes;        /*!< This field contains 4U sub-fields, each of which is a 4U bit number.*/
792     uint64_t bmLayoutPerStream;         /*!< This field contains 4U sub-fields, each of which is a 2U byte number.*/
793 #endif
794 } __PACKED;
795 
796 /*! @brief The Video still probe and still commit controls structure.*/
797 struct video_still_probe_and_commit_controls {
798     uint8_t bFormatIndex;              /*!< Video format index from a format descriptor.*/
799     uint8_t bFrameIndex;               /*!< Video frame index from a frame descriptor.*/
800     uint8_t bCompressionIndex;         /*!< Compression index from a frame descriptor.*/
801     uint32_t dwMaxVideoFrameSize;      /*!< Maximum still image size in bytes.*/
802     uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or
803                                           receive in a single payload transfer.*/
804 } __PACKED;
805 
806 struct video_cs_if_vc_header_descriptor {
807     uint8_t bLength;
808     uint8_t bDescriptorType;
809     uint8_t bDescriptorSubType;
810     uint16_t bcdUVC;
811     uint16_t wTotalLength;
812     uint32_t dwClockFrequency;
813     uint8_t bInCollection;
814     uint8_t baInterfaceNr[];
815 } __PACKED;
816 
817 #define VIDEO_SIZEOF_VC_HEADER_DESC(n) (12 + n)
818 
819 struct video_cs_if_vc_input_terminal_descriptor {
820     uint8_t bLength;
821     uint8_t bDescriptorType;
822     uint8_t bDescriptorSubType;
823     uint8_t bTerminalID;
824     uint16_t wTerminalType;
825     uint8_t bAssocTerminal;
826     uint8_t iTerminal;
827     uint16_t wObjectiveFocalLenMin;
828     uint16_t wObjectiveFocalLenMax;
829     uint16_t wOcularFocalLength;
830     uint8_t bControlSize;
831     uint8_t bmaControls[];
832 } __PACKED;
833 
834 #define VIDEO_SIZEOF_VC_INPUT_TERMINAL_DESC(n) (15 + n)
835 
836 struct video_cs_if_vc_processing_unit_descriptor {
837     uint8_t bLength;
838     uint8_t bDescriptorType;
839     uint8_t bDescriptorSubType;
840     uint8_t bUnitID;
841     uint8_t bSourceID;
842     uint16_t wMaxMultiplier;
843     uint8_t bControlSize;
844     // uint8_t bmaControls[];
845     uint8_t iProcessing;
846     uint8_t bmVideoStandards;
847 } __PACKED;
848 
849 #define VIDEO_SIZEOF_VC_PROCESSING_UNIT_DESC(n) (10 + n)
850 
851 struct video_cs_if_vc_output_terminal_descriptor {
852     uint8_t bLength;
853     uint8_t bDescriptorType;
854     uint8_t bDescriptorSubType;
855     uint8_t bTerminalID;
856     uint16_t wTerminalType;
857     uint8_t bAssocTerminal;
858     uint8_t bSourceID;
859     uint8_t iTerminal;
860 } __PACKED;
861 
862 #define VIDEO_SIZEOF_VC_OUTPUT_TERMINAL_DESC 9
863 
864 struct video_cs_if_vc_extension_unit_descriptor {
865     uint8_t bLength;
866     uint8_t bDescriptorType;
867     uint8_t bDescriptorSubType;
868     uint8_t bUnitID;
869     uint8_t guidExtensionCode[16];
870     uint8_t bNumControls;
871     uint8_t bNrInPins;
872     // uint8_t baSourceID[];
873     uint8_t bControlSize;
874     // uint8_t bmControls[]
875     uint8_t iExtension;
876 } __PACKED;
877 
878 #define VIDEO_SIZEOF_VC_EXTENSION_UNIT_DESC(p, n) (24 + p + n)
879 
880 struct video_cs_ep_vc_ep_descriptor {
881     uint8_t bLength;
882     uint8_t bDescriptorType;
883     uint8_t bDescriptorSubType;
884     uint16_t wMaxTransferSize;
885 } __PACKED;
886 
887 #define VIDEO_SIZEOF_VC_EP_DESC 5
888 
889 struct video_cs_if_vs_input_header_descriptor {
890     uint8_t bLength;
891     uint8_t bDescriptorType;
892     uint8_t bDescriptorSubType;
893     uint8_t bNumFormats;
894     uint16_t wTotalLength;
895     uint8_t bEndpointAddress;
896     uint8_t bmInfo;
897     uint8_t bTerminalLink;
898     uint8_t bStillCaptureMethod;
899     uint8_t bTriggerSupport;
900     uint8_t bTriggerUsage;
901     uint8_t bControlSize;
902     uint8_t bmaControls[];
903 } __PACKED;
904 
905 #define VIDEO_SIZEOF_VS_INPUT_HEADER_DESC(p, n) (13 + p * n)
906 
907 struct video_cs_if_vs_output_header_descriptor {
908     uint8_t bLength;
909     uint8_t bDescriptorType;
910     uint8_t bDescriptorSubType;
911     uint8_t bNumFormats;
912     uint16_t wTotalLength;
913     uint8_t bEndpointAddress;
914     uint8_t bTerminalLink;
915     uint8_t bControlSize;
916     uint8_t bmaControls[];
917 } __PACKED;
918 
919 #define VIDEO_SIZEOF_VS_OUTPUT_TERMINAL_DESC(p, n) (9 + p * n)
920 
921 struct video_cs_if_vs_format_uncompressed_descriptor {
922     uint8_t bLength;
923     uint8_t bDescriptorType;
924     uint8_t bDescriptorSubType;
925     uint8_t bFormatIndex;
926     uint8_t bNumFrameDescriptors;
927     uint8_t guidFormat[16];
928     uint8_t bBitsPerPixel;
929     uint8_t bDefaultFrameIndex;
930     uint8_t bAspectRatioX;
931     uint8_t bAspectRatioY;
932     uint8_t bmInterlaceFlags;
933     uint8_t bCopyProtect;
934 } __PACKED;
935 
936 #define VIDEO_SIZEOF_VS_FORMAT_UNCOMPRESSED_DESC (27)
937 
938 struct video_cs_if_vs_frame_uncompressed_descriptor {
939     uint8_t bLength;
940     uint8_t bDescriptorType;
941     uint8_t bDescriptorSubType;
942     uint8_t bFrameIndex;
943     uint8_t bmCapabilities;
944     uint16_t wWidth;
945     uint16_t wHeight;
946     uint32_t dwMinBitRate;
947     uint32_t dwMaxBitRate;
948     uint32_t dwMaxVideoFrameBufferSize;
949     uint32_t dwDefaultFrameInterval;
950     uint8_t bFrameIntervalType;
951     uint32_t dwFrameInterval[];
952 } __PACKED;
953 
954 #define VIDEO_SIZEOF_VS_FRAME_UNCOMPRESSED_DESC(n) (26 + 4 * (n))
955 
956 struct video_cs_if_vs_format_mjpeg_descriptor {
957     uint8_t bLength;
958     uint8_t bDescriptorType;
959     uint8_t bDescriptorSubType;
960     uint8_t bFormatIndex;
961     uint8_t bNumFrameDescriptors;
962     uint8_t bmFlags;
963     uint8_t bDefaultFrameIndex;
964     uint8_t bAspectRatioX;
965     uint8_t bAspectRatioY;
966     uint8_t bmInterlaceFlags;
967     uint8_t bCopyProtect;
968 } __PACKED;
969 
970 #define VIDEO_SIZEOF_VS_FORMAT_MJPEG_DESC 11
971 
972 struct video_cs_if_vs_frame_mjpeg_descriptor {
973     uint8_t bLength;
974     uint8_t bDescriptorType;
975     uint8_t bDescriptorSubType;
976     uint8_t bFrameIndex;
977     uint8_t bmCapabilities;
978     uint16_t wWidth;
979     uint16_t wHeight;
980     uint32_t dwMinBitRate;
981     uint32_t dwMaxBitRate;
982     uint32_t dwMaxVideoFrameBufferSize;
983     uint32_t dwDefaultFrameInterval;
984     uint8_t bFrameIntervalType;
985     uint32_t dwFrameInterval[];
986 } __PACKED;
987 
988 #define VIDEO_SIZEOF_VS_FRAME_MJPEG_DESC(n) (26 + 4 * (n))
989 
990 /* H264 Payload - 3.1.1. H264 Video Format Descriptor */
991 struct video_cs_if_vs_format_h26x_descriptor {
992     uint8_t bLength;
993     uint8_t bDescriptorType;
994     uint8_t bDescriptorSubType;
995     uint8_t bFormatIndex;
996     uint8_t bNumFrameDescriptors;
997     uint8_t guidFormat[16];
998     uint8_t bBitsPerPixel;
999     uint8_t bDefaultFrameIndex;
1000     uint8_t bAspectRatioX;
1001     uint8_t bAspectRatioY;
1002     uint8_t bmInterfaceFlags;
1003     uint8_t bCopyProtect;
1004     uint8_t bVariableSize;
1005 } __PACKED;
1006 
1007 #define VIDEO_SIZEOF_VS_FORMAT_H264_DESC 28
1008 
1009 /* H264 Payload - 3.1.2. H264 Video Frame Descriptor */
1010 struct video_cs_if_vs_frame_h26x_descriptor {
1011     uint8_t bLength;
1012     uint8_t bDescriptorType;
1013     uint8_t bDescriptorSubType;
1014     uint8_t bFrameIndex;
1015     uint8_t bmCapabilities;
1016     uint16_t wWidth;
1017     uint16_t wHeight;
1018     uint32_t dwMinBitRate;
1019     uint32_t dwMaxBitRate;
1020     uint32_t dwDefaultFrameInterval;
1021     uint8_t bFrameIntervalType;
1022     uint32_t dwBytesPerLine;
1023     uint32_t dwFrameInterval[];
1024 } __PACKED;
1025 
1026 #define VIDEO_SIZEOF_VS_FRAME_H264_DESC(n) (26 + 4 * (n))
1027 
1028 struct video_cs_if_vs_colorformat_descriptor {
1029     uint8_t bLength;
1030     uint8_t bDescriptorType;
1031     uint8_t bDescriptorSubType;
1032     uint8_t bColorPrimaries;
1033     uint8_t bXferCharacteristics;
1034     uint8_t bMatrixCoefficients;
1035 } __PACKED;
1036 
1037 #define VIDEO_SIZEOF_VS_COLORFORMAT_DESC 6
1038 
1039 struct video_vc_input_terminal_bmcontrol_bitmap {
1040     uint32_t scanning_mode          : 1;
1041     uint32_t auto_exposure_mode     : 1;
1042     uint32_t auto_exposure_priority : 1;
1043     uint32_t exposure_time_absolute : 1;
1044     uint32_t exposure_time_relative : 1;
1045     uint32_t focus_absolute         : 1;
1046     uint32_t focus_relative         : 1;
1047     uint32_t iris_absolute          : 1;
1048     uint32_t iris_relative          : 1;
1049     uint32_t zoom_absolute          : 1;
1050     uint32_t zoom_relative          : 1;
1051     uint32_t pantilt_absolute       : 1;
1052     uint32_t pantilt_relative       : 1;
1053     uint32_t roll_absolute          : 1;
1054     uint32_t roll_relative          : 1;
1055     uint32_t reserved               : 2;
1056     uint32_t focus_auto             : 1;
1057     uint32_t pricvcy                : 1;
1058 };
1059 
1060 struct video_vc_processing_unit_bmcontrol_bitmap {
1061     uint16_t brightness          : 1;
1062     uint16_t contrast            : 1;
1063     uint16_t hue                 : 1;
1064     uint16_t saturation          : 1;
1065     uint16_t sharpness           : 1;
1066     uint16_t gamma               : 1;
1067     uint16_t white_bal_temp      : 1;
1068     uint16_t white_bal_comp      : 1;
1069     uint16_t backlight_comp      : 1;
1070     uint16_t gain                : 1;
1071     uint16_t power_line_freq     : 1;
1072     uint16_t hue_auto            : 1;
1073     uint16_t white_bal_temp_auto : 1;
1074     uint16_t white_bal_comp_auto : 1;
1075     uint16_t digital_mult        : 1;
1076     uint16_t digital_mult_limit  : 1;
1077 };
1078 
1079 struct video_camera_capabilities {
1080     uint8_t support_get_request        : 1;
1081     uint8_t support_set_request        : 1;
1082     uint8_t disabled_by_automatic_mode : 1;
1083     uint8_t auto_update_control        : 1;
1084     uint8_t async_control              : 1;
1085     uint8_t reserved                   : 3;
1086 };
1087 
1088 struct video_autoexposure_mode {
1089     uint8_t manual_mode            : 1;
1090     uint8_t auto_mode              : 1;
1091     uint8_t shutter_priority_mode  : 1;
1092     uint8_t aperture_priority_mode : 1;
1093     uint8_t reserved               : 4;
1094 };
1095 
1096 #define VIDEO_GUID_YUY2 0x59, 0x55, 0x59, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
1097 #define VIDEO_GUID_NV12 0x4E, 0x56, 0x31, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
1098 #define VIDEO_GUID_NV21 0x4E, 0x56, 0x32, 0x31, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
1099 #define VIDEO_GUID_M420 0x4D, 0x34, 0x32, 0x30, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
1100 #define VIDEO_GUID_I420 0x49, 0x34, 0x32, 0x30, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
1101 #define VIDEO_GUID_H264 0x48, 0x32, 0x36, 0x34, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
1102 
1103 #define VIDEO_VC_TERMINAL_LEN (13 + 18 + 12 + 9)
1104 
1105 /*Length of template descriptor: 81 bytes*/
1106 #define VIDEO_VC_DESCRIPTOR_LEN      (8 + 9 + VIDEO_VC_TERMINAL_LEN + 7 + 5)
1107 #define VIDEO_VC_NOEP_DESCRIPTOR_LEN (8 + 9 + VIDEO_VC_TERMINAL_LEN)
1108 
1109 // clang-format off
1110 #define VIDEO_VC_DESCRIPTOR_INIT(bFirstInterface, bEndpointAddress, bcdUVC, wTotalLength, dwClockFrequency, stridx)                                                                                          \
1111     /* Interface Association Descriptor */                                                                                                                                                                   \
1112     0x08,                                                                                                                                                                                                    \
1113     USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                                                                                               \
1114     bFirstInterface,                                                                                                                                                                                         \
1115     0x02,                                                                                                                                                                                                    \
1116     USB_DEVICE_CLASS_VIDEO,                                                                                                                                                                                  \
1117     VIDEO_SC_VIDEO_INTERFACE_COLLECTION,                                                                                                                                                                     \
1118     0x00,                                                                                                                                                                                                    \
1119     0x00,                                                                                                                      /* VideoControl Interface Descriptor */                                       \
1120     0x09,                                                                                                                      /* bLength */                                                                 \
1121     USB_DESCRIPTOR_TYPE_INTERFACE,                                                                                             /* bDescriptorType */                                                         \
1122     0x00,                                                                                                                      /* bInterfaceNumber */                                                        \
1123     0x00,                                                                                                                      /* bAlternateSetting */                                                       \
1124     0x01,                                                                                                                         /* bNumEndpoints:1 endpoint (interrupt endpoint) */                           \
1125     USB_DEVICE_CLASS_VIDEO,                                                                                                    /* bInterfaceClass : CC_VIDEO */                                              \
1126     VIDEO_SC_VIDEOCONTROL,                                                                                                     /* bInterfaceSubClass : SC_VIDEOCONTROL */                                    \
1127     VIDEO_PC_PROTOCOL_UNDEFINED,                                                                                               /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */                              \
1128     stridx, /* iInterface:Index to string descriptor that contains the string <Your Product Name> */                           /*Class-specific VideoControl Interface Descriptor */                         \
1129     0x0d,                                                                                                                      /* bLength */                                                                 \
1130     0x24,                                                                                                                      /* bDescriptorType : CS_INTERFACE */                                          \
1131     VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE,                                                                                        /* bDescriptorSubType : VC_HEADER subtype */                                  \
1132     WBVAL(bcdUVC),                                                                                                             /* bcdUVC : Revision of class specification that this device is based upon.*/ \
1133     WBVAL(wTotalLength),                                                                                                       /* wTotalLength  */                                                           \
1134     DBVAL(dwClockFrequency),                                                                                                   /* dwClockFrequency : 0x005b8d80 -> 6,000,000 == 6MHz*/                       \
1135     0x01,                                                                                                                      /* bInCollection : Number of streaming interfaces. */                         \
1136     (uint8_t)(bFirstInterface + 1), /* baInterfaceNr(0) : VideoStreaming interface 1 belongs to this VideoControl interface.*/ /* Input Terminal 1 -> Processing Unit 2 -> Output Terminal 3 */              \
1137     0x12,                                                                                                                                                                                                    \
1138     0x24,                                                                                                                                                                                                    \
1139     VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                              \
1140     0x01,                    /* bTerminalID */                                                                                                                                                               \
1141     WBVAL(VIDEO_ITT_CAMERA), /* wTerminalType : 0x0201 Camera Sensor*/                                                                                                                                       \
1142     0x00,                    /* bAssocTerminal */                                                                                                                                                            \
1143     0x00,                    /* iTerminal */                                                                                                                                                                 \
1144     WBVAL(0x0000),           /* wObjectiveFocalLengthMin */                                                                                                                                                  \
1145     WBVAL(0x0000),           /* wObjectiveFocalLengthMax */                                                                                                                                                  \
1146     WBVAL(0x0000),           /* wOcularFocalLength */                                                                                                                                                        \
1147     0x03,                    /* bControlSize */                                                                                                                                                              \
1148     0x00, 0x00, 0x00,        /* bmControls */                                                                                                                                                                \
1149     0x0c,                                                                                                                                                                                                    \
1150     0x24,                                                                                                                                                                                                    \
1151     VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
1152     0x02,       /* bUnitID  */                                                                                                                                                                               \
1153     0x01,       /* bSourceID */                                                                                                                                                                              \
1154     0x00, 0x00, /* wMaxMultiplier  */                                                                                                                                                                        \
1155     0x02,       /* bControlSize   */                                                                                                                                                                         \
1156     0x00, 0x00, /* bmControls */                                                                                                                                                                             \
1157     0x00,       /* iProcessing */                                                                                                                                                                            \
1158     0x00,       /* bmVideoStandards */                                                                                                                                                                       \
1159     0x09,                                                                                                                                                                                                    \
1160     0x24,                                                                                                                                                                                                    \
1161     VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
1162     0x03, /* bTerminalID */                                                                                                                                                                                  \
1163     WBVAL(VIDEO_TT_STREAMING),                                                                                                                                                                               \
1164     0x00,                         /* bAssocTerminal   */                                                                                                                                                     \
1165     0x02,                         /* bSourceID   */                                                                                                                                                          \
1166     0x00,                         /* iTerminal   */                                                                                                                                                          \
1167     0x07,                         /* bLength */                                                                                                                                                              \
1168     USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */                                                                                                                                                      \
1169     bEndpointAddress,             /* bEndpointAddress */                                                                                                                                                     \
1170     0x03,                         /* bmAttributes */                                                                                                                                                         \
1171     0x10, 0x00,                   /* wMaxPacketSize */                                                                                                                                                       \
1172     0x08,                         /* bInterval */                                                                                                                                                            \
1173     /* Class-specific VC Interrupt Endpoint Descriptor */                                                                                                                                                    \
1174     0x05, 0x25, 0x03, 0x10, 0x00
1175 
1176 #define VIDEO_VC_NOEP_DESCRIPTOR_INIT(bFirstInterface, bEndpointAddress, bcdUVC, wTotalLength, dwClockFrequency, stridx)                                                                                          \
1177     /* Interface Association Descriptor */                                                                                                                                                                   \
1178     0x08,                                                                                                                                                                                                    \
1179     USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                                                                                               \
1180     bFirstInterface,                                                                                                                                                                                         \
1181     0x02,                                                                                                                                                                                                    \
1182     USB_DEVICE_CLASS_VIDEO,                                                                                                                                                                                  \
1183     VIDEO_SC_VIDEO_INTERFACE_COLLECTION,                                                                                                                                                                     \
1184     0x00,                                                                                                                                                                                                    \
1185     0x00,                                                                                                                      /* VideoControl Interface Descriptor */                                       \
1186     0x09,                                                                                                                      /* bLength */                                                                 \
1187     USB_DESCRIPTOR_TYPE_INTERFACE,                                                                                             /* bDescriptorType */                                                         \
1188     0x00,                                                                                                                      /* bInterfaceNumber */                                                        \
1189     0x00,                                                                                                                      /* bAlternateSetting */                                                       \
1190     0x00,                                                                                                                         /* bNumEndpoints:1 endpoint (interrupt endpoint) */                           \
1191     USB_DEVICE_CLASS_VIDEO,                                                                                                    /* bInterfaceClass : CC_VIDEO */                                              \
1192     VIDEO_SC_VIDEOCONTROL,                                                                                                     /* bInterfaceSubClass : SC_VIDEOCONTROL */                                    \
1193     VIDEO_PC_PROTOCOL_UNDEFINED,                                                                                               /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */                              \
1194     stridx, /* iInterface:Index to string descriptor that contains the string <Your Product Name> */                           /*Class-specific VideoControl Interface Descriptor */                         \
1195     0x0d,                                                                                                                      /* bLength */                                                                 \
1196     0x24,                                                                                                                      /* bDescriptorType : CS_INTERFACE */                                          \
1197     VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE,                                                                                        /* bDescriptorSubType : VC_HEADER subtype */                                  \
1198     WBVAL(bcdUVC),                                                                                                             /* bcdUVC : Revision of class specification that this device is based upon.*/ \
1199     WBVAL(wTotalLength),                                                                                                       /* wTotalLength  */                                                           \
1200     DBVAL(dwClockFrequency),                                                                                                   /* dwClockFrequency : 0x005b8d80 -> 6,000,000 == 6MHz*/                       \
1201     0x01,                                                                                                                      /* bInCollection : Number of streaming interfaces. */                         \
1202     (uint8_t)(bFirstInterface + 1), /* baInterfaceNr(0) : VideoStreaming interface 1 belongs to this VideoControl interface.*/ /* Input Terminal 1 -> Processing Unit 2 -> Output Terminal 3 */              \
1203     0x12,                                                                                                                                                                                                    \
1204     0x24,                                                                                                                                                                                                    \
1205     VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                              \
1206     0x01,                    /* bTerminalID */                                                                                                                                                               \
1207     WBVAL(VIDEO_ITT_CAMERA), /* wTerminalType : 0x0201 Camera Sensor*/                                                                                                                                       \
1208     0x00,                    /* bAssocTerminal */                                                                                                                                                            \
1209     0x00,                    /* iTerminal */                                                                                                                                                                 \
1210     WBVAL(0x0000),           /* wObjectiveFocalLengthMin */                                                                                                                                                  \
1211     WBVAL(0x0000),           /* wObjectiveFocalLengthMax */                                                                                                                                                  \
1212     WBVAL(0x0000),           /* wOcularFocalLength */                                                                                                                                                        \
1213     0x03,                    /* bControlSize */                                                                                                                                                              \
1214     0x00, 0x00, 0x00,        /* bmControls */                                                                                                                                                                \
1215     0x0c,                                                                                                                                                                                                    \
1216     0x24,                                                                                                                                                                                                    \
1217     VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
1218     0x02,       /* bUnitID  */                                                                                                                                                                               \
1219     0x01,       /* bSourceID */                                                                                                                                                                              \
1220     0x00, 0x00, /* wMaxMultiplier  */                                                                                                                                                                        \
1221     0x02,       /* bControlSize   */                                                                                                                                                                         \
1222     0x00, 0x00, /* bmControls */                                                                                                                                                                             \
1223     0x00,       /* iProcessing */                                                                                                                                                                            \
1224     0x00,       /* bmVideoStandards */                                                                                                                                                                       \
1225     0x09,                                                                                                                                                                                                    \
1226     0x24,                                                                                                                                                                                                    \
1227     VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
1228     0x03, /* bTerminalID */                                                                                                                                                                                  \
1229     WBVAL(VIDEO_TT_STREAMING),                                                                                                                                                                               \
1230     0x00,                         /* bAssocTerminal   */                                                                                                                                                     \
1231     0x02,                         /* bSourceID   */                                                                                                                                                          \
1232     0x00                          /* iTerminal   */                                                                                                                                                          \
1233 
1234 #define VIDEO_VS_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bNumEndpoints)        \
1235     /* Video Streaming (VS) Interface Descriptor */                                         \
1236     0x09,                              /* bLength */                                        \
1237     USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType : INTERFACE */                        \
1238     bInterfaceNumber,              /* bInterfaceNumber: Index of this interface */          \
1239     bAlternateSetting,             /* bAlternateSetting: Index of this alternate setting */ \
1240     bNumEndpoints,                 /* bNumEndpoints : 0 endpoints,  no bandwidth used*/     \
1241     0x0e,                          /* bInterfaceClass : CC_VIDEO */                         \
1242     0x02,                          /* bInterfaceSubClass : SC_VIDEOSTREAMING */             \
1243     0x00,                          /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */         \
1244     0x00                           /* iInterface : unused */
1245 
1246 #define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(bNumFormats, wTotalLength, bEndpointAddress, ...)                         \
1247     /*Class-specific VideoStream Header Descriptor (Input) */                                                           \
1248     0x0d + PP_NARG(__VA_ARGS__),                                                                                        \
1249     0x24,                                                                                                               \
1250     VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE,                                                                           \
1251     bNumFormats, /* bNumFormats : One format descriptor follows. */                                                     \
1252     WBVAL(wTotalLength),                                                                                                \
1253     bEndpointAddress,                                                                                                   \
1254     0x00,                 /* bmInfo : No dynamic format change supported. */                                            \
1255     0x03,                 /* bTerminalLink : This VideoStreaming interface supplies terminal ID 2 (Output Terminal). */ \
1256     0x00,                 /* bStillCaptureMethod : Device supports still image capture method 0. */                     \
1257     0x00,                 /* bTriggerSupport : Hardware trigger supported for still image capture */                    \
1258     0x00,                 /* bTriggerUsage : Hardware trigger should initiate a still image capture. */                 \
1259     0x01,                 /* bControlSize : Size of the bmaControls field */                                            \
1260     __VA_ARGS__           /* bmaControls : No VideoStreaming specific controls are supported.*/
1261 
1262 #define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_INIT(bNumFormats, wTotalLength, bEndpointAddress, ...)                        \
1263     /*Class-specific VideoStream Header Descriptor (Input) */                                                           \
1264     0x0d + PP_NARG(__VA_ARGS__),                                                                                        \
1265     0x24,                                                                                                               \
1266     VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE,                                                                          \
1267     bNumFormats, /* bNumFormats : One format descriptor follows. */                                                     \
1268     WBVAL(wTotalLength),                                                                                                \
1269     bEndpointAddress,                                                                                                   \
1270     0x00,                 /* bmInfo : No dynamic format change supported. */                                            \
1271     0x03,                 /* bTerminalLink : This VideoStreaming interface supplies terminal ID 2 (Output Terminal). */ \
1272     0x00,                 /* bStillCaptureMethod : Device supports still image capture method 0. */                     \
1273     0x00,                 /* bTriggerSupport : Hardware trigger supported for still image capture */                    \
1274     0x00,                 /* bTriggerUsage : Hardware trigger should initiate a still image capture. */                 \
1275     PP_NARG(__VA_ARGS__), /* bControlSize : Size of the bmaControls field */                                            \
1276     __VA_ARGS__           /* bmaControls : No VideoStreaming specific controls are supported.*/
1277 
1278 #define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors, GUIDFormat)                                                              \
1279     /*Payload Format(UNCOMPRESSED) Descriptor */                                                                                                                  \
1280     0x1b,                                                                                                                                                         \
1281     0x24,                                                                                                                                                         \
1282     VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FORMAT_UNCOMPRESSED subtype */                                                    \
1283     bFormatIndex,                                    /* bFormatIndex : First (and only) format descriptor */                                                      \
1284     bNumFrameDescriptors,                            /* bNumFrameDescriptors : One frame descriptor for this format follows. */                                   \
1285     GUIDFormat,                                      /* GUID Format YUY2 {32595559-0000-0010-8000-00AA00389B71} */                                                \
1286     0x10,                                            /* bBitsPerPixel : Number of bits per pixel used to specify color in the decoded video frame - 16 for yuy2*/ \
1287     0x01,                                            /* bDefaultFrameIndex : Default frame index is 1. */                                                         \
1288     0x00,                                            /* bAspectRatioX : Non-interlaced stream not required. */                                                    \
1289     0x00,                                            /* bAspectRatioY : Non-interlaced stream not required. */                                                    \
1290     0x00,                                            /* bmInterlaceFlags : Non-interlaced stream */                                                               \
1291     0x00                                             /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */
1292 
1293 #define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate,           \
1294                                                     dwMaxVideoFrameBufferSize, dwDefaultFrameInterval, bFrameIntervalType, ...) \
1295     0x1a + PP_NARG(__VA_ARGS__),                                                                                                               \
1296     0x24,                                                                                                           \
1297     VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE,                                                                 \
1298     bFrameIndex,                                                                                                    \
1299     0x00,                                                                                                           \
1300     WBVAL(wWidth),                                                                                                  \
1301     WBVAL(wHeight),                                                                                                 \
1302     DBVAL(dwMinBitRate),                                                                                            \
1303     DBVAL(dwMaxBitRate),                                                                                            \
1304     DBVAL(dwMaxVideoFrameBufferSize),                                                                               \
1305     dwDefaultFrameInterval,                  /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */                                                                                         \
1306     bFrameIntervalType,                      /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame   */ \
1307     __VA_ARGS__
1308 
1309 #define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors)                    \
1310     /*Payload Format(MJPEG) Descriptor */                                                            \
1311     0x0b,                     /* bLength */                                                          \
1312     0x24,                 /* bDescriptorType : CS_INTERFACE */                                       \
1313     0x06,                 /* bDescriptorSubType : VS_FORMAT_MJPEG subtype */                         \
1314     bFormatIndex,         /* bFormatIndex : First (and only) format descriptor */                    \
1315     bNumFrameDescriptors, /* bNumFrameDescriptors : One frame descriptor for this format follows. */ \
1316     0x00,                 /* bmFlags : Uses fixed size samples.. */                                  \
1317     0x01,                 /* bDefaultFrameIndex : Default frame index is 1. */                       \
1318     0x00,                 /* bAspectRatioX : Non-interlaced stream,  not required. */                \
1319     0x00,                 /* bAspectRatioY : Non-interlaced stream,  not required. */                \
1320     0x00,                 /* bmInterlaceFlags : Non-interlaced stream */                             \
1321     0x00                  /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */
1322 
1323 #define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate,                                                                                          \
1324                                              dwMaxVideoFrameBufferSize, dwDefaultFrameInterval, bFrameIntervalType, ...)                                                                        \
1325     0x1a + PP_NARG(__VA_ARGS__),                 /* bLength */                                                                                                                                  \
1326     0x24,                                    /* bDescriptorType : CS_INTERFACE */                                                                                                               \
1327     VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FRAME_MJPEG */                                                                                                          \
1328     bFrameIndex,                             /* bFrameIndex : First (and only) frame descriptor */                                                                                              \
1329     0x00,                                    /* bmCapabilities : Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate. */                               \
1330     WBVAL(wWidth),                           /* wWidth (2bytes): Width of frame is 128 pixels. */                                                                                               \
1331     WBVAL(wHeight),                          /* wHeight (2bytes): Height of frame is 64 pixels. */                                                                                              \
1332     DBVAL(dwMinBitRate),                     /* dwMinBitRate (4bytes): Min bit rate in bits/s  */                                                                                               \
1333     DBVAL(dwMaxBitRate),                     /* dwMaxBitRate (4bytes): Max bit rate in bits/s  */                                                                                               \
1334     DBVAL(dwMaxVideoFrameBufferSize),        /* dwMaxVideoFrameBufSize (4bytes): Maximum video or still frame size, in bytes. */                                                                \
1335     dwDefaultFrameInterval,                  /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */                                                                                         \
1336     bFrameIntervalType,                      /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame   */ \
1337     __VA_ARGS__
1338 
1339 #define VIDEO_VS_FORMAT_H264_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors)                     \
1340     /*Payload Format(H.264) Descriptor */                                                            \
1341     0x1c,                 /* bLength */                                                              \
1342     0x24,                 /* bDescriptorType : CS_INTERFACE */                                       \
1343     VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE,  /* bDescriptorSubType : VS_FORMAT_FRAME_BASED subtype */\
1344     bFormatIndex,         /* bFormatIndex : First (and only) format descriptor */                    \
1345     bNumFrameDescriptors, /* bNumFrameDescriptors : One frame descriptor for this format follows. */ \
1346     VIDEO_GUID_H264,                                                                                 \
1347     0x00,                 /* bmFlags : Uses fixed size samples.. */                                  \
1348     0x01,                 /* bDefaultFrameIndex : Default frame index is 1. */                       \
1349     0x00,                 /* bAspectRatioX : Non-interlaced stream,  not required. */                \
1350     0x00,                 /* bAspectRatioY : Non-interlaced stream,  not required. */                \
1351     0x00,                 /* bmInterlaceFlags : Non-interlaced stream */                             \
1352     0x00,                 /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */ \
1353     0x00                  /* Variable size: False */
1354 
1355 #define VIDEO_VS_FRAME_H264_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate,                                                                                                 \
1356                                             dwDefaultFrameInterval, bFrameIntervalType, ...)                                                                                                          \
1357     0x1a + PP_NARG(__VA_ARGS__),                       /* bLength */                                                                                                                                  \
1358     0x24,                                          /* bDescriptorType : CS_INTERFACE */                                                                                                               \
1359     VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FRAME_BASED */                                                                                                          \
1360     bFrameIndex,                                   /* bFrameIndex : First (and only) frame descriptor */                                                                                              \
1361     0x00,                                          /* bmCapabilities : Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate. */                               \
1362     WBVAL(wWidth),                                 /* wWidth (2bytes): Width of frame is 128 pixels. */                                                                                               \
1363     WBVAL(wHeight),                                /* wHeight (2bytes): Height of frame is 64 pixels. */                                                                                              \
1364     DBVAL(dwMinBitRate),                           /* dwMinBitRate (4bytes): Min bit rate in bits/s  */                                                                                               \
1365     DBVAL(dwMaxBitRate),                           /* dwMaxBitRate (4bytes): Max bit rate in bits/s  */                                                                                               \
1366     dwDefaultFrameInterval,                        /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */                                                                                         \
1367     bFrameIntervalType,                            /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame   */ \
1368     DBVAL(0x00),                                   /* dwBytesPerLine (4bytes) */                                                                                                                      \
1369     __VA_ARGS__
1370 
1371 #define VIDEO_VS_COLOR_MATCHING_DESCRIPTOR_INIT()                                      \
1372     0x06,                                    /* bLength */                             \
1373     0x24,                                    /* bDescriptorType : CS_INTERFACE */      \
1374     VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_COLORFORMAT */ \
1375     0x01,                                    /* bColorPrimaries */                     \
1376     0x01,                                    /* bTransferCharacteristics */            \
1377     0x04                                     /* bMatrixCoefficients */
1378 
1379 // clang-format on
1380 #endif /*USB_VIDEO_H */