summaryrefslogtreecommitdiff
path: root/class/video/usb_video.h
blob: 6b1a9ac5d5481464fdb107fedbcb56864c95f846 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
/*
 * Copyright (c) 2022, sakumisu
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#ifndef USB_VIDEO_H
#define USB_VIDEO_H

#define USB_DEVICE_VIDEO_CLASS_VERSION_1_5 0

/*! @brief Video device subclass code */
#define VIDEO_SC_UNDEFINED                  0x00U
#define VIDEO_SC_VIDEOCONTROL               0x01U
#define VIDEO_SC_VIDEOSTREAMING             0x02U
#define VIDEO_SC_VIDEO_INTERFACE_COLLECTION 0x03U

/*! @brief Video device protocol code */
#define VIDEO_PC_PROTOCOL_UNDEFINED 0x00U
#define VIDEO_PC_PROTOCOL_15        0x01U

/*! @brief Video device class-specific descriptor type */
#define VIDEO_CS_UNDEFINED_DESCRIPTOR_TYPE     0x20U
#define VIDEO_CS_DEVICE_DESCRIPTOR_TYPE        0x21U
#define VIDEO_CS_CONFIGURATION_DESCRIPTOR_TYPE 0x22U
#define VIDEO_CS_STRING_DESCRIPTOR_TYPE        0x23U
#define VIDEO_CS_INTERFACE_DESCRIPTOR_TYPE     0x24U
#define VIDEO_CS_ENDPOINT_DESCRIPTOR_TYPE      0x25U

/*! @brief Video device class-specific VC interface descriptor subtype */
#define VIDEO_VC_DESCRIPTOR_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U
#define VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE               0x01U
#define VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE       0x02U
#define VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE      0x03U
#define VIDEO_VC_SELECTOR_UNIT_DESCRIPTOR_SUBTYPE        0x04U
#define VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE      0x05U
#define VIDEO_VC_EXTENSION_UNIT_DESCRIPTOR_SUBTYPE       0x06U
#define VIDEO_VC_ENCODING_UNIT_DESCRIPTOR_SUBTYPE        0x07U

/*! @brief Video device class-specific VS interface descriptor subtype */
#define VIDEO_VS_UNDEFINED_DESCRIPTOR_SUBTYPE             0x00U
#define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE          0x01U
#define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE         0x02U
#define VIDEO_VS_STILL_IMAGE_FRAME_DESCRIPTOR_SUBTYPE     0x03U
#define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE   0x04U
#define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE    0x05U
#define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_SUBTYPE          0x06U
#define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE           0x07U
#define VIDEO_VS_FORMAT_MPEG2TS_DESCRIPTOR_SUBTYPE        0x0AU
#define VIDEO_VS_FORMAT_DV_DESCRIPTOR_SUBTYPE             0x0CU
#define VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE           0x0DU
#define VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE    0x10U
#define VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE     0x11U
#define VIDEO_VS_FORMAT_STREAM_BASED_DESCRIPTOR_SUBTYPE   0x12U
#define VIDEO_VS_FORMAT_H264_DESCRIPTOR_SUBTYPE           0x13U
#define VIDEO_VS_FRAME_H264_DESCRIPTOR_SUBTYPE            0x14U
#define VIDEO_VS_FORMAT_H264_SIMULCAST_DESCRIPTOR_SUBTYPE 0x15U
#define VIDEO_VS_FORMAT_VP8_DESCRIPTOR_SUBTYPE            0x16U
#define VIDEO_VS_FRAME_VP8_DESCRIPTOR_SUBTYPE             0x17U
#define VIDEO_VS_FORMAT_VP8_SIMULCAST_DESCRIPTOR_SUBTYPE  0x18U

/*! @brief Video device class-specific VC endpoint descriptor subtype */
#define VIDEO_EP_UNDEFINED_DESCRIPTOR_SUBTYPE 0x00U
#define VIDEO_EP_GENERAL_DESCRIPTOR_SUBTYPE   0x01U
#define VIDEO_EP_ENDPOINT_DESCRIPTOR_SUBTYPE  0x02U
#define VIDEO_EP_INTERRUPT_DESCRIPTOR_SUBTYPE 0x03U

/*! @brief Video device class-specific request code */
#define VIDEO_REQUEST_UNDEFINED   0x00U
#define VIDEO_REQUEST_SET_CUR     0x01U
#define VIDEO_REQUEST_SET_CUR_ALL 0x11U
#define VIDEO_REQUEST_GET_CUR     0x81U
#define VIDEO_REQUEST_GET_MIN     0x82U
#define VIDEO_REQUEST_GET_MAX     0x83U
#define VIDEO_REQUEST_GET_RES     0x84U
#define VIDEO_REQUEST_GET_LEN     0x85U
#define VIDEO_REQUEST_GET_INFO    0x86U
#define VIDEO_REQUEST_GET_DEF     0x87U
#define VIDEO_REQUEST_GET_CUR_ALL 0x91U
#define VIDEO_REQUEST_GET_MIN_ALL 0x92U
#define VIDEO_REQUEST_GET_MAX_ALL 0x93U
#define VIDEO_REQUEST_GET_RES_ALL 0x94U
#define VIDEO_REQUEST_GET_DEF_ALL 0x97U

/*! @brief Video device class-specific VideoControl interface control selector */
#define VIDEO_VC_CONTROL_UNDEFINED          0x00U
#define VIDEO_VC_VIDEO_POWER_MODE_CONTROL   0x01U
#define VIDEO_VC_REQUEST_ERROR_CODE_CONTROL 0x02U

/*! @brief Video device class-specific Terminal control selector */
#define VIDEO_TE_CONTROL_UNDEFINED 0x00U

/*! @brief Video device class-specific Selector Unit control selector */
#define VIDEO_SU_CONTROL_UNDEFINED    0x00U
#define VIDEO_SU_INPUT_SELECT_CONTROL 0x01U

/*! @brief Video device class-specific Camera Terminal control selector */
#define VIDEO_CT_CONTROL_UNDEFINED              0x00U
#define VIDEO_CT_SCANNING_MODE_CONTROL          0x01U
#define VIDEO_CT_AE_MODE_CONTROL                0x02U
#define VIDEO_CT_AE_PRIORITY_CONTROL            0x03U
#define VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x04U
#define VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x05U
#define VIDEO_CT_FOCUS_ABSOLUTE_CONTROL         0x06U
#define VIDEO_CT_FOCUS_RELATIVE_CONTROL         0x07U
#define VIDEO_CT_FOCUS_AUTO_CONTROL             0x08U
#define VIDEO_CT_IRIS_ABSOLUTE_CONTROL          0x09U
#define VIDEO_CT_IRIS_RELATIVE_CONTROL          0x0AU
#define VIDEO_CT_ZOOM_ABSOLUTE_CONTROL          0x0BU
#define VIDEO_CT_ZOOM_RELATIVE_CONTROL          0x0CU
#define VIDEO_CT_PANTILT_ABSOLUTE_CONTROL       0x0DU
#define VIDEO_CT_PANTILT_RELATIVE_CONTROL       0x0EU
#define VIDEO_CT_ROLL_ABSOLUTE_CONTROL          0x0FU
#define VIDEO_CT_ROLL_RELATIVE_CONTROL          0x10U
#define VIDEO_CT_PRIVACY_CONTROL                0x11U
#define VIDEO_CT_FOCUS_SIMPLE_CONTROL           0x12U
#define VIDEO_CT_WINDOW_CONTROL                 0x13U
#define VIDEO_CT_REGION_OF_INTEREST_CONTROL     0x14U

/*! @brief Video device class-specific Processing Unit control selector */
#define VIDEO_PU_CONTROL_UNDEFINED                      0x00U
#define VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL         0x01U
#define VIDEO_PU_BRIGHTNESS_CONTROL                     0x02U
#define VIDEO_PU_CONTRAST_CONTROL                       0x03U
#define VIDEO_PU_GAIN_CONTROL                           0x04U
#define VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL           0x05U
#define VIDEO_PU_HUE_CONTROL                            0x06U
#define VIDEO_PU_SATURATION_CONTROL                     0x07U
#define VIDEO_PU_SHARPNESS_CONTROL                      0x08U
#define VIDEO_PU_GAMMA_CONTROL                          0x09U
#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x0AU
#define VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x0BU
#define VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x0CU
#define VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x0DU
#define VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL             0x0EU
#define VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x0FU
#define VIDEO_PU_HUE_AUTO_CONTROL                       0x10U
#define VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL          0x11U
#define VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL             0x12U
#define VIDEO_PU_CONTRAST_AUTO_CONTROL                  0x13U

/*! @brief Video device class-specific Encoding Unit control selector */
#define VIDEO_EU_CONTROL_UNDEFINED           0x00U
#define VIDEO_EU_SELECT_LAYER_CONTROL        0x01U
#define VIDEO_EU_PROFILE_TOOLSET_CONTROL     0x02U
#define VIDEO_EU_VIDEO_RESOLUTION_CONTROL    0x03U
#define VIDEO_EU_MIN_FRAME_INTERVAL_CONTROL  0x04U
#define VIDEO_EU_SLICE_MODE_CONTROL          0x05U
#define VIDEO_EU_RATE_CONTROL_MODE_CONTROL   0x06U
#define VIDEO_EU_AVERAGE_BITRATE_CONTROL     0x07U
#define VIDEO_EU_CPB_SIZE_CONTROL            0x08U
#define VIDEO_EU_PEAK_BIT_RATE_CONTROL       0x09U
#define VIDEO_EU_QUANTIZATION_PARAMS_CONTROL 0x0AU
#define VIDEO_EU_SYNC_REF_FRAME_CONTROL      0x0BU
#define VIDEO_EU_LTR_BUFFER_CONTROL          0x0CU
#define VIDEO_EU_LTR_PICTURE_CONTROL         0x0DU
#define VIDEO_EU_LTR_VALIDATION_CONTROL      0x0EU
#define VIDEO_EU_LEVEL_IDC_LIMIT_CONTROL     0x0FU
#define VIDEO_EU_SEI_PAYLOADTYPE_CONTROL     0x10U
#define VIDEO_EU_QP_RANGE_CONTROL            0x11U
#define VIDEO_EU_PRIORITY_CONTROL            0x12U
#define VIDEO_EU_START_OR_STOP_LAYER_CONTROL 0x13U
#define VIDEO_EU_ERROR_RESILIENCY_CONTROL    0x14U

/*! @brief Video device class-specific Extension Unit control selector */
#define VIDEO_XU_CONTROL_UNDEFINED 0x00U

/*! @brief Video device class-specific VideoStreaming Interface control selector */
#define VIDEO_VS_CONTROL_UNDEFINED            0x00U
#define VIDEO_VS_PROBE_CONTROL                0x01U
#define VIDEO_VS_COMMIT_CONTROL               0x02U
#define VIDEO_VS_STILL_PROBE_CONTROL          0x03U
#define VIDEO_VS_STILL_COMMIT_CONTROL         0x04U
#define VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL  0x05U
#define VIDEO_VS_STREAM_ERROR_CODE_CONTROL    0x06U
#define VIDEO_VS_GENERATE_KEY_FRAME_CONTROL   0x07U
#define VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x08U
#define VIDEO_VS_SYNCH_DELAY_CONTROL          0x09U

/*! @}*/

/*!
 * @name USB Video class terminal types
 * @{
 */

/*! @brief Video device USB terminal type */
#define VIDEO_TT_VENDOR_SPECIFIC 0x0100U
#define VIDEO_TT_STREAMING       0x0101U

/*! @brief Video device input terminal type */
#define VIDEO_ITT_VENDOR_SPECIFIC       0x0200U
#define VIDEO_ITT_CAMERA                0x0201U
#define VIDEO_ITT_MEDIA_TRANSPORT_INPUT 0x0202U

/*! @brief Video device output terminal type */
#define VIDEO_OTT_VENDOR_SPECIFIC        0x0300U
#define VIDEO_OTT_DISPLAY                0x0301U
#define VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT 0x0302U

/*! @brief Video device external terminal type */
#define VIDEO_ET_VENDOR_SPECIFIC     0x0400U
#define VIDEO_ET_COMPOSITE_CONNECTOR 0x0401U
#define VIDEO_ET_SVIDEO_CONNECTOR    0x0402U
#define VIDEO_ET_COMPONENT_CONNECTOR 0x0403U

/*! @}*/

/*!
 * @name USB Video class setup request types
 * @{
 */

/*! @brief Video device class setup request set type */
#define VIDEO_SET_REQUEST_INTERFACE 0x21U
#define VIDEO_SET_REQUEST_ENDPOINT  0x22U

/*! @brief Video device class setup request get type */
#define VIDEO_GET_REQUEST_INTERFACE 0xA1U
#define VIDEO_GET_REQUEST_ENDPOINT  0xA2U

/*! @}*/

/*! @brief Video device still image trigger control */
#define VIDEO_STILL_IMAGE_TRIGGER_NORMAL_OPERATION                            0x00U
#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE                        0x01U
#define VIDEO_STILL_IMAGE_TRIGGER_TRANSMIT_STILL_IMAGE_VS_DEDICATED_BULK_PIPE 0x02U
#define VIDEO_STILL_IMAGE_TRIGGER_ABORT_STILL_IMAGE_TRANSMISSION              0x03U

/*!
 * @name USB Video device class-specific request commands
 * @{
 */

/*! @brief Video device class-specific request GET CUR COMMAND */
#define VIDEO_GET_CUR_VC_POWER_MODE_CONTROL 0x8101U
#define VIDEO_GET_CUR_VC_ERROR_CODE_CONTROL 0x8102U

#define VIDEO_GET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL         0x8121U
#define VIDEO_GET_CUR_PU_BRIGHTNESS_CONTROL                     0x8122U
#define VIDEO_GET_CUR_PU_CONTRACT_CONTROL                       0x8123U
#define VIDEO_GET_CUR_PU_GAIN_CONTROL                           0x8124U
#define VIDEO_GET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL           0x8125U
#define VIDEO_GET_CUR_PU_HUE_CONTROL                            0x8126U
#define VIDEO_GET_CUR_PU_SATURATION_CONTROL                     0x8127U
#define VIDEO_GET_CUR_PU_SHARRNESS_CONTROL                      0x8128U
#define VIDEO_GET_CUR_PU_GAMMA_CONTROL                          0x8129U
#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x812AU
#define VIDEO_GET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x812BU
#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x812CU
#define VIDEO_GET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x812DU
#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL             0x812EU
#define VIDEO_GET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x812FU
#define VIDEO_GET_CUR_PU_HUE_AUTO_CONTROL                       0x8130U
#define VIDEO_GET_CUR_PU_ANALOG_VIDEO_STANDARD_CONTROL          0x8131U
#define VIDEO_GET_CUR_PU_ANALOG_LOCK_STATUS_CONTROL             0x8132U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_CUR_PU_CONTRAST_AUTO_CONTROL 0x8133U
#endif

#define VIDEO_GET_CUR_CT_SCANNING_MODE_CONTROL          0x8141U
#define VIDEO_GET_CUR_CT_AE_MODE_CONTROL                0x8142U
#define VIDEO_GET_CUR_CT_AE_PRIORITY_CONTROL            0x8143U
#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8144U
#define VIDEO_GET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8145U
#define VIDEO_GET_CUR_CT_FOCUS_ABSOLUTE_CONTROL         0x8146U
#define VIDEO_GET_CUR_CT_FOCUS_RELATIVE_CONTROL         0x8147U
#define VIDEO_GET_CUR_CT_FOCUS_AUTO_CONTROL             0x8148U
#define VIDEO_GET_CUR_CT_IRIS_ABSOLUTE_CONTROL          0x8149U
#define VIDEO_GET_CUR_CT_IRIS_RELATIVE_CONTROL          0x814AU
#define VIDEO_GET_CUR_CT_ZOOM_ABSOLUTE_CONTROL          0x814BU
#define VIDEO_GET_CUR_CT_ZOOM_RELATIVE_CONTROL          0x814CU
#define VIDEO_GET_CUR_CT_PANTILT_ABSOLUTE_CONTROL       0x814DU
#define VIDEO_GET_CUR_CT_PANTILT_RELATIVE_CONTROL       0x814EU
#define VIDEO_GET_CUR_CT_ROLL_ABSOLUTE_CONTROL          0x814FU
#define VIDEO_GET_CUR_CT_ROLL_RELATIVE_CONTROL          0x8150U
#define VIDEO_GET_CUR_CT_PRIVACY_CONTROL                0x8151U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_CUR_CT_FOCUS_SIMPLE_CONTROL       0x8152U
#define VIDEO_GET_CUR_CT_DIGITAL_WINDOW_CONTROL     0x8153U
#define VIDEO_GET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x8154U
#endif

#define VIDEO_GET_CUR_VS_PROBE_CONTROL                0x8161U
#define VIDEO_GET_CUR_VS_COMMIT_CONTROL               0x8162U
#define VIDEO_GET_CUR_VS_STILL_PROBE_CONTROL          0x8163U
#define VIDEO_GET_CUR_VS_STILL_COMMIT_CONTROL         0x8164U
#define VIDEO_GET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL  0x8165U
#define VIDEO_GET_CUR_VS_STREAM_ERROR_CODE_CONTROL    0x8166U
#define VIDEO_GET_CUR_VS_GENERATE_KEY_FRAME_CONTROL   0x8167U
#define VIDEO_GET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8168U
#define VIDEO_GET_CUR_VS_SYNCH_DELAY_CONTROL          0x8169U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_CUR_EU_SELECT_LAYER_CONTROL        0x8181U
#define VIDEO_GET_CUR_EU_PROFILE_TOOLSET_CONTROL     0x8182U
#define VIDEO_GET_CUR_EU_VIDEO_RESOLUTION_CONTROL    0x8183U
#define VIDEO_GET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL  0x8184U
#define VIDEO_GET_CUR_EU_SLICE_MODE_CONTROL          0x8185U
#define VIDEO_GET_CUR_EU_RATE_CONTROL_MODE_CONTROL   0x8186U
#define VIDEO_GET_CUR_EU_AVERAGE_BITRATE_CONTROL     0x8187U
#define VIDEO_GET_CUR_EU_CPB_SIZE_CONTROL            0x8188U
#define VIDEO_GET_CUR_EU_PEAK_BIT_RATE_CONTROL       0x8189U
#define VIDEO_GET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x818AU
#define VIDEO_GET_CUR_EU_SYNC_REF_FRAME_CONTROL      0x818BU
#define VIDEO_GET_CUR_EU_LTR_BUFFER_CONTROL          0x818CU
#define VIDEO_GET_CUR_EU_LTR_PICTURE_CONTROL         0x818DU
#define VIDEO_GET_CUR_EU_LTR_VALIDATION_CONTROL      0x818EU
#define VIDEO_GET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL     0x818FU
#define VIDEO_GET_CUR_EU_SEI_PAYLOADTYPE_CONTROL     0x8190U
#define VIDEO_GET_CUR_EU_QP_RANGE_CONTROL            0x8191U
#define VIDEO_GET_CUR_EU_PRIORITY_CONTROL            0x8192U
#define VIDEO_GET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x8193U
#define VIDEO_GET_CUR_EU_ERROR_RESILIENCY_CONTROL    0x8194U
#endif

/*! @brief Video device class-specific request GET MIN COMMAND */
#define VIDEO_GET_MIN_PU_BACKLIGHT_COMPENSATION_CONTROL    0x8221U
#define VIDEO_GET_MIN_PU_BRIGHTNESS_CONTROL                0x8222U
#define VIDEO_GET_MIN_PU_CONTRACT_CONTROL                  0x8223U
#define VIDEO_GET_MIN_PU_GAIN_CONTROL                      0x8224U
#define VIDEO_GET_MIN_PU_HUE_CONTROL                       0x8226U
#define VIDEO_GET_MIN_PU_SATURATION_CONTROL                0x8227U
#define VIDEO_GET_MIN_PU_SHARRNESS_CONTROL                 0x8228U
#define VIDEO_GET_MIN_PU_GAMMA_CONTROL                     0x8229U
#define VIDEO_GET_MIN_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x822AU
#define VIDEO_GET_MIN_PU_WHITE_BALANCE_COMPONENT_CONTROL   0x822CU
#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_CONTROL        0x822EU
#define VIDEO_GET_MIN_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL  0x822FU

#define VIDEO_GET_MIN_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8244U
#define VIDEO_GET_MIN_CT_FOCUS_ABSOLUTE_CONTROL         0x8246U
#define VIDEO_GET_MIN_CT_FOCUS_RELATIVE_CONTROL         0x8247U
#define VIDEO_GET_MIN_CT_IRIS_ABSOLUTE_CONTROL          0x8249U
#define VIDEO_GET_MIN_CT_ZOOM_ABSOLUTE_CONTROL          0x824BU
#define VIDEO_GET_MIN_CT_ZOOM_RELATIVE_CONTROL          0x824CU
#define VIDEO_GET_MIN_CT_PANTILT_ABSOLUTE_CONTROL       0x824DU
#define VIDEO_GET_MIN_CT_PANTILT_RELATIVE_CONTROL       0x824EU
#define VIDEO_GET_MIN_CT_ROLL_ABSOLUTE_CONTROL          0x824FU
#define VIDEO_GET_MIN_CT_ROLL_RELATIVE_CONTROL          0x8250U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_MIN_CT_DIGITAL_WINDOW_CONTROL     0x8251U
#define VIDEO_GET_MIN_CT_REGION_OF_INTEREST_CONTROL 0x8252U
#endif

#define VIDEO_GET_MIN_VS_PROBE_CONTROL                0x8261U
#define VIDEO_GET_MIN_VS_STILL_PROBE_CONTROL          0x8263U
#define VIDEO_GET_MIN_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8268U
#define VIDEO_GET_MIN_VS_SYNCH_DELAY_CONTROL          0x8269U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_MIN_EU_VIDEO_RESOLUTION_CONTROL    0x8283U
#define VIDEO_GET_MIN_EU_MIN_FRAME_INTERVAL_CONTROL  0x8284U
#define VIDEO_GET_MIN_EU_SLICE_MODE_CONTROL          0x8285U
#define VIDEO_GET_MIN_EU_AVERAGE_BITRATE_CONTROL     0x8287U
#define VIDEO_GET_MIN_EU_CPB_SIZE_CONTROL            0x8288U
#define VIDEO_GET_MIN_EU_PEAK_BIT_RATE_CONTROL       0x8289U
#define VIDEO_GET_MIN_EU_QUANTIZATION_PARAMS_CONTROL 0x828AU
#define VIDEO_GET_MIN_EU_SYNC_REF_FRAME_CONTROL      0x828BU
#define VIDEO_GET_MIN_EU_LEVEL_IDC_LIMIT_CONTROL     0x828FU
#define VIDEO_GET_MIN_EU_SEI_PAYLOADTYPE_CONTROL     0x8290U
#define VIDEO_GET_MIN_EU_QP_RANGE_CONTROL            0x8291U
#endif

/*! @brief Video device class-specific request GET MAX COMMAND */
#define VIDEO_GET_MAX_PU_BACKLIGHT_COMPENSATION_CONTROL    0x8321U
#define VIDEO_GET_MAX_PU_BRIGHTNESS_CONTROL                0x8322U
#define VIDEO_GET_MAX_PU_CONTRACT_CONTROL                  0x8323U
#define VIDEO_GET_MAX_PU_GAIN_CONTROL                      0x8324U
#define VIDEO_GET_MAX_PU_HUE_CONTROL                       0x8326U
#define VIDEO_GET_MAX_PU_SATURATION_CONTROL                0x8327U
#define VIDEO_GET_MAX_PU_SHARRNESS_CONTROL                 0x8328U
#define VIDEO_GET_MAX_PU_GAMMA_CONTROL                     0x8329U
#define VIDEO_GET_MAX_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x832AU
#define VIDEO_GET_MAX_PU_WHITE_BALANCE_COMPONENT_CONTROL   0x832CU
#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_CONTROL        0x832EU
#define VIDEO_GET_MAX_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL  0x832FU

#define VIDEO_GET_MAX_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8344U
#define VIDEO_GET_MAX_CT_FOCUS_ABSOLUTE_CONTROL         0x8346U
#define VIDEO_GET_MAX_CT_FOCUS_RELATIVE_CONTROL         0x8347U
#define VIDEO_GET_MAX_CT_IRIS_ABSOLUTE_CONTROL          0x8349U
#define VIDEO_GET_MAX_CT_ZOOM_ABSOLUTE_CONTROL          0x834BU
#define VIDEO_GET_MAX_CT_ZOOM_RELATIVE_CONTROL          0x834CU
#define VIDEO_GET_MAX_CT_PANTILT_ABSOLUTE_CONTROL       0x834DU
#define VIDEO_GET_MAX_CT_PANTILT_RELATIVE_CONTROL       0x834EU
#define VIDEO_GET_MAX_CT_ROLL_ABSOLUTE_CONTROL          0x834FU
#define VIDEO_GET_MAX_CT_ROLL_RELATIVE_CONTROL          0x8350U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_MAX_CT_DIGITAL_WINDOW_CONTROL     0x8351U
#define VIDEO_GET_MAX_CT_REGION_OF_INTEREST_CONTROL 0x8352U
#endif

#define VIDEO_GET_MAX_VS_PROBE_CONTROL                0x8361U
#define VIDEO_GET_MAX_VS_STILL_PROBE_CONTROL          0x8363U
#define VIDEO_GET_MAX_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8368U
#define VIDEO_GET_MAX_VS_SYNCH_DELAY_CONTROL          0x8369U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_MAX_EU_VIDEO_RESOLUTION_CONTROL    0x8383U
#define VIDEO_GET_MAX_EU_MIN_FRAME_INTERVAL_CONTROL  0x8384U
#define VIDEO_GET_MAX_EU_SLICE_MODE_CONTROL          0x8385U
#define VIDEO_GET_MAX_EU_AVERAGE_BITRATE_CONTROL     0x8387U
#define VIDEO_GET_MAX_EU_CPB_SIZE_CONTROL            0x8388U
#define VIDEO_GET_MAX_EU_PEAK_BIT_RATE_CONTROL       0x8389U
#define VIDEO_GET_MAX_EU_QUANTIZATION_PARAMS_CONTROL 0x838AU
#define VIDEO_GET_MAX_EU_SYNC_REF_FRAME_CONTROL      0x838BU
#define VIDEO_GET_MAX_EU_LTR_BUFFER_CONTROL          0x838CU
#define VIDEO_GET_MAX_EU_LEVEL_IDC_LIMIT_CONTROL     0x838FU
#define VIDEO_GET_MAX_EU_SEI_PAYLOADTYPE_CONTROL     0x8390U
#define VIDEO_GET_MAX_EU_QP_RANGE_CONTROL            0x8391U
#endif

/*! @brief Video device class-specific request GET RES COMMAND */
#define VIDEO_GET_RES_PU_BACKLIGHT_COMPENSATION_CONTROL    0x8421U
#define VIDEO_GET_RES_PU_BRIGHTNESS_CONTROL                0x8422U
#define VIDEO_GET_RES_PU_CONTRACT_CONTROL                  0x8423U
#define VIDEO_GET_RES_PU_GAIN_CONTROL                      0x8424U
#define VIDEO_GET_RES_PU_HUE_CONTROL                       0x8426U
#define VIDEO_GET_RES_PU_SATURATION_CONTROL                0x8427U
#define VIDEO_GET_RES_PU_SHARRNESS_CONTROL                 0x8428U
#define VIDEO_GET_RES_PU_GAMMA_CONTROL                     0x8429U
#define VIDEO_GET_RES_PU_WHITE_BALANCE_TEMPERATURE_CONTROL 0x842AU
#define VIDEO_GET_RES_PU_WHITE_BALANCE_COMPONENT_CONTROL   0x842CU
#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_CONTROL        0x842EU
#define VIDEO_GET_RES_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL  0x842FU

#define VIDEO_GET_RES_CT_AE_MODE_CONTROL                0x8442U
#define VIDEO_GET_RES_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8444U
#define VIDEO_GET_RES_CT_FOCUS_ABSOLUTE_CONTROL         0x8446U
#define VIDEO_GET_RES_CT_FOCUS_RELATIVE_CONTROL         0x8447U
#define VIDEO_GET_RES_CT_IRIS_ABSOLUTE_CONTROL          0x8449U
#define VIDEO_GET_RES_CT_ZOOM_ABSOLUTE_CONTROL          0x844BU
#define VIDEO_GET_RES_CT_ZOOM_RELATIVE_CONTROL          0x844CU
#define VIDEO_GET_RES_CT_PANTILT_ABSOLUTE_CONTROL       0x844DU
#define VIDEO_GET_RES_CT_PANTILT_RELATIVE_CONTROL       0x844EU
#define VIDEO_GET_RES_CT_ROLL_ABSOLUTE_CONTROL          0x844FU
#define VIDEO_GET_RES_CT_ROLL_RELATIVE_CONTROL          0x8450U

#define VIDEO_GET_RES_VS_PROBE_CONTROL                0x8461U
#define VIDEO_GET_RES_VS_STILL_PROBE_CONTROL          0x8463U
#define VIDEO_GET_RES_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8468U
#define VIDEO_GET_RES_VS_SYNCH_DELAY_CONTROL          0x8469U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_RES_EU_AVERAGE_BITRATE_CONTROL     0x8487U
#define VIDEO_GET_RES_EU_CPB_SIZE_CONTROL            0x8488U
#define VIDEO_GET_RES_EU_PEAK_BIT_RATE_CONTROL       0x8489U
#define VIDEO_GET_RES_EU_QUANTIZATION_PARAMS_CONTROL 0x848AU
#define VIDEO_GET_RES_EU_ERROR_RESILIENCY_CONTROL    0x8494U
#endif

/*! @brief Video device class-specific request GET LEN COMMAND */

#define VIDEO_GET_LEN_VS_PROBE_CONTROL        0x8561U
#define VIDEO_GET_LEN_VS_COMMIT_CONTROL       0x8562U
#define VIDEO_GET_LEN_VS_STILL_PROBE_CONTROL  0x8563U
#define VIDEO_GET_LEN_VS_STILL_COMMIT_CONTROL 0x8564U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_LEN_EU_SELECT_LAYER_CONTROL        0x8581U
#define VIDEO_GET_LEN_EU_PROFILE_TOOLSET_CONTROL     0x8582U
#define VIDEO_GET_LEN_EU_VIDEO_RESOLUTION_CONTROL    0x8583U
#define VIDEO_GET_LEN_EU_MIN_FRAME_INTERVAL_CONTROL  0x8584U
#define VIDEO_GET_LEN_EU_SLICE_MODE_CONTROL          0x8585U
#define VIDEO_GET_LEN_EU_RATE_CONTROL_MODE_CONTROL   0x8586U
#define VIDEO_GET_LEN_EU_AVERAGE_BITRATE_CONTROL     0x8587U
#define VIDEO_GET_LEN_EU_CPB_SIZE_CONTROL            0x8588U
#define VIDEO_GET_LEN_EU_PEAK_BIT_RATE_CONTROL       0x8589U
#define VIDEO_GET_LEN_EU_QUANTIZATION_PARAMS_CONTROL 0x858AU
#define VIDEO_GET_LEN_EU_SYNC_REF_FRAME_CONTROL      0x858BU
#define VIDEO_GET_LEN_EU_LTR_BUFFER_CONTROL          0x858CU
#define VIDEO_GET_LEN_EU_LTR_PICTURE_CONTROL         0x858DU
#define VIDEO_GET_LEN_EU_LTR_VALIDATION_CONTROL      0x858EU
#define VIDEO_GET_LEN_EU_QP_RANGE_CONTROL            0x8591U
#define VIDEO_GET_LEN_EU_PRIORITY_CONTROL            0x8592U
#define VIDEO_GET_LEN_EU_START_OR_STOP_LAYER_CONTROL 0x8593U
#endif

/*! @brief Video device class-specific request GET INFO COMMAND */
#define VIDEO_GET_INFO_VC_POWER_MODE_CONTROL 0x8601U
#define VIDEO_GET_INFO_VC_ERROR_CODE_CONTROL 0x8602U

#define VIDEO_GET_INFO_PU_BACKLIGHT_COMPENSATION_CONTROL         0x8621U
#define VIDEO_GET_INFO_PU_BRIGHTNESS_CONTROL                     0x8622U
#define VIDEO_GET_INFO_PU_CONTRACT_CONTROL                       0x8623U
#define VIDEO_GET_INFO_PU_GAIN_CONTROL                           0x8624U
#define VIDEO_GET_INFO_PU_POWER_LINE_FREQUENCY_CONTROL           0x8625U
#define VIDEO_GET_INFO_PU_HUE_CONTROL                            0x8626U
#define VIDEO_GET_INFO_PU_SATURATION_CONTROL                     0x8627U
#define VIDEO_GET_INFO_PU_SHARRNESS_CONTROL                      0x8628U
#define VIDEO_GET_INFO_PU_GAMMA_CONTROL                          0x8629U
#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x862AU
#define VIDEO_GET_INFO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x862BU
#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x862CU
#define VIDEO_GET_INFO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x862DU
#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_CONTROL             0x862EU
#define VIDEO_GET_INFO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x862FU
#define VIDEO_GET_INFO_PU_HUE_AUTO_CONTROL                       0x8630U
#define VIDEO_GET_INFO_PU_ANALOG_VIDEO_STANDARD_CONTROL          0x8631U
#define VIDEO_GET_INFO_PU_ANALOG_LOCK_STATUS_CONTROL             0x8632U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_INFO_PU_CONTRAST_AUTO_CONTROL 0x8633U
#endif

#define VIDEO_GET_INFO_CT_SCANNING_MODE_CONTROL          0x8641U
#define VIDEO_GET_INFO_CT_AE_MODE_CONTROL                0x8642U
#define VIDEO_GET_INFO_CT_AE_PRIORITY_CONTROL            0x8643U
#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8644U
#define VIDEO_GET_INFO_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x8645U
#define VIDEO_GET_INFO_CT_FOCUS_ABSOLUTE_CONTROL         0x8646U
#define VIDEO_GET_INFO_CT_FOCUS_RELATIVE_CONTROL         0x8647U
#define VIDEO_GET_INFO_CT_FOCUS_AUTO_CONTROL             0x8648U
#define VIDEO_GET_INFO_CT_IRIS_ABSOLUTE_CONTROL          0x8649U
#define VIDEO_GET_INFO_CT_IRIS_RELATIVE_CONTROL          0x864AU
#define VIDEO_GET_INFO_CT_ZOOM_ABSOLUTE_CONTROL          0x864BU
#define VIDEO_GET_INFO_CT_ZOOM_RELATIVE_CONTROL          0x864CU
#define VIDEO_GET_INFO_CT_PANTILT_ABSOLUTE_CONTROL       0x864DU
#define VIDEO_GET_INFO_CT_PANTILT_RELATIVE_CONTROL       0x864EU
#define VIDEO_GET_INFO_CT_ROLL_ABSOLUTE_CONTROL          0x864FU
#define VIDEO_GET_INFO_CT_ROLL_RELATIVE_CONTROL          0x8650U
#define VIDEO_GET_INFO_CT_PRIVACY_CONTROL                0x8651U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_INFO_CT_FOCUS_SIMPLE_CONTROL 0x8652U
#endif

#define VIDEO_GET_INFO_VS_PROBE_CONTROL                0x8661U
#define VIDEO_GET_INFO_VS_COMMIT_CONTROL               0x8662U
#define VIDEO_GET_INFO_VS_STILL_PROBE_CONTROL          0x8663U
#define VIDEO_GET_INFO_VS_STILL_COMMIT_CONTROL         0x8664U
#define VIDEO_GET_INFO_VS_STILL_IMAGE_TRIGGER_CONTROL  0x8665U
#define VIDEO_GET_INFO_VS_STREAM_ERROR_CODE_CONTROL    0x8666U
#define VIDEO_GET_INFO_VS_GENERATE_KEY_FRAME_CONTROL   0x8667U
#define VIDEO_GET_INFO_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8668U
#define VIDEO_GET_INFO_VS_SYNCH_DELAY_CONTROL          0x8669U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_INFO_EU_SELECT_LAYER_CONTROL        0x8681U
#define VIDEO_GET_INFO_EU_PROFILE_TOOLSET_CONTROL     0x8682U
#define VIDEO_GET_INFO_EU_VIDEO_RESOLUTION_CONTROL    0x8683U
#define VIDEO_GET_INFO_EU_MIN_FRAME_INTERVAL_CONTROL  0x8684U
#define VIDEO_GET_INFO_EU_SLICE_MODE_CONTROL          0x8685U
#define VIDEO_GET_INFO_EU_RATE_CONTROL_MODE_CONTROL   0x8686U
#define VIDEO_GET_INFO_EU_AVERAGE_BITRATE_CONTROL     0x8687U
#define VIDEO_GET_INFO_EU_CPB_SIZE_CONTROL            0x8688U
#define VIDEO_GET_INFO_EU_PEAK_BIT_RATE_CONTROL       0x8689U
#define VIDEO_GET_INFO_EU_QUANTIZATION_PARAMS_CONTROL 0x868AU
#define VIDEO_GET_INFO_EU_SYNC_REF_FRAME_CONTROL      0x868BU
#define VIDEO_GET_INFO_EU_LTR_BUFFER_CONTROL          0x868CU
#define VIDEO_GET_INFO_EU_LTR_PICTURE_CONTROL         0x868DU
#define VIDEO_GET_INFO_EU_LTR_VALIDATION_CONTROL      0x868EU
#define VIDEO_GET_INFO_EU_SEI_PAYLOADTYPE_CONTROL     0x8690U
#define VIDEO_GET_INFO_EU_QP_RANGE_CONTROL            0x8691U
#define VIDEO_GET_INFO_EU_PRIORITY_CONTROL            0x8692U
#define VIDEO_GET_INFO_EU_START_OR_STOP_LAYER_CONTROL 0x8693U
#endif

/*! @brief Video device class-specific request GET DEF COMMAND */
#define VIDEO_GET_DEF_PU_BACKLIGHT_COMPENSATION_CONTROL         0x8721U
#define VIDEO_GET_DEF_PU_BRIGHTNESS_CONTROL                     0x8722U
#define VIDEO_GET_DEF_PU_CONTRACT_CONTROL                       0x8723U
#define VIDEO_GET_DEF_PU_GAIN_CONTROL                           0x8724U
#define VIDEO_GET_DEF_PU_POWER_LINE_FREQUENCY_CONTROL           0x8725U
#define VIDEO_GET_DEF_PU_HUE_CONTROL                            0x8726U
#define VIDEO_GET_DEF_PU_SATURATION_CONTROL                     0x8727U
#define VIDEO_GET_DEF_PU_SHARRNESS_CONTROL                      0x8728U
#define VIDEO_GET_DEF_PU_GAMMA_CONTROL                          0x8729U
#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x872AU
#define VIDEO_GET_DEF_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x872BU
#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x872CU
#define VIDEO_GET_DEF_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x872DU
#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_CONTROL             0x872EU
#define VIDEO_GET_DEF_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x872FU
#define VIDEO_GET_DEF_PU_HUE_AUTO_CONTROL                       0x8730U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_DEF_PU_CONTRAST_AUTO_CONTROL 0x8731U
#endif

#define VIDEO_GET_DEF_CT_AE_MODE_CONTROL                0x8742U
#define VIDEO_GET_DEF_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x8744U
#define VIDEO_GET_DEF_CT_FOCUS_ABSOLUTE_CONTROL         0x8746U
#define VIDEO_GET_DEF_CT_FOCUS_RELATIVE_CONTROL         0x8747U
#define VIDEO_GET_DEF_CT_FOCUS_AUTO_CONTROL             0x8748U
#define VIDEO_GET_DEF_CT_IRIS_ABSOLUTE_CONTROL          0x8749U
#define VIDEO_GET_DEF_CT_ZOOM_ABSOLUTE_CONTROL          0x874BU
#define VIDEO_GET_DEF_CT_ZOOM_RELATIVE_CONTROL          0x874CU
#define VIDEO_GET_DEF_CT_PANTILT_ABSOLUTE_CONTROL       0x874DU
#define VIDEO_GET_DEF_CT_PANTILT_RELATIVE_CONTROL       0x874EU
#define VIDEO_GET_DEF_CT_ROLL_ABSOLUTE_CONTROL          0x874FU
#define VIDEO_GET_DEF_CT_ROLL_RELATIVE_CONTROL          0x8750U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_DEF_CT_FOCUS_SIMPLE_CONTROL       0x8751U
#define VIDEO_GET_DEF_CT_DIGITAL_WINDOW_CONTROL     0x8752U
#define VIDEO_GET_DEF_CT_REGION_OF_INTEREST_CONTROL 0x8753U
#endif

#define VIDEO_GET_DEF_VS_PROBE_CONTROL                0x8761U
#define VIDEO_GET_DEF_VS_STILL_PROBE_CONTROL          0x8763U
#define VIDEO_GET_DEF_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x8768U
#define VIDEO_GET_DEF_VS_SYNCH_DELAY_CONTROL          0x8769U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_GET_DEF_EU_PROFILE_TOOLSET_CONTROL     0x8782U
#define VIDEO_GET_DEF_EU_VIDEO_RESOLUTION_CONTROL    0x8783U
#define VIDEO_GET_DEF_EU_MIN_FRAME_INTERVAL_CONTROL  0x8784U
#define VIDEO_GET_DEF_EU_SLICE_MODE_CONTROL          0x8785U
#define VIDEO_GET_DEF_EU_RATE_CONTROL_MODE_CONTROL   0x8786U
#define VIDEO_GET_DEF_EU_AVERAGE_BITRATE_CONTROL     0x8787U
#define VIDEO_GET_DEF_EU_CPB_SIZE_CONTROL            0x8788U
#define VIDEO_GET_DEF_EU_PEAK_BIT_RATE_CONTROL       0x8789U
#define VIDEO_GET_DEF_EU_QUANTIZATION_PARAMS_CONTROL 0x878AU
#define VIDEO_GET_DEF_EU_LTR_BUFFER_CONTROL          0x878CU
#define VIDEO_GET_DEF_EU_LTR_PICTURE_CONTROL         0x878DU
#define VIDEO_GET_DEF_EU_LTR_VALIDATION_CONTROL      0x878EU
#define VIDEO_GET_DEF_EU_LEVEL_IDC_LIMIT_CONTROL     0x878FU
#define VIDEO_GET_DEF_EU_SEI_PAYLOADTYPE_CONTROL     0x8790U
#define VIDEO_GET_DEF_EU_QP_RANGE_CONTROL            0x8791U
#define VIDEO_GET_DEF_EU_ERROR_RESILIENCY_CONTROL    0x8794U
#endif

/*! @brief Video device class-specific request SET CUR COMMAND */
#define VIDEO_SET_CUR_VC_POWER_MODE_CONTROL 0x0101U

#define VIDEO_SET_CUR_PU_BACKLIGHT_COMPENSATION_CONTROL         0x0121U
#define VIDEO_SET_CUR_PU_BRIGHTNESS_CONTROL                     0x0122U
#define VIDEO_SET_CUR_PU_CONTRACT_CONTROL                       0x0123U
#define VIDEO_SET_CUR_PU_GAIN_CONTROL                           0x0124U
#define VIDEO_SET_CUR_PU_POWER_LINE_FREQUENCY_CONTROL           0x0125U
#define VIDEO_SET_CUR_PU_HUE_CONTROL                            0x0126U
#define VIDEO_SET_CUR_PU_SATURATION_CONTROL                     0x0127U
#define VIDEO_SET_CUR_PU_SHARRNESS_CONTROL                      0x0128U
#define VIDEO_SET_CUR_PU_GAMMA_CONTROL                          0x0129U
#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_CONTROL      0x012AU
#define VIDEO_SET_CUR_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL 0x012BU
#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_CONTROL        0x012CU
#define VIDEO_SET_CUR_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL   0x012DU
#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_CONTROL             0x012EU
#define VIDEO_SET_CUR_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL       0x012FU
#define VIDEO_SET_CUR_PU_HUE_AUTO_CONTROL                       0x0130U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_SET_CUR_PU_CONTRAST_AUTO_CONTROL 0x0131U
#endif

#define VIDEO_SET_CUR_CT_SCANNING_MODE_CONTROL          0x0141U
#define VIDEO_SET_CUR_CT_AE_MODE_CONTROL                0x0142U
#define VIDEO_SET_CUR_CT_AE_PRIORITY_CONTROL            0x0143U
#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL 0x0144U
#define VIDEO_SET_CUR_CT_EXPOSURE_TIME_RELATIVE_CONTROL 0x0145U
#define VIDEO_SET_CUR_CT_FOCUS_ABSOLUTE_CONTROL         0x0146U
#define VIDEO_SET_CUR_CT_FOCUS_RELATIVE_CONTROL         0x0147U
#define VIDEO_SET_CUR_CT_FOCUS_AUTO_CONTROL             0x0148U
#define VIDEO_SET_CUR_CT_IRIS_ABSOLUTE_CONTROL          0x0149U
#define VIDEO_SET_CUR_CT_IRIS_RELATIVE_CONTROL          0x014AU
#define VIDEO_SET_CUR_CT_ZOOM_ABSOLUTE_CONTROL          0x014BU
#define VIDEO_SET_CUR_CT_ZOOM_RELATIVE_CONTROL          0x014CU
#define VIDEO_SET_CUR_CT_PANTILT_ABSOLUTE_CONTROL       0x014DU
#define VIDEO_SET_CUR_CT_PANTILT_RELATIVE_CONTROL       0x014EU
#define VIDEO_SET_CUR_CT_ROLL_ABSOLUTE_CONTROL          0x014FU
#define VIDEO_SET_CUR_CT_ROLL_RELATIVE_CONTROL          0x0150U
#define VIDEO_SET_CUR_CT_PRIVACY_CONTROL                0x0151U
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_SET_CUR_CT_FOCUS_SIMPLE_CONTROL       0x0152U
#define VIDEO_SET_CUR_CT_DIGITAL_WINDOW_CONTROL     0x0153U
#define VIDEO_SET_CUR_CT_REGION_OF_INTEREST_CONTROL 0x0154U
#endif

#define VIDEO_SET_CUR_VS_PROBE_CONTROL                0x0161U
#define VIDEO_SET_CUR_VS_COMMIT_CONTROL               0x0162U
#define VIDEO_SET_CUR_VS_STILL_PROBE_CONTROL          0x0163U
#define VIDEO_SET_CUR_VS_STILL_COMMIT_CONTROL         0x0164U
#define VIDEO_SET_CUR_VS_STILL_IMAGE_TRIGGER_CONTROL  0x0165U
#define VIDEO_SET_CUR_VS_STREAM_ERROR_CODE_CONTROL    0x0166U
#define VIDEO_SET_CUR_VS_GENERATE_KEY_FRAME_CONTROL   0x0167U
#define VIDEO_SET_CUR_VS_UPDATE_FRAME_SEGMENT_CONTROL 0x0168U
#define VIDEO_SET_CUR_VS_SYNCH_DELAY_CONTROL          0x0169U

#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
#define VIDEO_SET_CUR_EU_SELECT_LAYER_CONTROL        0x0181U
#define VIDEO_SET_CUR_EU_PROFILE_TOOLSET_CONTROL     0x0182U
#define VIDEO_SET_CUR_EU_VIDEO_RESOLUTION_CONTROL    0x0183U
#define VIDEO_SET_CUR_EU_MIN_FRAME_INTERVAL_CONTROL  0x0184U
#define VIDEO_SET_CUR_EU_SLICE_MODE_CONTROL          0x0185U
#define VIDEO_SET_CUR_EU_RATE_CONTROL_MODE_CONTROL   0x0186U
#define VIDEO_SET_CUR_EU_AVERAGE_BITRATE_CONTROL     0x0187U
#define VIDEO_SET_CUR_EU_CPB_SIZE_CONTROL            0x0188U
#define VIDEO_SET_CUR_EU_PEAK_BIT_RATE_CONTROL       0x0189U
#define VIDEO_SET_CUR_EU_QUANTIZATION_PARAMS_CONTROL 0x018AU
#define VIDEO_SET_CUR_EU_SYNC_REF_FRAME_CONTROL      0x018BU
#define VIDEO_SET_CUR_EU_LTR_BUFFER_CONTROL          0x018CU
#define VIDEO_SET_CUR_EU_LTR_PICTURE_CONTROL         0x018DU
#define VIDEO_SET_CUR_EU_LTR_VALIDATION_CONTROL      0x018EU
#define VIDEO_SET_CUR_EU_LEVEL_IDC_LIMIT_CONTROL     0x018FU
#define VIDEO_SET_CUR_EU_SEI_PAYLOADTYPE_CONTROL     0x0190U
#define VIDEO_SET_CUR_EU_QP_RANGE_CONTROL            0x0191U
#define VIDEO_SET_CUR_EU_PRIORITY_CONTROL            0x0192U
#define VIDEO_SET_CUR_EU_START_OR_STOP_LAYER_CONTROL 0x0193U
#define VIDEO_SET_CUR_EU_ERROR_RESILIENCY_CONTROL    0x0194U
#endif

/*! @brief The payload header structure. */
struct video_payload_header {
    uint8_t bHeaderLength; /*!< The payload header length. */
    union {
        uint8_t bmheaderInfo; /*!< The payload header bitmap field. */
        struct
        {
            uint8_t frameIdentifier : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays
                                             constant for the rest of the frame.*/
            uint8_t endOfFrame      : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the
                                        last video sample that belongs to a frame.*/
            uint8_t
                presentationTimeStamp    : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of
                                               a PTS field.*/
            uint8_t sourceClockReference : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence
                                                  of a SCR field.*/
            uint8_t reserved             : 1U; /*!< Reserved. Set to 0. */
            uint8_t stillImage           : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a
                                         still image.*/
            uint8_t errorBit             : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/
            uint8_t endOfHeader          : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/
        } headerInfoBits;
        struct
        {
            uint8_t FID : 1U; /*!< Frame Identifier. This bit toggles at each frame start boundary and stays constant
                                 for the rest of the frame.*/
            uint8_t EOI : 1U; /*!< End of Frame. This bit indicates the end of a video frame and is set in the last
                                 video sample that belongs to a frame.*/
            uint8_t PTS : 1U; /*!< Presentation Time Stamp. This bit, when set, indicates the presence of a PTS field.*/
            uint8_t SCR : 1U; /*!< Source Clock Reference. This bit, when set, indicates the presence of a SCR field.*/
            uint8_t RES : 1U; /*!< Reserved. Set to 0. */
            uint8_t STI : 1U; /*!< Still Image. This bit, when set, identifies a video sample that belongs to a still
                                 image.*/
            uint8_t ERR : 1U; /*!< Error Bit. This bit, when set, indicates an error in the device streaming.*/
            uint8_t EOH : 1U; /*!< End of Header. This bit, when set, indicates the end of the BFH fields.*/
        } headerInfoBitmap;
    } headerInfoUnion;
    uint32_t dwPresentationTime;      /*!< Presentation time stamp (PTS) field.*/
    uint8_t bSourceClockReference[6]; /*!< Source clock reference (SCR) field.*/
} __PACKED;

/*! @brief The Video probe and commit controls structure.*/
struct video_probe_and_commit_controls {
    union {
        uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */
        struct
        {
            uint8_t dwFrameInterval : 1U; /*!< dwFrameInterval field.*/
            uint8_t wKeyFrameRate   : 1U; /*!< wKeyFrameRate field.*/
            uint8_t wPFrameRate     : 1U; /*!< wPFrameRate field.*/
            uint8_t wCompQuality    : 1U; /*!< wCompQuality field.*/
            uint8_t wCompWindowSize : 1U; /*!< wCompWindowSize field.*/
            uint8_t reserved        : 3U; /*!< Reserved field.*/
        } hintBitmap;
    } hintUnion;
    union {
        uint8_t bmHint; /*!< Bit-field control indicating to the function what fields shall be kept fixed. */
        struct
        {
            uint8_t reserved : 8U; /*!< Reserved field.*/
        } hintBitmap;
    } hintUnion1;
    uint8_t bFormatIndex;              /*!< Video format index from a format descriptor.*/
    uint8_t bFrameIndex;               /*!< Video frame index from a frame descriptor.*/
    uint32_t dwFrameInterval;          /*!< Frame interval in 100ns units.*/
    uint16_t wKeyFrameRate;            /*!< Key frame rate in key-frame per video-frame units.*/
    uint16_t wPFrameRate;              /*!< PFrame rate in PFrame/key frame units.*/
    uint16_t wCompQuality;             /*!< Compression quality control in abstract units 0U (lowest) to 10000U (highest).*/
    uint16_t wCompWindowSize;          /*!< Window size for average bit rate control.*/
    uint16_t wDelay;                   /*!< Internal video streaming interface latency in ms from video data capture to presentation on
                        the USB.*/
    uint32_t dwMaxVideoFrameSize;      /*!< Maximum video frame or codec-specific segment size in bytes.*/
    uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or
                                          receive in a single payload transfer.*/
    uint32_t dwClockFrequency;         /*!< The device clock frequency in Hz for the specified format. This specifies the
                                  units used for the time information fields in the Video Payload Headers in the data
                                  stream.*/
    uint8_t bmFramingInfo;             /*!< Bit-field control supporting the following values: D0 Frame ID, D1 EOF.*/
    uint8_t bPreferedVersion;          /*!< The preferred payload format version supported by the host or device for the
                                  specified bFormatIndex value.*/
    uint8_t bMinVersion;               /*!< The minimum payload format version supported by the device for the specified bFormatIndex
                            value.*/
    uint8_t bMaxVersion;               /*!< The maximum payload format version supported by the device for the specified bFormatIndex
                            value.*/
#if defined(USB_DEVICE_VIDEO_CLASS_VERSION_1_5) && USB_DEVICE_VIDEO_CLASS_VERSION_1_5
    uint8_t bUsage; /*!< This bitmap enables features reported by the bmUsages field of the Video Frame Descriptor.*/
    uint8_t
        bBitDepthLuma;                  /*!< Represents bit_depth_luma_minus8 + 8U, which must be the same as bit_depth_chroma_minus8 +
                           8.*/
    uint8_t bmSettings;                 /*!< A bitmap of flags that is used to discover and control specific features of a temporally
                           encoded video stream.*/
    uint8_t bMaxNumberOfRefFramesPlus1; /*!< Host indicates the maximum number of frames stored for use as references.*/
    uint16_t bmRateControlModes;        /*!< This field contains 4U sub-fields, each of which is a 4U bit number.*/
    uint64_t bmLayoutPerStream;         /*!< This field contains 4U sub-fields, each of which is a 2U byte number.*/
#endif
} __PACKED;

/*! @brief The Video still probe and still commit controls structure.*/
struct video_still_probe_and_commit_controls {
    uint8_t bFormatIndex;              /*!< Video format index from a format descriptor.*/
    uint8_t bFrameIndex;               /*!< Video frame index from a frame descriptor.*/
    uint8_t bCompressionIndex;         /*!< Compression index from a frame descriptor.*/
    uint32_t dwMaxVideoFrameSize;      /*!< Maximum still image size in bytes.*/
    uint32_t dwMaxPayloadTransferSize; /*!< Specifies the maximum number of bytes that the device can transmit or
                                          receive in a single payload transfer.*/
} __PACKED;

struct video_cs_if_vc_header_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint16_t bcdUVC;
    uint16_t wTotalLength;
    uint32_t dwClockFrequency;
    uint8_t bInCollection;
    uint8_t baInterfaceNr[];
} __PACKED;

#define VIDEO_SIZEOF_VC_HEADER_DESC(n) (12 + n)

struct video_cs_if_vc_input_terminal_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bTerminalID;
    uint16_t wTerminalType;
    uint8_t bAssocTerminal;
    uint8_t iTerminal;
    uint16_t wObjectiveFocalLenMin;
    uint16_t wObjectiveFocalLenMax;
    uint16_t wOcularFocalLength;
    uint8_t bControlSize;
    uint8_t bmaControls[];
} __PACKED;

#define VIDEO_SIZEOF_VC_INPUT_TERMINAL_DESC(n) (15 + n)

struct video_cs_if_vc_processing_unit_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bUnitID;
    uint8_t bSourceID;
    uint16_t wMaxMultiplier;
    uint8_t bControlSize;
    // uint8_t bmaControls[];
    uint8_t iProcessing;
    uint8_t bmVideoStandards;
} __PACKED;

#define VIDEO_SIZEOF_VC_PROCESSING_UNIT_DESC(n) (10 + n)

struct video_cs_if_vc_output_terminal_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bTerminalID;
    uint16_t wTerminalType;
    uint8_t bAssocTerminal;
    uint8_t bSourceID;
    uint8_t iTerminal;
} __PACKED;

#define VIDEO_SIZEOF_VC_OUTPUT_TERMINAL_DESC 9

struct video_cs_if_vc_extension_unit_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bUnitID;
    uint8_t guidExtensionCode[16];
    uint8_t bNumControls;
    uint8_t bNrInPins;
    // uint8_t baSourceID[];
    uint8_t bControlSize;
    // uint8_t bmControls[]
    uint8_t iExtension;
} __PACKED;

#define VIDEO_SIZEOF_VC_EXTENSION_UNIT_DESC(p, n) (24 + p + n)

struct video_cs_ep_vc_ep_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint16_t wMaxTransferSize;
} __PACKED;

#define VIDEO_SIZEOF_VC_EP_DESC 5

struct video_cs_if_vs_input_header_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bNumFormats;
    uint16_t wTotalLength;
    uint8_t bEndpointAddress;
    uint8_t bmInfo;
    uint8_t bTerminalLink;
    uint8_t bStillCaptureMethod;
    uint8_t bTriggerSupport;
    uint8_t bTriggerUsage;
    uint8_t bControlSize;
    uint8_t bmaControls[];
} __PACKED;

#define VIDEO_SIZEOF_VS_INPUT_HEADER_DESC(p, n) (13 + p * n)

struct video_cs_if_vs_output_header_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bNumFormats;
    uint16_t wTotalLength;
    uint8_t bEndpointAddress;
    uint8_t bTerminalLink;
    uint8_t bControlSize;
    uint8_t bmaControls[];
} __PACKED;

#define VIDEO_SIZEOF_VS_OUTPUT_TERMINAL_DESC(p, n) (9 + p * n)

struct video_cs_if_vs_format_uncompressed_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bFormatIndex;
    uint8_t bNumFrameDescriptors;
    uint8_t guidFormat[16];
    uint8_t bBitsPerPixel;
    uint8_t bDefaultFrameIndex;
    uint8_t bAspectRatioX;
    uint8_t bAspectRatioY;
    uint8_t bmInterlaceFlags;
    uint8_t bCopyProtect;
} __PACKED;

#define VIDEO_SIZEOF_VS_FORMAT_UNCOMPRESSED_DESC (27)

struct video_cs_if_vs_frame_uncompressed_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bFrameIndex;
    uint8_t bmCapabilities;
    uint16_t wWidth;
    uint16_t wHeight;
    uint32_t dwMinBitRate;
    uint32_t dwMaxBitRate;
    uint32_t dwMaxVideoFrameBufferSize;
    uint32_t dwDefaultFrameInterval;
    uint8_t bFrameIntervalType;
    uint32_t dwFrameInterval[];
} __PACKED;

#define VIDEO_SIZEOF_VS_FRAME_UNCOMPRESSED_DESC(n) (26 + 4 * (n))

struct video_cs_if_vs_format_mjpeg_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bFormatIndex;
    uint8_t bNumFrameDescriptors;
    uint8_t bmFlags;
    uint8_t bDefaultFrameIndex;
    uint8_t bAspectRatioX;
    uint8_t bAspectRatioY;
    uint8_t bmInterlaceFlags;
    uint8_t bCopyProtect;
} __PACKED;

#define VIDEO_SIZEOF_VS_FORMAT_MJPEG_DESC 11

struct video_cs_if_vs_frame_mjpeg_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bFrameIndex;
    uint8_t bmCapabilities;
    uint16_t wWidth;
    uint16_t wHeight;
    uint32_t dwMinBitRate;
    uint32_t dwMaxBitRate;
    uint32_t dwMaxVideoFrameBufferSize;
    uint32_t dwDefaultFrameInterval;
    uint8_t bFrameIntervalType;
    uint32_t dwFrameInterval[];
} __PACKED;

#define VIDEO_SIZEOF_VS_FRAME_MJPEG_DESC(n) (26 + 4 * (n))

/* H264 Payload - 3.1.1. H264 Video Format Descriptor */
struct video_cs_if_vs_format_h26x_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bFormatIndex;
    uint8_t bNumFrameDescriptors;
    uint8_t guidFormat[16];
    uint8_t bBitsPerPixel;
    uint8_t bDefaultFrameIndex;
    uint8_t bAspectRatioX;
    uint8_t bAspectRatioY;
    uint8_t bmInterfaceFlags;
    uint8_t bCopyProtect;
    uint8_t bVariableSize;
} __PACKED;

#define VIDEO_SIZEOF_VS_FORMAT_H264_DESC 28

/* H264 Payload - 3.1.2. H264 Video Frame Descriptor */
struct video_cs_if_vs_frame_h26x_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bFrameIndex;
    uint8_t bmCapabilities;
    uint16_t wWidth;
    uint16_t wHeight;
    uint32_t dwMinBitRate;
    uint32_t dwMaxBitRate;
    uint32_t dwDefaultFrameInterval;
    uint8_t bFrameIntervalType;
    uint32_t dwBytesPerLine;
    uint32_t dwFrameInterval[];
} __PACKED;

#define VIDEO_SIZEOF_VS_FRAME_H264_DESC(n) (26 + 4 * (n))

struct video_cs_if_vs_colorformat_descriptor {
    uint8_t bLength;
    uint8_t bDescriptorType;
    uint8_t bDescriptorSubType;
    uint8_t bColorPrimaries;
    uint8_t bXferCharacteristics;
    uint8_t bMatrixCoefficients;
} __PACKED;

#define VIDEO_SIZEOF_VS_COLORFORMAT_DESC 6

struct video_vc_input_terminal_bmcontrol_bitmap {
    uint32_t scanning_mode          : 1;
    uint32_t auto_exposure_mode     : 1;
    uint32_t auto_exposure_priority : 1;
    uint32_t exposure_time_absolute : 1;
    uint32_t exposure_time_relative : 1;
    uint32_t focus_absolute         : 1;
    uint32_t focus_relative         : 1;
    uint32_t iris_absolute          : 1;
    uint32_t iris_relative          : 1;
    uint32_t zoom_absolute          : 1;
    uint32_t zoom_relative          : 1;
    uint32_t pantilt_absolute       : 1;
    uint32_t pantilt_relative       : 1;
    uint32_t roll_absolute          : 1;
    uint32_t roll_relative          : 1;
    uint32_t reserved               : 2;
    uint32_t focus_auto             : 1;
    uint32_t pricvcy                : 1;
};

struct video_vc_processing_unit_bmcontrol_bitmap {
    uint16_t brightness          : 1;
    uint16_t contrast            : 1;
    uint16_t hue                 : 1;
    uint16_t saturation          : 1;
    uint16_t sharpness           : 1;
    uint16_t gamma               : 1;
    uint16_t white_bal_temp      : 1;
    uint16_t white_bal_comp      : 1;
    uint16_t backlight_comp      : 1;
    uint16_t gain                : 1;
    uint16_t power_line_freq     : 1;
    uint16_t hue_auto            : 1;
    uint16_t white_bal_temp_auto : 1;
    uint16_t white_bal_comp_auto : 1;
    uint16_t digital_mult        : 1;
    uint16_t digital_mult_limit  : 1;
};

struct video_camera_capabilities {
    uint8_t support_get_request        : 1;
    uint8_t support_set_request        : 1;
    uint8_t disabled_by_automatic_mode : 1;
    uint8_t auto_update_control        : 1;
    uint8_t async_control              : 1;
    uint8_t reserved                   : 3;
};

struct video_autoexposure_mode {
    uint8_t manual_mode            : 1;
    uint8_t auto_mode              : 1;
    uint8_t shutter_priority_mode  : 1;
    uint8_t aperture_priority_mode : 1;
    uint8_t reserved               : 4;
};

#define VIDEO_GUID_YUY2 0x59, 0x55, 0x59, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
#define VIDEO_GUID_NV12 0x4E, 0x56, 0x31, 0x32, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
#define VIDEO_GUID_NV21 0x4E, 0x56, 0x32, 0x31, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
#define VIDEO_GUID_M420 0x4D, 0x34, 0x32, 0x30, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
#define VIDEO_GUID_I420 0x49, 0x34, 0x32, 0x30, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71
#define VIDEO_GUID_H264 0x48, 0x32, 0x36, 0x34, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71

#define VIDEO_VC_TERMINAL_LEN (13 + 18 + 12 + 9)

/*Length of template descriptor: 81 bytes*/
#define VIDEO_VC_DESCRIPTOR_LEN      (8 + 9 + VIDEO_VC_TERMINAL_LEN + 7 + 5)
#define VIDEO_VC_NOEP_DESCRIPTOR_LEN (8 + 9 + VIDEO_VC_TERMINAL_LEN)

// clang-format off
#define VIDEO_VC_DESCRIPTOR_INIT(bFirstInterface, bEndpointAddress, bcdUVC, wTotalLength, dwClockFrequency, stridx)                                                                                          \
    /* Interface Association Descriptor */                                                                                                                                                                   \
    0x08,                                                                                                                                                                                                    \
    USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                                                                                               \
    bFirstInterface,                                                                                                                                                                                         \
    0x02,                                                                                                                                                                                                    \
    USB_DEVICE_CLASS_VIDEO,                                                                                                                                                                                  \
    VIDEO_SC_VIDEO_INTERFACE_COLLECTION,                                                                                                                                                                     \
    0x00,                                                                                                                                                                                                    \
    0x00,                                                                                                                      /* VideoControl Interface Descriptor */                                       \
    0x09,                                                                                                                      /* bLength */                                                                 \
    USB_DESCRIPTOR_TYPE_INTERFACE,                                                                                             /* bDescriptorType */                                                         \
    0x00,                                                                                                                      /* bInterfaceNumber */                                                        \
    0x00,                                                                                                                      /* bAlternateSetting */                                                       \
    0x01,                                                                                                                         /* bNumEndpoints:1 endpoint (interrupt endpoint) */                           \
    USB_DEVICE_CLASS_VIDEO,                                                                                                    /* bInterfaceClass : CC_VIDEO */                                              \
    VIDEO_SC_VIDEOCONTROL,                                                                                                     /* bInterfaceSubClass : SC_VIDEOCONTROL */                                    \
    VIDEO_PC_PROTOCOL_UNDEFINED,                                                                                               /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */                              \
    stridx, /* iInterface:Index to string descriptor that contains the string <Your Product Name> */                           /*Class-specific VideoControl Interface Descriptor */                         \
    0x0d,                                                                                                                      /* bLength */                                                                 \
    0x24,                                                                                                                      /* bDescriptorType : CS_INTERFACE */                                          \
    VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE,                                                                                        /* bDescriptorSubType : VC_HEADER subtype */                                  \
    WBVAL(bcdUVC),                                                                                                             /* bcdUVC : Revision of class specification that this device is based upon.*/ \
    WBVAL(wTotalLength),                                                                                                       /* wTotalLength  */                                                           \
    DBVAL(dwClockFrequency),                                                                                                   /* dwClockFrequency : 0x005b8d80 -> 6,000,000 == 6MHz*/                       \
    0x01,                                                                                                                      /* bInCollection : Number of streaming interfaces. */                         \
    (uint8_t)(bFirstInterface + 1), /* baInterfaceNr(0) : VideoStreaming interface 1 belongs to this VideoControl interface.*/ /* Input Terminal 1 -> Processing Unit 2 -> Output Terminal 3 */              \
    0x12,                                                                                                                                                                                                    \
    0x24,                                                                                                                                                                                                    \
    VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                              \
    0x01,                    /* bTerminalID */                                                                                                                                                               \
    WBVAL(VIDEO_ITT_CAMERA), /* wTerminalType : 0x0201 Camera Sensor*/                                                                                                                                       \
    0x00,                    /* bAssocTerminal */                                                                                                                                                            \
    0x00,                    /* iTerminal */                                                                                                                                                                 \
    WBVAL(0x0000),           /* wObjectiveFocalLengthMin */                                                                                                                                                  \
    WBVAL(0x0000),           /* wObjectiveFocalLengthMax */                                                                                                                                                  \
    WBVAL(0x0000),           /* wOcularFocalLength */                                                                                                                                                        \
    0x03,                    /* bControlSize */                                                                                                                                                              \
    0x00, 0x00, 0x00,        /* bmControls */                                                                                                                                                                \
    0x0c,                                                                                                                                                                                                    \
    0x24,                                                                                                                                                                                                    \
    VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
    0x02,       /* bUnitID  */                                                                                                                                                                               \
    0x01,       /* bSourceID */                                                                                                                                                                              \
    0x00, 0x00, /* wMaxMultiplier  */                                                                                                                                                                        \
    0x02,       /* bControlSize   */                                                                                                                                                                         \
    0x00, 0x00, /* bmControls */                                                                                                                                                                             \
    0x00,       /* iProcessing */                                                                                                                                                                            \
    0x00,       /* bmVideoStandards */                                                                                                                                                                       \
    0x09,                                                                                                                                                                                                    \
    0x24,                                                                                                                                                                                                    \
    VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
    0x03,                         /* bTerminalID */                                                                                                                                                          \
    WBVAL(VIDEO_TT_STREAMING),                                                                                                                                                                               \
    0x00,                         /* bAssocTerminal   */                                                                                                                                                     \
    0x02,                         /* bSourceID   */                                                                                                                                                          \
    0x00,                         /* iTerminal   */                                                                                                                                                          \
    0x07,                         /* bLength */                                                                                                                                                              \
    USB_DESCRIPTOR_TYPE_ENDPOINT, /* bDescriptorType */                                                                                                                                                      \
    bEndpointAddress,             /* bEndpointAddress */                                                                                                                                                     \
    0x03,                         /* bmAttributes */                                                                                                                                                         \
    0x10, 0x00,                   /* wMaxPacketSize */                                                                                                                                                       \
    0x08,                         /* bInterval */                                                                                                                                                            \
    /* Class-specific VC Interrupt Endpoint Descriptor */                                                                                                                                                    \
    0x05, 0x25, 0x03, 0x10, 0x00

#define VIDEO_VC_NOEP_DESCRIPTOR_INIT(bFirstInterface, bEndpointAddress, bcdUVC, wTotalLength, dwClockFrequency, stridx)                                                                                     \
    /* Interface Association Descriptor */                                                                                                                                                                   \
    0x08,                                                                                                                                                                                                    \
    USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                                                                                               \
    bFirstInterface,                                                                                                                                                                                         \
    0x02,                                                                                                                                                                                                    \
    USB_DEVICE_CLASS_VIDEO,                                                                                                                                                                                  \
    VIDEO_SC_VIDEO_INTERFACE_COLLECTION,                                                                                                                                                                     \
    0x00,                                                                                                                                                                                                    \
    0x00,                                                                                                                      /* VideoControl Interface Descriptor */                                       \
    0x09,                                                                                                                      /* bLength */                                                                 \
    USB_DESCRIPTOR_TYPE_INTERFACE,                                                                                             /* bDescriptorType */                                                         \
    0x00,                                                                                                                      /* bInterfaceNumber */                                                        \
    0x00,                                                                                                                      /* bAlternateSetting */                                                       \
    0x00,                                                                                                                      /* bNumEndpoints:0 endpoint (interrupt endpoint) */                           \
    USB_DEVICE_CLASS_VIDEO,                                                                                                    /* bInterfaceClass : CC_VIDEO */                                              \
    VIDEO_SC_VIDEOCONTROL,                                                                                                     /* bInterfaceSubClass : SC_VIDEOCONTROL */                                    \
    VIDEO_PC_PROTOCOL_UNDEFINED,                                                                                               /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */                              \
    stridx,                                                                                                                    /* iInterface:Index to string descriptor that contains the string <Your Product Name> */\
    /*Class-specific VideoControl Interface Descriptor */                                                                                                                                                    \
    0x0d,                                                                                                                      /* bLength */                                                                 \
    0x24,                                                                                                                      /* bDescriptorType : CS_INTERFACE */                                          \
    VIDEO_VC_HEADER_DESCRIPTOR_SUBTYPE,                                                                                        /* bDescriptorSubType : VC_HEADER subtype */                                  \
    WBVAL(bcdUVC),                                                                                                             /* bcdUVC : Revision of class specification that this device is based upon.*/ \
    WBVAL(wTotalLength),                                                                                                       /* wTotalLength  */                                                           \
    DBVAL(dwClockFrequency),                                                                                                   /* dwClockFrequency : 0x005b8d80 -> 6,000,000 == 6MHz*/                       \
    0x01,                                                                                                                      /* bInCollection : Number of streaming interfaces. */                         \
    (uint8_t)(bFirstInterface + 1),                                                                                            /* baInterfaceNr(0) : VideoStreaming interface 1 belongs to this VideoControl interface.*/ \
    /* Input Terminal 1 -> Processing Unit 2 -> Output Terminal 3 */                                                                                                                                         \
    0x12,                                                                                                                                                                                                    \
    0x24,                                                                                                                                                                                                    \
    VIDEO_VC_INPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                              \
    0x01,                    /* bTerminalID */                                                                                                                                                               \
    WBVAL(VIDEO_ITT_CAMERA), /* wTerminalType : 0x0201 Camera Sensor*/                                                                                                                                       \
    0x00,                    /* bAssocTerminal */                                                                                                                                                            \
    0x00,                    /* iTerminal */                                                                                                                                                                 \
    WBVAL(0x0000),           /* wObjectiveFocalLengthMin */                                                                                                                                                  \
    WBVAL(0x0000),           /* wObjectiveFocalLengthMax */                                                                                                                                                  \
    WBVAL(0x0000),           /* wOcularFocalLength */                                                                                                                                                        \
    0x03,                    /* bControlSize */                                                                                                                                                              \
    0x00, 0x00, 0x00,        /* bmControls */                                                                                                                                                                \
    0x0c,                                                                                                                                                                                                    \
    0x24,                                                                                                                                                                                                    \
    VIDEO_VC_PROCESSING_UNIT_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
    0x02,       /* bUnitID  */                                                                                                                                                                               \
    0x01,       /* bSourceID */                                                                                                                                                                              \
    0x00, 0x00, /* wMaxMultiplier  */                                                                                                                                                                        \
    0x02,       /* bControlSize   */                                                                                                                                                                         \
    0x00, 0x00, /* bmControls */                                                                                                                                                                             \
    0x00,       /* iProcessing */                                                                                                                                                                            \
    0x00,       /* bmVideoStandards */                                                                                                                                                                       \
    0x09,                                                                                                                                                                                                    \
    0x24,                                                                                                                                                                                                    \
    VIDEO_VC_OUTPUT_TERMINAL_DESCRIPTOR_SUBTYPE,                                                                                                                                                             \
    0x03,                         /* bTerminalID */                                                                                                                                                          \
    WBVAL(VIDEO_TT_STREAMING),                                                                                                                                                                               \
    0x00,                         /* bAssocTerminal   */                                                                                                                                                     \
    0x02,                         /* bSourceID   */                                                                                                                                                          \
    0x00                          /* iTerminal   */                                                                                                                                                          \

#define VIDEO_VS_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bNumEndpoints)        \
    /* Video Streaming (VS) Interface Descriptor */                                         \
    0x09,                              /* bLength */                                        \
    USB_DESCRIPTOR_TYPE_INTERFACE, /* bDescriptorType : INTERFACE */                        \
    bInterfaceNumber,              /* bInterfaceNumber: Index of this interface */          \
    bAlternateSetting,             /* bAlternateSetting: Index of this alternate setting */ \
    bNumEndpoints,                 /* bNumEndpoints : 0 endpoints,  no bandwidth used*/     \
    0x0e,                          /* bInterfaceClass : CC_VIDEO */                         \
    0x02,                          /* bInterfaceSubClass : SC_VIDEOSTREAMING */             \
    0x00,                          /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */         \
    0x00                           /* iInterface : unused */

#define VIDEO_VS_INPUT_HEADER_DESCRIPTOR_INIT(bNumFormats, wTotalLength, bEndpointAddress, ...)                         \
    /*Class-specific VideoStream Header Descriptor (Input) */                                                           \
    0x0d + PP_NARG(__VA_ARGS__),                                                                                        \
    0x24,                                                                                                               \
    VIDEO_VS_INPUT_HEADER_DESCRIPTOR_SUBTYPE,                                                                           \
    bNumFormats, /* bNumFormats : One format descriptor follows. */                                                     \
    WBVAL(wTotalLength),                                                                                                \
    bEndpointAddress,                                                                                                   \
    0x00,                 /* bmInfo : No dynamic format change supported. */                                            \
    0x03,                 /* bTerminalLink : This VideoStreaming interface supplies terminal ID 2 (Output Terminal). */ \
    0x00,                 /* bStillCaptureMethod : Device supports still image capture method 0. */                     \
    0x00,                 /* bTriggerSupport : Hardware trigger supported for still image capture */                    \
    0x00,                 /* bTriggerUsage : Hardware trigger should initiate a still image capture. */                 \
    PP_NARG(__VA_ARGS__), /* bControlSize : Size of the bmaControls field */                                            \
    __VA_ARGS__           /* bmaControls : No VideoStreaming specific controls are supported.*/

#define VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_INIT(bNumFormats, wTotalLength, bEndpointAddress, ...)                        \
    /*Class-specific VideoStream Header Descriptor (Input) */                                                           \
    0x0d + PP_NARG(__VA_ARGS__),                                                                                        \
    0x24,                                                                                                               \
    VIDEO_VS_OUTPUT_HEADER_DESCRIPTOR_SUBTYPE,                                                                          \
    bNumFormats, /* bNumFormats : One format descriptor follows. */                                                     \
    WBVAL(wTotalLength),                                                                                                \
    bEndpointAddress,                                                                                                   \
    0x00,                 /* bmInfo : No dynamic format change supported. */                                            \
    0x03,                 /* bTerminalLink : This VideoStreaming interface supplies terminal ID 2 (Output Terminal). */ \
    0x00,                 /* bStillCaptureMethod : Device supports still image capture method 0. */                     \
    0x00,                 /* bTriggerSupport : Hardware trigger supported for still image capture */                    \
    0x00,                 /* bTriggerUsage : Hardware trigger should initiate a still image capture. */                 \
    PP_NARG(__VA_ARGS__), /* bControlSize : Size of the bmaControls field */                                            \
    __VA_ARGS__           /* bmaControls : No VideoStreaming specific controls are supported.*/

#define VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors, GUIDFormat)                                                              \
    /*Payload Format(UNCOMPRESSED) Descriptor */                                                                                                                  \
    0x1b,                                                                                                                                                         \
    0x24,                                                                                                                                                         \
    VIDEO_VS_FORMAT_UNCOMPRESSED_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FORMAT_UNCOMPRESSED subtype */                                                    \
    bFormatIndex,                                    /* bFormatIndex : First (and only) format descriptor */                                                      \
    bNumFrameDescriptors,                            /* bNumFrameDescriptors : One frame descriptor for this format follows. */                                   \
    GUIDFormat,                                      /* GUID Format YUY2 {32595559-0000-0010-8000-00AA00389B71} */                                                \
    0x10,                                            /* bBitsPerPixel : Number of bits per pixel used to specify color in the decoded video frame - 16 for yuy2*/ \
    0x01,                                            /* bDefaultFrameIndex : Default frame index is 1. */                                                         \
    0x00,                                            /* bAspectRatioX : Non-interlaced stream not required. */                                                    \
    0x00,                                            /* bAspectRatioY : Non-interlaced stream not required. */                                                    \
    0x00,                                            /* bmInterlaceFlags : Non-interlaced stream */                                                               \
    0x00                                             /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */

#define VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate,           \
                                                    dwMaxVideoFrameBufferSize, dwDefaultFrameInterval) \
    0x1E,                                                                                                           \
    0x24,                                                                                                           \
    VIDEO_VS_FRAME_UNCOMPRESSED_DESCRIPTOR_SUBTYPE,                                                                 \
    bFrameIndex,                                                                                                    \
    0x00,                                                                                                           \
    WBVAL(wWidth),                                                                                                  \
    WBVAL(wHeight),                                                                                                 \
    DBVAL(dwMinBitRate),                                                                                            \
    DBVAL(dwMaxBitRate),                                                                                            \
    DBVAL(dwMaxVideoFrameBufferSize),                                                                               \
    DBVAL(dwDefaultFrameInterval),           /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */                                                                                         \
    0x01,                                    /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame   */ \
    DBVAL(dwDefaultFrameInterval)

#define VIDEO_VS_FORMAT_MJPEG_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors)                    \
    /*Payload Format(MJPEG) Descriptor */                                                            \
    0x0b,                 /* bLength */                                                              \
    0x24,                 /* bDescriptorType : CS_INTERFACE */                                       \
    0x06,                 /* bDescriptorSubType : VS_FORMAT_MJPEG subtype */                         \
    bFormatIndex,         /* bFormatIndex : First (and only) format descriptor */                    \
    bNumFrameDescriptors, /* bNumFrameDescriptors : One frame descriptor for this format follows. */ \
    0x00,                 /* bmFlags : Uses fixed size samples.. */                                  \
    0x01,                 /* bDefaultFrameIndex : Default frame index is 1. */                       \
    0x00,                 /* bAspectRatioX : Non-interlaced stream,  not required. */                \
    0x00,                 /* bAspectRatioY : Non-interlaced stream,  not required. */                \
    0x00,                 /* bmInterlaceFlags : Non-interlaced stream */                             \
    0x00                  /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */

#define VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate,                                                                                          \
                                             dwMaxVideoFrameBufferSize, dwDefaultFrameInterval)                                                                        \
    0x1E,                                    /* bLength */                                                                                                                                      \
    0x24,                                    /* bDescriptorType : CS_INTERFACE */                                                                                                               \
    VIDEO_VS_FRAME_MJPEG_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FRAME_MJPEG */                                                                                                          \
    bFrameIndex,                             /* bFrameIndex : First (and only) frame descriptor */                                                                                              \
    0x00,                                    /* bmCapabilities : Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate. */                               \
    WBVAL(wWidth),                           /* wWidth (2bytes): Width of frame is 128 pixels. */                                                                                               \
    WBVAL(wHeight),                          /* wHeight (2bytes): Height of frame is 64 pixels. */                                                                                              \
    DBVAL(dwMinBitRate),                     /* dwMinBitRate (4bytes): Min bit rate in bits/s  */                                                                                               \
    DBVAL(dwMaxBitRate),                     /* dwMaxBitRate (4bytes): Max bit rate in bits/s  */                                                                                               \
    DBVAL(dwMaxVideoFrameBufferSize),        /* dwMaxVideoFrameBufSize (4bytes): Maximum video or still frame size, in bytes. */                                                                \
    DBVAL(dwDefaultFrameInterval),           /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */                                                                                         \
    0x01,                                    /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame   */ \
    DBVAL(dwDefaultFrameInterval)

#define VIDEO_VS_FORMAT_H264_DESCRIPTOR_INIT(bFormatIndex, bNumFrameDescriptors)                     \
    /*Payload Format(H.264) Descriptor */                                                            \
    0x1c,                 /* bLength */                                                              \
    0x24,                 /* bDescriptorType : CS_INTERFACE */                                       \
    VIDEO_VS_FORMAT_FRAME_BASED_DESCRIPTOR_SUBTYPE,  /* bDescriptorSubType : VS_FORMAT_FRAME_BASED subtype */\
    bFormatIndex,         /* bFormatIndex : First (and only) format descriptor */                    \
    bNumFrameDescriptors, /* bNumFrameDescriptors : One frame descriptor for this format follows. */ \
    VIDEO_GUID_H264,                                                                                 \
    0x00,                 /* bmFlags : Uses fixed size samples.. */                                  \
    0x01,                 /* bDefaultFrameIndex : Default frame index is 1. */                       \
    0x00,                 /* bAspectRatioX : Non-interlaced stream,  not required. */                \
    0x00,                 /* bAspectRatioY : Non-interlaced stream,  not required. */                \
    0x00,                 /* bmInterlaceFlags : Non-interlaced stream */                             \
    0x00,                 /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */ \
    0x00                  /* Variable size: False */

#define VIDEO_VS_FRAME_H264_DESCRIPTOR_INIT(bFrameIndex, wWidth, wHeight, dwMinBitRate, dwMaxBitRate,                                                                                                 \
                                            dwDefaultFrameInterval)                                                                                                                                   \
    0x1E,                                          /* bLength */                                                                                                                                      \
    0x24,                                          /* bDescriptorType : CS_INTERFACE */                                                                                                               \
    VIDEO_VS_FRAME_FRAME_BASED_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_FRAME_BASED */                                                                                                          \
    bFrameIndex,                                   /* bFrameIndex : First (and only) frame descriptor */                                                                                              \
    0x00,                                          /* bmCapabilities : Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate. */                               \
    WBVAL(wWidth),                                 /* wWidth (2bytes): Width of frame is 128 pixels. */                                                                                               \
    WBVAL(wHeight),                                /* wHeight (2bytes): Height of frame is 64 pixels. */                                                                                              \
    DBVAL(dwMinBitRate),                           /* dwMinBitRate (4bytes): Min bit rate in bits/s  */                                                                                               \
    DBVAL(dwMaxBitRate),                           /* dwMaxBitRate (4bytes): Max bit rate in bits/s  */                                                                                               \
    DBVAL(dwDefaultFrameInterval),                 /* dwDefaultFrameInterval : 1,000,000 * 100ns -> 10 FPS */                                                                                         \
    0x01,                                          /* bFrameIntervalType : Indicates how the frame interval can be programmed. 0: Continuous frame interval 1..255: The number of discrete frame   */ \
    DBVAL(0x00),                                   /* dwBytesPerLine (4bytes) */                                                                                                                      \
    DBVAL(dwDefaultFrameInterval)

#define VIDEO_VS_COLOR_MATCHING_DESCRIPTOR_INIT()                                      \
    0x06,                                    /* bLength */                             \
    0x24,                                    /* bDescriptorType : CS_INTERFACE */      \
    VIDEO_VS_COLORFORMAT_DESCRIPTOR_SUBTYPE, /* bDescriptorSubType : VS_COLORFORMAT */ \
    0x01,                                    /* bColorPrimaries */                     \
    0x01,                                    /* bTransferCharacteristics */            \
    0x04                                     /* bMatrixCoefficients */

// clang-format on
#endif /*USB_VIDEO_H */