summaryrefslogtreecommitdiff
path: root/common/usbx_device_classes/inc/ux_device_class_video.h
blob: 6247008a024f7c8e0490a2bfb60f29abf923517b (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
/***************************************************************************
 * Copyright (c) 2024 Microsoft Corporation
 * Copyright (c) 2026-present Eclipse ThreadX contributors
 *
 * This program and the accompanying materials are made available under the
 * terms of the MIT License which is available at
 * https://opensource.org/licenses/MIT.
 *
 * SPDX-License-Identifier: MIT
 **************************************************************************/


/**************************************************************************/
/**************************************************************************/
/**                                                                       */
/** USBX Component                                                        */
/**                                                                       */
/**   Video Class                                                         */
/**                                                                       */
/**************************************************************************/
/**************************************************************************/


/**************************************************************************/
/*                                                                        */
/*  COMPONENT DEFINITION                                   RELEASE        */
/*                                                                        */
/*    ux_device_class_video.h                             PORTABLE C      */
/*                                                           6.3.0        */
/*  AUTHOR                                                                */
/*                                                                        */
/*    Chaoqiong Xiao, Microsoft Corporation                               */
/*                                                                        */
/*  DESCRIPTION                                                           */
/*                                                                        */
/*    This file contains all the header and extern functions used by the  */
/*    USBX device video class.                                            */
/*                                                                        */
/**************************************************************************/

#ifndef UX_DEVICE_CLASS_VIDEO_H
#define UX_DEVICE_CLASS_VIDEO_H

/* Determine if a C++ compiler is being used.  If so, ensure that standard
   C is used to process the API information.  */

#ifdef   __cplusplus

/* Yes, C++ compiler is present.  Use standard C.  */
extern   "C" {

#endif

/* Internal option: enable the basic USBX error checking. This define is typically used
   while debugging application.  */
#if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING)
#define UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING
#endif

/* Define options.  */

#define UX_DEVICE_CLASS_VIDEO_THREAD_STACK_SIZE                                              UX_THREAD_STACK_SIZE

/* Define external static data.  */

extern UCHAR _ux_system_device_class_video_name[];


/* Define IOCTL code.
     ux_device_class_video_ioctl(video, IOCTL_CODE, parameter).
 */

#define UX_DEVICE_CLASS_VIDEO_IOCTL_GET_ARG                                                  0x01


/* Define Video Class main constants.  */

#define UX_DEVICE_CLASS_VIDEO_CLASS                                                          0x0e
#define UX_DEVICE_CLASS_VIDEO_SUBCLASS_UNDEFINED                                             0
#define UX_DEVICE_CLASS_VIDEO_SUBCLASS_CONTROL                                               1
#define UX_DEVICE_CLASS_VIDEO_SUBCLASS_STREAMING                                             2
#define UX_DEVICE_CLASS_VIDEO_SUBCLASS_INTERFACE_COLLECTION                                  3

/* Class Code (CC).  */
#define UX_DEVICE_CLASS_VIDEO_CC_VIDEO                                                       0x0e

/* Subclass Code (SC).  */
#define UX_DEVICE_CLASS_VIDEO_SC_UNDEFINED                                                   0
#define UX_DEVICE_CLASS_VIDEO_SC_CONTROL                                                     1
#define UX_DEVICE_CLASS_VIDEO_SC_STREAMING                                                   2
#define UX_DEVICE_CLASS_VIDEO_SC_INTERFACE_COLLECTION                                        3

/* Protocol Code.  */
#define UX_DEVICE_CLASS_VIDEO_PC_PROTOCOL_UNDEFINED                                          0
#define UX_DEVICE_CLASS_VIDEO_PC_PROTOCOL_15                                                 0


/* Define Video Class-Specific (CS) descriptor types.  */
#define UX_DEVICE_CLASS_VIDEO_CS_UNDEFINED                                                   0x20
#define UX_DEVICE_CLASS_VIDEO_CS_DEVICE                                                      0x21
#define UX_DEVICE_CLASS_VIDEO_CS_CONFIGURATION                                               0x22
#define UX_DEVICE_CLASS_VIDEO_CS_STRING                                                      0x23
#define UX_DEVICE_CLASS_VIDEO_CS_INTERFACE                                                   0x24
#define UX_DEVICE_CLASS_VIDEO_CS_ENDPOINT                                                    0x25


/* Define Video Class specific Video Control (VC) interface descriptor subtypes.  */
#define UX_DEVICE_CLASS_VIDEO_VC_DESCRIPTOR_UNDEFINED                                        0x00
#define UX_DEVICE_CLASS_VIDEO_VC_HEADER                                                      0x01
#define UX_DEVICE_CLASS_VIDEO_VC_INPUT_TERMINAL                                              0x02
#define UX_DEVICE_CLASS_VIDEO_VC_OUTPUT_TERMINAL                                             0x03
#define UX_DEVICE_CLASS_VIDEO_VC_SELECTOR_UNIT                                               0x04
#define UX_DEVICE_CLASS_VIDEO_VC_PROCESSING_UNIT                                             0x05
#define UX_DEVICE_CLASS_VIDEO_VC_EXTENSION_UNIT                                              0x06
#define UX_DEVICE_CLASS_VIDEO_VC_ENCODING_UNIT                                               0x07


/* Define Video Class specific Video Stream (VS) interface descriptor subtypes.  */
#define UX_DEVICE_CLASS_VIDEO_VS_UNDEFINED                                                   0x00
#define UX_DEVICE_CLASS_VIDEO_VS_INPUT_HEADER                                                0x01
#define UX_DEVICE_CLASS_VIDEO_VS_OUTPUT_HEADER                                               0x02
#define UX_DEVICE_CLASS_VIDEO_VS_STILL_IMAGE_FRAME                                           0x03
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_UNCOMPRESSED                                         0x04
#define UX_DEVICE_CLASS_VIDEO_VS_FRAME_UNCOMPRESSED                                          0x05
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_MJPEG                                                0x06
#define UX_DEVICE_CLASS_VIDEO_VS_FRAME_MJPEG                                                 0x07
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_MPEG2TS                                              0x0A
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_DV                                                   0x0C
#define UX_DEVICE_CLASS_VIDEO_VS_COLORFORMAT                                                 0x0D
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_FRAME_BASED                                          0x10
#define UX_DEVICE_CLASS_VIDEO_VS_FRAME_FRAME_BASED                                           0x11
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_STREAM_BASED                                         0x12
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_H264                                                 0x13
#define UX_DEVICE_CLASS_VIDEO_VS_FRAME_H264                                                  0x14
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_H264_SIMULCAST                                       0x15
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_VP8                                                  0x16
#define UX_DEVICE_CLASS_VIDEO_VS_FRAME_VP8                                                   0x17
#define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_VP8_SIMULCAST                                        0x18


/* Define Video Class specific Endpoint (EP) descriptor subtypes.  */
#define UX_DEVICE_CLASS_VIDEO_EP_UNDEFINED                                                   0x00
#define UX_DEVICE_CLASS_VIDEO_EP_GENERAL                                                     0x01
#define UX_DEVICE_CLASS_VIDEO_EP_ENDPOINT                                                    0x02
#define UX_DEVICE_CLASS_VIDEO_EP_INTERRUPT                                                   0x03


/* Define Video Control Selector Codes.  */

/* Define VideoControl (VC) Interface Control Selector Codes.  */
#define UX_DEVICE_CLASS_VIDEO_VC_CONTROL_UNDEFINED                                           0x00
#define UX_DEVICE_CLASS_VIDEO_VC_VIDEO_POWER_MODE_CONTROL                                    0x01
#define UX_DEVICE_CLASS_VIDEO_VC_REQUEST_ERROR_CODE_CONTROL                                  0x02

/* Define Terminal Control (TE) Selectors.  */
#define UX_DEVICE_CLASS_VIDEO_TE_CONTROL_UNDEFINED                                           0x00

/* Define Selector Unit (SU) Control Selectors.  */
#define UX_DEVICE_CLASS_VIDEO_SU_CONTROL_UNDEFINED                                           0x00
#define UX_DEVICE_CLASS_VIDEO_SU_INPUT_SELECT_CONTROL                                        0x01

/* Define Camera Terminal (CT) Control Selectors.  */
#define UX_DEVICE_CLASS_VIDEO_CT_CONTROL_UNDEFINED                                           0x00
#define UX_DEVICE_CLASS_VIDEO_CT_SCANNING_MODE_CONTROL                                       0x01
#define UX_DEVICE_CLASS_VIDEO_CT_AE_MODE_CONTROL                                             0x02
#define UX_DEVICE_CLASS_VIDEO_CT_AE_PRIORITY_CONTROL                                         0x03
#define UX_DEVICE_CLASS_VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL                              0x04
#define UX_DEVICE_CLASS_VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL                              0x05
#define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_ABSOLUTE_CONTROL                                      0x06
#define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_RELATIVE_CONTROL                                      0x07
#define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_AUTO_CONTROL                                          0x08
#define UX_DEVICE_CLASS_VIDEO_CT_IRIS_ABSOLUTE_CONTROL                                       0x09
#define UX_DEVICE_CLASS_VIDEO_CT_IRIS_RELATIVE_CONTROL                                       0x0A
#define UX_DEVICE_CLASS_VIDEO_CT_ZOOM_ABSOLUTE_CONTROL                                       0x0B
#define UX_DEVICE_CLASS_VIDEO_CT_ZOOM_RELATIVE_CONTROL                                       0x0C
#define UX_DEVICE_CLASS_VIDEO_CT_PANTILT_ABSOLUTE_CONTROL                                    0x0D
#define UX_DEVICE_CLASS_VIDEO_CT_PANTILT_RELATIVE_CONTROL                                    0x0E
#define UX_DEVICE_CLASS_VIDEO_CT_ROLL_ABSOLUTE_CONTROL                                       0x0F
#define UX_DEVICE_CLASS_VIDEO_CT_ROLL_RELATIVE_CONTROL                                       0x10
#define UX_DEVICE_CLASS_VIDEO_CT_PRIVACY_CONTROL                                             0x11
#define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_SIMPLE_CONTROL                                        0x12
#define UX_DEVICE_CLASS_VIDEO_CT_WINDOW_CONTROL                                              0x13
#define UX_DEVICE_CLASS_VIDEO_CT_REGION_OF_INTEREST_CONTROL                                  0x14

/* Define Processing Unit (PU) Control Selectors.  */
#define UX_DEVICE_CLASS_VIDEO_PU_CONTROL_UNDEFINED                                           0x00
#define UX_DEVICE_CLASS_VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL                              0x01
#define UX_DEVICE_CLASS_VIDEO_PU_BRIGHTNESS_CONTROL                                          0x02
#define UX_DEVICE_CLASS_VIDEO_PU_CONTRAST_CONTROL                                            0x03
#define UX_DEVICE_CLASS_VIDEO_PU_GAIN_CONTROL                                                0x04
#define UX_DEVICE_CLASS_VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL                                0x05
#define UX_DEVICE_CLASS_VIDEO_PU_HUE_CONTROL                                                 0x06
#define UX_DEVICE_CLASS_VIDEO_PU_SATURATION_CONTROL                                          0x07
#define UX_DEVICE_CLASS_VIDEO_PU_SHARPNESS_CONTROL                                           0x08
#define UX_DEVICE_CLASS_VIDEO_PU_GAMMA_CONTROL                                               0x09
#define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL                           0x0A
#define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL                      0x0B
#define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL                             0x0C
#define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL                        0x0D
#define UX_DEVICE_CLASS_VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL                                  0x0E
#define UX_DEVICE_CLASS_VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL                            0x0F
#define UX_DEVICE_CLASS_VIDEO_PU_HUE_AUTO_CONTROL                                            0x10
#define UX_DEVICE_CLASS_VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL                               0x11
#define UX_DEVICE_CLASS_VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL                                  0x12
#define UX_DEVICE_CLASS_VIDEO_PU_CONTRAST_AUTO_CONTROL                                       0x13

/* Define eXtension Unit (XU) Control Selectors.  */
#define UX_DEVICE_CLASS_VIDEO_XU_CONTROL_UNDEFINED                                           0x00

/* Define VideoStreaming (VS) Interface Control Selectors.  */
#define UX_DEVICE_CLASS_VIDEO_VS_CONTROL_UNDEFINED                                           0x00
#define UX_DEVICE_CLASS_VIDEO_VS_PROBE_CONTROL                                               0x01
#define UX_DEVICE_CLASS_VIDEO_VS_COMMIT_CONTROL                                              0x02
#define UX_DEVICE_CLASS_VIDEO_VS_STILL_PROBE_CONTROL                                         0x03
#define UX_DEVICE_CLASS_VIDEO_VS_STILL_COMMIT_CONTROL                                        0x04
#define UX_DEVICE_CLASS_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL                                 0x05
#define UX_DEVICE_CLASS_VIDEO_VS_STREAM_ERROR_CODE_CONTROL                                   0x06
#define UX_DEVICE_CLASS_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL                                  0x07
#define UX_DEVICE_CLASS_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL                                0x08
#define UX_DEVICE_CLASS_VIDEO_VS_SYNCH_DELAY_CONTROL                                         0x09


/* Define USB Video Class terminal types.  */

/* Define USB Terminal Types (TT).  */
#define UX_DEVICE_CLASS_VIDEO_TT_VENDOR_SPECIFIC                                             0x0100
#define UX_DEVICE_CLASS_VIDEO_TT_STREAMING                                                   0x0101

/* Define USB Input Terminal Types (ITT).  */
#define UX_DEVICE_CLASS_VIDEO_ITT_VENDOR_SPECIFIC                                            0x0200
#define UX_DEVICE_CLASS_VIDEO_ITT_CAMERA                                                     0x0201
#define UX_DEVICE_CLASS_VIDEO_ITT_MEDIA_TRANSPORT_INPUT                                      0x0202

/* Define USB Output Terminal Types (OTT).  */
#define UX_DEVICE_CLASS_VIDEO_OTT_VENDOR_SPECIFIC                                            0x0300
#define UX_DEVICE_CLASS_VIDEO_OTT_DISPLAY                                                    0x0301
#define UX_DEVICE_CLASS_VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT                                     0x0302

/* Define USB External Terminal Types (XTT).  */
#define UX_DEVICE_CLASS_VIDEO_XTT_EXTERNAL_VENDOR_SPECIFIC                                   0x0400
#define UX_DEVICE_CLASS_VIDEO_XTT_COMPOSITE_CONNECTOR                                        0x0401
#define UX_DEVICE_CLASS_VIDEO_XTT_SVIDEO_CONNECTOR                                           0x0402
#define UX_DEVICE_CLASS_VIDEO_XTT_COMPONENT_CONNECTOR                                        0x0403


/* Video Class GET_INFO Capabilities and status structs and definitions.  */

#define UX_DEVICE_CLASS_VIDEO_INFO_GET_REQUEST_SUPPORT                                       (1u << 0)
#define UX_DEVICE_CLASS_VIDEO_INFO_SET_REQUEST_SUPPORT                                       (1u << 1)
#define UX_DEVICE_CLASS_VIDEO_INFO_DISABLED_DUE_TO_AUTO_MODE                                 (1u << 2)
#define UX_DEVICE_CLASS_VIDEO_INFO_AUTOUPDATE_CONTROL                                        (1u << 3)
#define UX_DEVICE_CLASS_VIDEO_INFO_ASYNCHRONOUS_CONTROL                                      (1u << 4)
#define UX_DEVICE_CLASS_VIDEO_INFO_DISABLED_DUE_TO_STATE                                     (1u << 5)


/* Video Class Probe and Commit Controls structs and definitions.  */
typedef struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_STRUCT
{
    union UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmHint_UNION {
        USHORT                                  value;
        struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmHint_STRUCT {
            USHORT                              dwFrameInterval:1;
            USHORT                              wKeyFrameRate:1;
            USHORT                              wPFrameRate:1;
            USHORT                              wCompQuality:1;
            USHORT                              wCompWindowSize:1;
        }                                       bm;
    }                                           bmHint;
    UCHAR                                       bFormatIndex;
    UCHAR                                       bFrameIndex;
    ULONG                                       dwFrameInterval;
    USHORT                                      wKeyFrameRate;
    USHORT                                      wPFrameRate;
    USHORT                                      wCompQuality;
    USHORT                                      wCompWindowSize;
    USHORT                                      wDelay;
    UCHAR                                       dwMaxVideoFrameSize[4]; /* Not alignend from now on.  */
    UCHAR                                       dwMaxPayloadTransferSize[4];
    UCHAR                                       dwClockFrequency[4];
    union UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmFramingInfo_UNION {
        UCHAR                                   value;
        struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmFramingInfo_STRUCT {
            UCHAR                               FID_required:1;
            UCHAR                               EOF_may_present:1;
            UCHAR                               EOS_may_present:1;
        }                                       bm;
    }                                           bmFramingInfo;
    UCHAR                                       bPreferedVersion;
    UCHAR                                       bMinVersion;
    UCHAR                                       bMaxVersion;

    /* Start from offset 34, additional fields introduced in UVC 1.5.  */
    UCHAR                                       bUsage;
    UCHAR                                       bBitDepthLuma;
    UCHAR                                       bmSettings;
    UCHAR                                       bMaxNumberOfRefFramesPlus1;
    union UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmRateControlModes_UNION {
        USHORT                                  value;
        struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmRateControlModes_STRUCT {
            USHORT                              rate_ctrl_mode_0:4;
            USHORT                              rate_ctrl_mode_1:4;
            USHORT                              rate_ctrl_mode_2:4;
            USHORT                              rate_ctrl_mode_3:4;
        }                                       bm;
    }                                           bmRateControlModes;
    UCHAR                                       bmLayoutPerStream;
} UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL;

#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_OFFSET                      0
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_FRAME_INTERVAL              (1U<<0)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_KEY_FRAME_RATE              (1U<<1)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_KEY_P_FRAME_RATE            (1U<<2)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_COMP_QUALITY                (1U<<3)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_COMP_WINDOW_SIZE            (1U<<4)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FORMAT_INDEX_OFFSET              2
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAME_INDEX_OFFSET               3
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAME_INTERVAL_OFFSET            4
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_KEY_FRAME_RATE_OFFSET            8
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_P_FRAME_RATE_OFFSET              10
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_COMP_QUALITY_OFFSET              12
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_COMP_WINDOW_SIZE_OFFSET          14
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_DELAY_OFFSET                     16
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_VIDEO_FRAME_SIZE_OFFSET      18
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET 22
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_CLOCK_FREQUENCY_OFFSET           26
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_OFFSET              30
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_FID_REQUIRED        (1U<<0)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_EOF_MAY_PRESENT     (1U<<1)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_EOS_MAY_PRESENT     (1U<<2)
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_PREFERED_VERSION_OFFSET          31
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MIN_VERSION_OFFSET               32
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_VERSION_OFFSET               33
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_USAGE_OFFSET                     34
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_BIT_DEPTH_LUMA_OFFSET            35
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_SETTINGS_OFFSET                  36
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_N_OF_FRAMES_PLUS1_OFFSET     37
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODES_OFFSET        38
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_NOT_APPLICABLE             0U
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_VBR_WITH_UNDERFLOW         1U
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_CBR                        2U
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_CONSTANT_QP                3U
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_GLOBAL_VBR_WITH_UNDERFLOW  4U
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_VBR                        5U
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_GLOBAL_VBR                 6U
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_LAYOUT_PER_STREAM_OFFSET         40


/* Video Class Still Probe and Commit Controls structs and definitions.  */
typedef struct UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_STRUCT
{
    UCHAR                                   bFormatIndex;
    UCHAR                                   bFrameIndex;
    UCHAR                                   bCompressionIndex;
    UCHAR                                   dwMaxVideoFrameSize[4]; /* Not aligned from now.  */
    UCHAR                                   dwMaxPayloadTransferSize[4];
} UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL;
#define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_FORMAT_INDEX_OFFSET                0
#define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_FRAME_INDEX_OFFSET                 1
#define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_COMPRESSION_INDEX_OFFSET           2
#define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_MAX_VIDEO_FRAME_SIZE_OFFSET        3
#define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET   7


/* Video Class Status Packet structs and definitions.  */

/* Offsets and possible values.  */
typedef struct UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_HEADER_STRUCT
{
   UCHAR                                    bStatusType;
   UCHAR                                    bOriginator;
} UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_HEADER;
typedef struct UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_STRUCT
{
   UCHAR                                     bStatusType;
   UCHAR                                     bOriginator;
   UCHAR                                     bEvent;
   UCHAR                                     bSelector;
   UCHAR                                     bAttribute;
   UCHAR                                     bValue[1];     /* varies on bAttribute.  */
} UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC;
typedef struct UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VS_STRUCT
{
   UCHAR                                     bStatusType;
   UCHAR                                     bOriginator;
   UCHAR                                     bEvent;
   UCHAR                                     bValue[1];     /* varies on bEvent.  */
} UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VS;
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_TYPE_OFFSET                                      0
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_TYPE_VC                                          1
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_TYPE_VS                                          2
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_ORIGINATOR_OFFSET                                1
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_EVENT_OFFSET                                     2
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_SELECTOR_OFFSET                               3
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_ATTRIBUTE_OFFSET                              4
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_VALUE_OFFSET                                  5
#define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VS_VALUE_OFFSET                                  3


/* Define Video Class Payload Header structs and definitions.  */
typedef struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_STRUCT
{
   UCHAR                                     bHeaderLength;
   union UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_INFO_UNION {
      UCHAR                                  value;
      struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_INFO_STRUCT {
         UCHAR                               bFID:1; /* Frame ID.  */
         UCHAR                               bEOF:1; /* End of Frame.  */
         UCHAR                               bPTS:1; /* Presentation Time.  */
         UCHAR                               bSCR:1; /* Source Clock Reference.  */
         UCHAR                               bRES:1; /* Reserved, Payload Specific.  */
         UCHAR                               bSTI:1; /* Still Image.  */
         UCHAR                               bERR:1; /* Error.  */
         UCHAR                               bEOH:1; /* End of Header.  */
      }                                      bm;
   }                                         bmHeaderInfo;
   UCHAR                                     dwPresentationTime[4];
   union UX_DEVICE_CLASS_VIDEO_PAYLOAD_SCR_UNION {
      UCHAR                                  byte_array[6];
      struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_SCR_STRUCT {
         UCHAR                               STC[4];  /* SourceTimeClock.  */
         USHORT                              SCR;     /* 1KHz SOF token counter.  */
      }                                      bm;
   }                                         scrSourceClock;
} UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER;
#define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_LENGTH_OFFSET                                   0
#define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_INFO_OFFSET                                     1
#define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_PRESENTATION_TIME_OFFSET                        4
#define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_PTS_OFFSET                                      4
#define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_SCR_SOURCE_CLOCK_OFFSET                         6
#define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_SCR_OFFSET                                      6


/* Define Video Class specific request codes.  */
#define UX_DEVICE_CLASS_VIDEO_REQUEST_CODE_UNDEFINED                                         0x00
#define UX_DEVICE_CLASS_VIDEO_RC_UNDEFINED                                                   0x00
#define UX_DEVICE_CLASS_VIDEO_SET_CUR                                                        0x01
#define UX_DEVICE_CLASS_VIDEO_GET_CUR                                                        0x81
#define UX_DEVICE_CLASS_VIDEO_GET_MIN                                                        0x82
#define UX_DEVICE_CLASS_VIDEO_GET_MAX                                                        0x83
#define UX_DEVICE_CLASS_VIDEO_GET_RES                                                        0x84
#define UX_DEVICE_CLASS_VIDEO_GET_INFO                                                       0x86
#define UX_DEVICE_CLASS_VIDEO_GET_DEF                                                        0x87
#define UX_DEVICE_CLASS_VIDEO_GET_CUR_ALL                                                    0x91
#define UX_DEVICE_CLASS_VIDEO_GET_MIN_ALL                                                    0x92
#define UX_DEVICE_CLASS_VIDEO_GET_MAX_ALL                                                    0x93
#define UX_DEVICE_CLASS_VIDEO_GET_RES_ALL                                                    0x94
#define UX_DEVICE_CLASS_VIDEO_GET_GET_DEF_ALL                                                0x97


/* Define Video Class Device Power Modes.  */
#define UX_DEVICE_CLASS_VIDEO_POWER_MODE_MASK                                                0x0Fu
#define UX_DEVICE_CLASS_VIDEO_POWER_MODE_FULL                                                0x00u
#define UX_DEVICE_CLASS_VIDEO_POWER_MODE_DEVICE_DEPENDENT                                    0x01u
#define UX_DEVICE_CLASS_VIDEO_POWER_DEPENDENT_MODE_SUPPORTED                                 0x10u
#define UX_DEVICE_CLASS_VIDEO_POWER_USES_USB                                                 0x20u
#define UX_DEVICE_CLASS_VIDEO_POWER_USES_BATTERY                                             0x40u
#define UX_DEVICE_CLASS_VIDEO_POWER_USES_AC                                                  0x80u


/* Define Video Class Request Error Codes.  */
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_NO_ERROR                                    0x00
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_NOT_READY                                   0x01
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_WRONG_STATE                                 0x02
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_POWER                                       0x03
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_OUT_OF_RANGE                                0x04
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_INPUT                               0x05
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_CONTROL                             0x06
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_REQUEST                             0x07
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_VALUE_WITHIN_RANGE                  0x08
#define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_UNKNOWN                                     0xFF


/* Define Video Class Probe and Commit Controls */
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_LENGTH_1_1                                        34
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_LENGTH_1_5                                        48
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_HINT_OFFSET                                       0
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FORMAT_INDEX_OFFSET                               2
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FRAME_INDEX_OFFSET                                3
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FRAME_INTERVAL_OFFSET                             4
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET                             8
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_PFRAME_RAE_OFFSET                                 10
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_COMP_QUALITY_OFFSET                               12
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET                           14
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_DELAY_OFFSET                                      16
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET                       18
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET                  22
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET                            26
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FRAMING_INFO_OFFSET                               30
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_PREFERED_VERSION_OFFSET                           31
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MIN_VERSION_OFFSET                                32
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_VERSION_OFFSET                                33
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_USAGE_OFFSET                                      34
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_BIT_DEPTH_LUMA_OFFSET                             35
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_SETTINGS_OFFSET                                   36
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_NUMBER_OF_REF_FRAMES_PLUS1_OFFSET             37
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_RATE_CONTROL_MODES_OFFSET                         38
#define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_LAYOUT_PER_STREAM_OFFSET                          40


/* Define Video Class Stream Error Codes.  */
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_NO_ERROR                                     0
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_PROTECTED_CONTENT                            1
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_INPUT_BUFFER_UNDERRUN                        2
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_DATA_DISCONTINUITY                           3
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_OUTPUT_BUFFER_UNDERRUN                       4
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_OUTPUT_BUFFER_OVERRUN                        5
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_FORMAT_CHANGE                                6
#define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_STILL_IMAGE_CAPTURE_ERROR                    7


/* Define Video Class Task states.  */
#define UX_DEVICE_CLASS_VIDEO_STREAM_RW_STOP            (UX_STATE_RESET)
#define UX_DEVICE_CLASS_VIDEO_STREAM_RW_START           (UX_STATE_STEP + 1)
#define UX_DEVICE_CLASS_VIDEO_STREAM_RW_WAIT            (UX_STATE_STEP + 2)


/* Define Video Class callback structure.  */

struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT;
struct UX_DEVICE_CLASS_VIDEO_STRUCT;

typedef struct UX_DEVICE_CLASS_VIDEO_CALLBACKS_STRUCT
{

    VOID        (*ux_slave_class_video_instance_activate)(VOID *);
    VOID        (*ux_slave_class_video_instance_deactivate)(VOID *);
    UINT        (*ux_device_class_video_request)(struct UX_DEVICE_CLASS_VIDEO_STRUCT *, UX_SLAVE_TRANSFER *);
    VOID         *ux_device_class_video_arg;
} UX_DEVICE_CLASS_VIDEO_CALLBACKS;

typedef struct UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS_STRUCT
{
    VOID        (*ux_device_class_video_stream_change)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT *, ULONG);
    UINT        (*ux_device_class_video_stream_request)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT *, UX_SLAVE_TRANSFER *);
    VOID        (*ux_device_class_video_stream_payload_done)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT *, ULONG);
} UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS;


/* Define Video Class Calling Parameter structure */

typedef struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_STRUCT
{

    ULONG                                   ux_device_class_video_payload_length;
    UCHAR                                   ux_device_class_video_payload_data[4]; /* Actually size of length.  */
} UX_DEVICE_CLASS_VIDEO_PAYLOAD;

typedef struct UX_DEVICE_CLASS_VIDEO_STREAM_PARAMETER_STRUCT
{
#if defined(UX_DEVICE_STANDALONE)
    UINT                                   (*ux_device_class_video_stream_parameter_task_function)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT*);
#else
    ULONG                                    ux_device_class_video_stream_parameter_thread_stack_size;
    VOID                                   (*ux_device_class_video_stream_parameter_thread_entry)(ULONG id);
#endif
    UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS   ux_device_class_video_stream_parameter_callbacks;

    ULONG                                    ux_device_class_video_stream_parameter_max_payload_buffer_size;
    ULONG                                    ux_device_class_video_stream_parameter_max_payload_buffer_nb;
} UX_DEVICE_CLASS_VIDEO_STREAM_PARAMETER;

typedef struct UX_DEVICE_CLASS_VIDEO_PARAMETER_STRUCT
{
    ULONG                                    ux_device_class_video_parameter_master_interface;
    UX_DEVICE_CLASS_VIDEO_CALLBACKS          ux_device_class_video_parameter_callbacks;

    ULONG                                    ux_device_class_video_parameter_streams_nb;
    UX_DEVICE_CLASS_VIDEO_STREAM_PARAMETER  *ux_device_class_video_parameter_streams;
} UX_DEVICE_CLASS_VIDEO_PARAMETER;

typedef struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT
{

    struct UX_DEVICE_CLASS_VIDEO_STRUCT     *ux_device_class_video_stream_video;
    UX_SLAVE_INTERFACE                      *ux_device_class_video_stream_interface;
    UX_SLAVE_ENDPOINT                       *ux_device_class_video_stream_endpoint;

    ULONG                                    ux_device_class_video_stream_error;

    UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS   ux_device_class_video_stream_callbacks;

#if !defined(UX_DEVICE_STANDALONE)
    UCHAR                                   *ux_device_class_video_stream_thread_stack;
    UX_THREAD                                ux_device_class_video_stream_thread;
#else
    UINT                                   (*ux_device_class_video_stream_task_function)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT*);
    UINT                                    ux_device_class_video_stream_task_state;
    UINT                                    ux_device_class_video_stream_task_status;
#endif

    ULONG                                   ux_device_class_video_stream_buffer_error_count;
    UCHAR                                   *ux_device_class_video_stream_buffer;
    ULONG                                    ux_device_class_video_stream_buffer_size;
    ULONG                                    ux_device_class_video_stream_payload_buffer_size;

    UX_DEVICE_CLASS_VIDEO_PAYLOAD           *ux_device_class_video_stream_transfer_pos;
    UX_DEVICE_CLASS_VIDEO_PAYLOAD           *ux_device_class_video_stream_access_pos;
} UX_DEVICE_CLASS_VIDEO_STREAM;
#define _ux_device_class_video_stream_error_set(s,e) do {                       \
    (s)->ux_device_class_video_stream_error = (e);                              \
} while(0)

typedef struct UX_DEVICE_CLASS_VIDEO_STRUCT
{

    UX_SLAVE_CLASS                          *ux_device_class_video_class;
    UX_SLAVE_DEVICE                         *ux_device_class_video_device;
    UX_SLAVE_INTERFACE                      *ux_device_class_video_interface;

    ULONG                                    ux_device_class_video_error;

    UX_DEVICE_CLASS_VIDEO_CALLBACKS          ux_device_class_video_callbacks;

    ULONG                                    ux_device_class_video_streams_nb;
    UX_DEVICE_CLASS_VIDEO_STREAM            *ux_device_class_video_streams;

} UX_DEVICE_CLASS_VIDEO;
#define _ux_device_class_video_request_error_set(v,e) do {                      \
    (v)->ux_device_class_video_error = (e);                                     \
} while(0)


/* Define Video Class function prototypes.  */

UINT    _ux_device_class_video_initialize(UX_SLAVE_CLASS_COMMAND *command);
UINT    _ux_device_class_video_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
UINT    _ux_device_class_video_activate(UX_SLAVE_CLASS_COMMAND *command);
UINT    _ux_device_class_video_change(UX_SLAVE_CLASS_COMMAND *command);
UINT    _ux_device_class_video_deactivate(UX_SLAVE_CLASS_COMMAND *command);
UINT    _ux_device_class_video_control_request(UX_SLAVE_CLASS_COMMAND *command);

UINT    _ux_device_class_video_entry(UX_SLAVE_CLASS_COMMAND *command);

UINT    _ux_device_class_video_ioctl(UX_DEVICE_CLASS_VIDEO *video, ULONG ioctl_function,
                                     VOID *parameter);

UINT    _ux_device_class_video_stream_get(UX_DEVICE_CLASS_VIDEO *video, ULONG stream_index, UX_DEVICE_CLASS_VIDEO_STREAM **stream);

VOID    _ux_device_class_video_write_thread_entry(ULONG video_stream);
VOID    _ux_device_class_video_read_thread_entry(ULONG video_stream);

ULONG   _ux_device_class_video_max_payload_length(UX_DEVICE_CLASS_VIDEO_STREAM *video);

UINT    _ux_device_class_video_reception_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);

UINT    _ux_device_class_video_read_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **payload_data, ULONG *payload_length);
UINT    _ux_device_class_video_read_payload_free(UX_DEVICE_CLASS_VIDEO_STREAM *video);

UINT    _ux_device_class_video_transmission_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);

UINT    _ux_device_class_video_write_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **buffer, ULONG *max_length);
UINT    _ux_device_class_video_write_payload_commit(UX_DEVICE_CLASS_VIDEO_STREAM *video, ULONG length);

UINT    _ux_device_class_video_tasks_run(VOID *instance);
UINT    _ux_device_class_video_read_task_function(UX_DEVICE_CLASS_VIDEO_STREAM *stream);
UINT    _ux_device_class_video_write_task_function(UX_DEVICE_CLASS_VIDEO_STREAM *stream);

UINT    _uxe_device_class_video_initialize(UX_SLAVE_CLASS_COMMAND *command);
ULONG   _uxe_device_class_video_max_payload_length(UX_DEVICE_CLASS_VIDEO_STREAM *video);
UINT    _uxe_device_class_video_reception_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);
UINT    _uxe_device_class_video_read_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **payload_data, ULONG *payload_length);
UINT    _uxe_device_class_video_read_payload_free(UX_DEVICE_CLASS_VIDEO_STREAM *video);
UINT    _uxe_device_class_video_transmission_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);
UINT    _uxe_device_class_video_write_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **buffer, ULONG *max_length);
UINT    _uxe_device_class_video_write_payload_commit(UX_DEVICE_CLASS_VIDEO_STREAM *video, ULONG length);
UINT    _uxe_device_class_video_ioctl(UX_DEVICE_CLASS_VIDEO *video, ULONG ioctl_function, VOID *parameter);

/* Define Video Class API prototypes.  */

#if defined(UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING)

#define ux_device_class_video_entry                   _ux_device_class_video_entry

#define ux_device_class_video_read_thread_entry       _ux_device_class_video_read_thread_entry
#define ux_device_class_video_write_thread_entry      _ux_device_class_video_write_thread_entry

#define ux_device_class_video_request_error_set       _ux_device_class_video_request_error_set
#define ux_device_class_video_stream_error_set        _ux_device_class_video_stream_error_set

#define ux_device_class_video_stream_get              _ux_device_class_video_stream_get

#define ux_device_class_video_max_payload_length      _uxe_device_class_video_max_payload_length

#define ux_device_class_video_reception_start         _uxe_device_class_video_reception_start

#define ux_device_class_video_read_payload_get        _uxe_device_class_video_read_payload_get
#define ux_device_class_video_read_payload_free       _uxe_device_class_video_read_payload_free

#define ux_device_class_video_transmission_start      _uxe_device_class_video_transmission_start

#define ux_device_class_video_write_payload_get       _uxe_device_class_video_write_payload_get
#define ux_device_class_video_write_payload_commit    _uxe_device_class_video_write_payload_commit

#define ux_device_class_video_ioctl                   _uxe_device_class_video_ioctl

#define ux_device_class_video_read_task_function      _ux_device_class_video_read_task_function
#define ux_device_class_video_write_task_function     _ux_device_class_video_write_task_function

#else

#define ux_device_class_video_entry                   _ux_device_class_video_entry

#define ux_device_class_video_read_thread_entry       _ux_device_class_video_read_thread_entry
#define ux_device_class_video_write_thread_entry      _ux_device_class_video_write_thread_entry

#define ux_device_class_video_request_error_set       _ux_device_class_video_request_error_set
#define ux_device_class_video_stream_error_set        _ux_device_class_video_stream_error_set

#define ux_device_class_video_stream_get              _ux_device_class_video_stream_get

#define ux_device_class_video_max_payload_length      _ux_device_class_video_max_payload_length

#define ux_device_class_video_reception_start         _ux_device_class_video_reception_start

#define ux_device_class_video_read_payload_get        _ux_device_class_video_read_payload_get
#define ux_device_class_video_read_payload_free       _ux_device_class_video_read_payload_free

#define ux_device_class_video_transmission_start      _ux_device_class_video_transmission_start

#define ux_device_class_video_write_payload_get       _ux_device_class_video_write_payload_get
#define ux_device_class_video_write_payload_commit    _ux_device_class_video_write_payload_commit

#define ux_device_class_video_ioctl                   _ux_device_class_video_ioctl

#define ux_device_class_video_read_task_function      _ux_device_class_video_read_task_function
#define ux_device_class_video_write_task_function     _ux_device_class_video_write_task_function

#endif  /* UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING */

/* Determine if a C++ compiler is being used.  If so, complete the standard
   C conditional started above.  */
#ifdef __cplusplus
}
#endif

#endif