1 /***************************************************************************
2  * Copyright (c) 2024 Microsoft Corporation
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the MIT License which is available at
6  * https://opensource.org/licenses/MIT.
7  *
8  * SPDX-License-Identifier: MIT
9  **************************************************************************/
10 
11 
12 /**************************************************************************/
13 /**************************************************************************/
14 /**                                                                       */
15 /** USBX Component                                                        */
16 /**                                                                       */
17 /**   Video Class                                                         */
18 /**                                                                       */
19 /**************************************************************************/
20 /**************************************************************************/
21 
22 
23 /**************************************************************************/
24 /*                                                                        */
25 /*  COMPONENT DEFINITION                                   RELEASE        */
26 /*                                                                        */
27 /*    ux_device_class_video.h                             PORTABLE C      */
28 /*                                                           6.3.0        */
29 /*  AUTHOR                                                                */
30 /*                                                                        */
31 /*    Chaoqiong Xiao, Microsoft Corporation                               */
32 /*                                                                        */
33 /*  DESCRIPTION                                                           */
34 /*                                                                        */
35 /*    This file contains all the header and extern functions used by the  */
36 /*    USBX device video class.                                            */
37 /*                                                                        */
38 /*  RELEASE HISTORY                                                       */
39 /*                                                                        */
40 /*    DATE              NAME                      DESCRIPTION             */
41 /*                                                                        */
42 /*  04-25-2022     Chaoqiong Xiao           Initial Version 6.1.11        */
43 /*  10-31-2022     Chaoqiong Xiao           Modified comment(s),          */
44 /*                                            added standalone support,   */
45 /*                                            resulting in version 6.2.0  */
46 /*  10-31-2023     Yajun xia, CQ Xiao       Modified comment(s),          */
47 /*                                            added a new mode to manage  */
48 /*                                            endpoint buffer in classes  */
49 /*                                            with zero copy enabled,     */
50 /*                                            added error checks support, */
51 /*                                            resulting in version 6.3.0  */
52 /*                                                                        */
53 /**************************************************************************/
54 
55 #ifndef UX_DEVICE_CLASS_VIDEO_H
56 #define UX_DEVICE_CLASS_VIDEO_H
57 
58 /* Determine if a C++ compiler is being used.  If so, ensure that standard
59    C is used to process the API information.  */
60 
61 #ifdef   __cplusplus
62 
63 /* Yes, C++ compiler is present.  Use standard C.  */
64 extern   "C" {
65 
66 #endif
67 
68 /* Internal option: enable the basic USBX error checking. This define is typically used
69    while debugging application.  */
70 #if defined(UX_ENABLE_ERROR_CHECKING) && !defined(UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING)
71 #define UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING
72 #endif
73 
74 /* Define options.  */
75 
76 #define UX_DEVICE_CLASS_VIDEO_THREAD_STACK_SIZE                                              UX_THREAD_STACK_SIZE
77 
78 /* Define external static data.  */
79 
80 extern UCHAR _ux_system_device_class_video_name[];
81 
82 
83 /* Define IOCTL code.
84      ux_device_class_video_ioctl(video, IOCTL_CODE, parameter).
85  */
86 
87 #define UX_DEVICE_CLASS_VIDEO_IOCTL_GET_ARG                                                  0x01
88 
89 
90 /* Define Video Class main constants.  */
91 
92 #define UX_DEVICE_CLASS_VIDEO_CLASS                                                          0x0e
93 #define UX_DEVICE_CLASS_VIDEO_SUBCLASS_UNDEFINED                                             0
94 #define UX_DEVICE_CLASS_VIDEO_SUBCLASS_CONTROL                                               1
95 #define UX_DEVICE_CLASS_VIDEO_SUBCLASS_STREAMING                                             2
96 #define UX_DEVICE_CLASS_VIDEO_SUBCLASS_INTERFACE_COLLECTION                                  3
97 
98 /* Class Code (CC).  */
99 #define UX_DEVICE_CLASS_VIDEO_CC_VIDEO                                                       0x0e
100 
101 /* Subclass Code (SC).  */
102 #define UX_DEVICE_CLASS_VIDEO_SC_UNDEFINED                                                   0
103 #define UX_DEVICE_CLASS_VIDEO_SC_CONTROL                                                     1
104 #define UX_DEVICE_CLASS_VIDEO_SC_STREAMING                                                   2
105 #define UX_DEVICE_CLASS_VIDEO_SC_INTERFACE_COLLECTION                                        3
106 
107 /* Protocol Code.  */
108 #define UX_DEVICE_CLASS_VIDEO_PC_PROTOCOL_UNDEFINED                                          0
109 #define UX_DEVICE_CLASS_VIDEO_PC_PROTOCOL_15                                                 0
110 
111 
112 /* Define Video Class-Specific (CS) descriptor types.  */
113 #define UX_DEVICE_CLASS_VIDEO_CS_UNDEFINED                                                   0x20
114 #define UX_DEVICE_CLASS_VIDEO_CS_DEVICE                                                      0x21
115 #define UX_DEVICE_CLASS_VIDEO_CS_CONFIGURATION                                               0x22
116 #define UX_DEVICE_CLASS_VIDEO_CS_STRING                                                      0x23
117 #define UX_DEVICE_CLASS_VIDEO_CS_INTERFACE                                                   0x24
118 #define UX_DEVICE_CLASS_VIDEO_CS_ENDPOINT                                                    0x25
119 
120 
121 /* Define Video Class specific Video Control (VC) interface descriptor subtypes.  */
122 #define UX_DEVICE_CLASS_VIDEO_VC_DESCRIPTOR_UNDEFINED                                        0x00
123 #define UX_DEVICE_CLASS_VIDEO_VC_HEADER                                                      0x01
124 #define UX_DEVICE_CLASS_VIDEO_VC_INPUT_TERMINAL                                              0x02
125 #define UX_DEVICE_CLASS_VIDEO_VC_OUTPUT_TERMINAL                                             0x03
126 #define UX_DEVICE_CLASS_VIDEO_VC_SELECTOR_UNIT                                               0x04
127 #define UX_DEVICE_CLASS_VIDEO_VC_PROCESSING_UNIT                                             0x05
128 #define UX_DEVICE_CLASS_VIDEO_VC_EXTENSION_UNIT                                              0x06
129 #define UX_DEVICE_CLASS_VIDEO_VC_ENCODING_UNIT                                               0x07
130 
131 
132 /* Define Video Class specific Video Stream (VS) interface descriptor subtypes.  */
133 #define UX_DEVICE_CLASS_VIDEO_VS_UNDEFINED                                                   0x00
134 #define UX_DEVICE_CLASS_VIDEO_VS_INPUT_HEADER                                                0x01
135 #define UX_DEVICE_CLASS_VIDEO_VS_OUTPUT_HEADER                                               0x02
136 #define UX_DEVICE_CLASS_VIDEO_VS_STILL_IMAGE_FRAME                                           0x03
137 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_UNCOMPRESSED                                         0x04
138 #define UX_DEVICE_CLASS_VIDEO_VS_FRAME_UNCOMPRESSED                                          0x05
139 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_MJPEG                                                0x06
140 #define UX_DEVICE_CLASS_VIDEO_VS_FRAME_MJPEG                                                 0x07
141 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_MPEG2TS                                              0x0A
142 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_DV                                                   0x0C
143 #define UX_DEVICE_CLASS_VIDEO_VS_COLORFORMAT                                                 0x0D
144 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_FRAME_BASED                                          0x10
145 #define UX_DEVICE_CLASS_VIDEO_VS_FRAME_FRAME_BASED                                           0x11
146 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_STREAM_BASED                                         0x12
147 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_H264                                                 0x13
148 #define UX_DEVICE_CLASS_VIDEO_VS_FRAME_H264                                                  0x14
149 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_H264_SIMULCAST                                       0x15
150 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_VP8                                                  0x16
151 #define UX_DEVICE_CLASS_VIDEO_VS_FRAME_VP8                                                   0x17
152 #define UX_DEVICE_CLASS_VIDEO_VS_FORMAT_VP8_SIMULCAST                                        0x18
153 
154 
155 /* Define Video Class specific Endpoint (EP) descriptor subtypes.  */
156 #define UX_DEVICE_CLASS_VIDEO_EP_UNDEFINED                                                   0x00
157 #define UX_DEVICE_CLASS_VIDEO_EP_GENERAL                                                     0x01
158 #define UX_DEVICE_CLASS_VIDEO_EP_ENDPOINT                                                    0x02
159 #define UX_DEVICE_CLASS_VIDEO_EP_INTERRUPT                                                   0x03
160 
161 
162 /* Define Video Control Selector Codes.  */
163 
164 /* Define VideoControl (VC) Interface Control Selector Codes.  */
165 #define UX_DEVICE_CLASS_VIDEO_VC_CONTROL_UNDEFINED                                           0x00
166 #define UX_DEVICE_CLASS_VIDEO_VC_VIDEO_POWER_MODE_CONTROL                                    0x01
167 #define UX_DEVICE_CLASS_VIDEO_VC_REQUEST_ERROR_CODE_CONTROL                                  0x02
168 
169 /* Define Terminal Control (TE) Selectors.  */
170 #define UX_DEVICE_CLASS_VIDEO_TE_CONTROL_UNDEFINED                                           0x00
171 
172 /* Define Selector Unit (SU) Control Selectors.  */
173 #define UX_DEVICE_CLASS_VIDEO_SU_CONTROL_UNDEFINED                                           0x00
174 #define UX_DEVICE_CLASS_VIDEO_SU_INPUT_SELECT_CONTROL                                        0x01
175 
176 /* Define Camera Terminal (CT) Control Selectors.  */
177 #define UX_DEVICE_CLASS_VIDEO_CT_CONTROL_UNDEFINED                                           0x00
178 #define UX_DEVICE_CLASS_VIDEO_CT_SCANNING_MODE_CONTROL                                       0x01
179 #define UX_DEVICE_CLASS_VIDEO_CT_AE_MODE_CONTROL                                             0x02
180 #define UX_DEVICE_CLASS_VIDEO_CT_AE_PRIORITY_CONTROL                                         0x03
181 #define UX_DEVICE_CLASS_VIDEO_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL                              0x04
182 #define UX_DEVICE_CLASS_VIDEO_CT_EXPOSURE_TIME_RELATIVE_CONTROL                              0x05
183 #define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_ABSOLUTE_CONTROL                                      0x06
184 #define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_RELATIVE_CONTROL                                      0x07
185 #define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_AUTO_CONTROL                                          0x08
186 #define UX_DEVICE_CLASS_VIDEO_CT_IRIS_ABSOLUTE_CONTROL                                       0x09
187 #define UX_DEVICE_CLASS_VIDEO_CT_IRIS_RELATIVE_CONTROL                                       0x0A
188 #define UX_DEVICE_CLASS_VIDEO_CT_ZOOM_ABSOLUTE_CONTROL                                       0x0B
189 #define UX_DEVICE_CLASS_VIDEO_CT_ZOOM_RELATIVE_CONTROL                                       0x0C
190 #define UX_DEVICE_CLASS_VIDEO_CT_PANTILT_ABSOLUTE_CONTROL                                    0x0D
191 #define UX_DEVICE_CLASS_VIDEO_CT_PANTILT_RELATIVE_CONTROL                                    0x0E
192 #define UX_DEVICE_CLASS_VIDEO_CT_ROLL_ABSOLUTE_CONTROL                                       0x0F
193 #define UX_DEVICE_CLASS_VIDEO_CT_ROLL_RELATIVE_CONTROL                                       0x10
194 #define UX_DEVICE_CLASS_VIDEO_CT_PRIVACY_CONTROL                                             0x11
195 #define UX_DEVICE_CLASS_VIDEO_CT_FOCUS_SIMPLE_CONTROL                                        0x12
196 #define UX_DEVICE_CLASS_VIDEO_CT_WINDOW_CONTROL                                              0x13
197 #define UX_DEVICE_CLASS_VIDEO_CT_REGION_OF_INTEREST_CONTROL                                  0x14
198 
199 /* Define Processing Unit (PU) Control Selectors.  */
200 #define UX_DEVICE_CLASS_VIDEO_PU_CONTROL_UNDEFINED                                           0x00
201 #define UX_DEVICE_CLASS_VIDEO_PU_BACKLIGHT_COMPENSATION_CONTROL                              0x01
202 #define UX_DEVICE_CLASS_VIDEO_PU_BRIGHTNESS_CONTROL                                          0x02
203 #define UX_DEVICE_CLASS_VIDEO_PU_CONTRAST_CONTROL                                            0x03
204 #define UX_DEVICE_CLASS_VIDEO_PU_GAIN_CONTROL                                                0x04
205 #define UX_DEVICE_CLASS_VIDEO_PU_POWER_LINE_FREQUENCY_CONTROL                                0x05
206 #define UX_DEVICE_CLASS_VIDEO_PU_HUE_CONTROL                                                 0x06
207 #define UX_DEVICE_CLASS_VIDEO_PU_SATURATION_CONTROL                                          0x07
208 #define UX_DEVICE_CLASS_VIDEO_PU_SHARPNESS_CONTROL                                           0x08
209 #define UX_DEVICE_CLASS_VIDEO_PU_GAMMA_CONTROL                                               0x09
210 #define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_CONTROL                           0x0A
211 #define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL                      0x0B
212 #define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_COMPONENT_CONTROL                             0x0C
213 #define UX_DEVICE_CLASS_VIDEO_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL                        0x0D
214 #define UX_DEVICE_CLASS_VIDEO_PU_DIGITAL_MULTIPLIER_CONTROL                                  0x0E
215 #define UX_DEVICE_CLASS_VIDEO_PU_DIGITAL_MULTIPLIER_LIMIT_CONTROL                            0x0F
216 #define UX_DEVICE_CLASS_VIDEO_PU_HUE_AUTO_CONTROL                                            0x10
217 #define UX_DEVICE_CLASS_VIDEO_PU_ANALOG_VIDEO_STANDARD_CONTROL                               0x11
218 #define UX_DEVICE_CLASS_VIDEO_PU_ANALOG_LOCK_STATUS_CONTROL                                  0x12
219 #define UX_DEVICE_CLASS_VIDEO_PU_CONTRAST_AUTO_CONTROL                                       0x13
220 
221 /* Define eXtension Unit (XU) Control Selectors.  */
222 #define UX_DEVICE_CLASS_VIDEO_XU_CONTROL_UNDEFINED                                           0x00
223 
224 /* Define VideoStreaming (VS) Interface Control Selectors.  */
225 #define UX_DEVICE_CLASS_VIDEO_VS_CONTROL_UNDEFINED                                           0x00
226 #define UX_DEVICE_CLASS_VIDEO_VS_PROBE_CONTROL                                               0x01
227 #define UX_DEVICE_CLASS_VIDEO_VS_COMMIT_CONTROL                                              0x02
228 #define UX_DEVICE_CLASS_VIDEO_VS_STILL_PROBE_CONTROL                                         0x03
229 #define UX_DEVICE_CLASS_VIDEO_VS_STILL_COMMIT_CONTROL                                        0x04
230 #define UX_DEVICE_CLASS_VIDEO_VS_STILL_IMAGE_TRIGGER_CONTROL                                 0x05
231 #define UX_DEVICE_CLASS_VIDEO_VS_STREAM_ERROR_CODE_CONTROL                                   0x06
232 #define UX_DEVICE_CLASS_VIDEO_VS_GENERATE_KEY_FRAME_CONTROL                                  0x07
233 #define UX_DEVICE_CLASS_VIDEO_VS_UPDATE_FRAME_SEGMENT_CONTROL                                0x08
234 #define UX_DEVICE_CLASS_VIDEO_VS_SYNCH_DELAY_CONTROL                                         0x09
235 
236 
237 /* Define USB Video Class terminal types.  */
238 
239 /* Define USB Terminal Types (TT).  */
240 #define UX_DEVICE_CLASS_VIDEO_TT_VENDOR_SPECIFIC                                             0x0100
241 #define UX_DEVICE_CLASS_VIDEO_TT_STREAMING                                                   0x0101
242 
243 /* Define USB Input Terminal Types (ITT).  */
244 #define UX_DEVICE_CLASS_VIDEO_ITT_VENDOR_SPECIFIC                                            0x0200
245 #define UX_DEVICE_CLASS_VIDEO_ITT_CAMERA                                                     0x0201
246 #define UX_DEVICE_CLASS_VIDEO_ITT_MEDIA_TRANSPORT_INPUT                                      0x0202
247 
248 /* Define USB Output Terminal Types (OTT).  */
249 #define UX_DEVICE_CLASS_VIDEO_OTT_VENDOR_SPECIFIC                                            0x0300
250 #define UX_DEVICE_CLASS_VIDEO_OTT_DISPLAY                                                    0x0301
251 #define UX_DEVICE_CLASS_VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT                                     0x0302
252 
253 /* Define USB External Terminal Types (XTT).  */
254 #define UX_DEVICE_CLASS_VIDEO_XTT_EXTERNAL_VENDOR_SPECIFIC                                   0x0400
255 #define UX_DEVICE_CLASS_VIDEO_XTT_COMPOSITE_CONNECTOR                                        0x0401
256 #define UX_DEVICE_CLASS_VIDEO_XTT_SVIDEO_CONNECTOR                                           0x0402
257 #define UX_DEVICE_CLASS_VIDEO_XTT_COMPONENT_CONNECTOR                                        0x0403
258 
259 
260 /* Video Class GET_INFO Capabilities and status structs and definitions.  */
261 
262 #define UX_DEVICE_CLASS_VIDEO_INFO_GET_REQUEST_SUPPORT                                       (1u << 0)
263 #define UX_DEVICE_CLASS_VIDEO_INFO_SET_REQUEST_SUPPORT                                       (1u << 1)
264 #define UX_DEVICE_CLASS_VIDEO_INFO_DISABLED_DUE_TO_AUTO_MODE                                 (1u << 2)
265 #define UX_DEVICE_CLASS_VIDEO_INFO_AUTOUPDATE_CONTROL                                        (1u << 3)
266 #define UX_DEVICE_CLASS_VIDEO_INFO_ASYNCHRONOUS_CONTROL                                      (1u << 4)
267 #define UX_DEVICE_CLASS_VIDEO_INFO_DISABLED_DUE_TO_STATE                                     (1u << 5)
268 
269 
270 /* Video Class Probe and Commit Controls structs and definitions.  */
271 typedef struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_STRUCT
272 {
273     union UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmHint_UNION {
274         USHORT                                  value;
275         struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmHint_STRUCT {
276             USHORT                              dwFrameInterval:1;
277             USHORT                              wKeyFrameRate:1;
278             USHORT                              wPFrameRate:1;
279             USHORT                              wCompQuality:1;
280             USHORT                              wCompWindowSize:1;
281         }                                       bm;
282     }                                           bmHint;
283     UCHAR                                       bFormatIndex;
284     UCHAR                                       bFrameIndex;
285     ULONG                                       dwFrameInterval;
286     USHORT                                      wKeyFrameRate;
287     USHORT                                      wPFrameRate;
288     USHORT                                      wCompQuality;
289     USHORT                                      wCompWindowSize;
290     USHORT                                      wDelay;
291     UCHAR                                       dwMaxVideoFrameSize[4]; /* Not alignend from now on.  */
292     UCHAR                                       dwMaxPayloadTransferSize[4];
293     UCHAR                                       dwClockFrequency[4];
294     union UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmFramingInfo_UNION {
295         UCHAR                                   value;
296         struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmFramingInfo_STRUCT {
297             UCHAR                               FID_required:1;
298             UCHAR                               EOF_may_present:1;
299             UCHAR                               EOS_may_present:1;
300         }                                       bm;
301     }                                           bmFramingInfo;
302     UCHAR                                       bPreferedVersion;
303     UCHAR                                       bMinVersion;
304     UCHAR                                       bMaxVersion;
305 
306     /* Start from offset 34, additional fields introduced in UVC 1.5.  */
307     UCHAR                                       bUsage;
308     UCHAR                                       bBitDepthLuma;
309     UCHAR                                       bmSettings;
310     UCHAR                                       bMaxNumberOfRefFramesPlus1;
311     union UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmRateControlModes_UNION {
312         USHORT                                  value;
313         struct UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_bmRateControlModes_STRUCT {
314             USHORT                              rate_ctrl_mode_0:4;
315             USHORT                              rate_ctrl_mode_1:4;
316             USHORT                              rate_ctrl_mode_2:4;
317             USHORT                              rate_ctrl_mode_3:4;
318         }                                       bm;
319     }                                           bmRateControlModes;
320     UCHAR                                       bmLayoutPerStream;
321 } UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL;
322 
323 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_OFFSET                      0
324 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_FRAME_INTERVAL              (1U<<0)
325 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_KEY_FRAME_RATE              (1U<<1)
326 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_KEY_P_FRAME_RATE            (1U<<2)
327 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_COMP_QUALITY                (1U<<3)
328 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_HINT_COMP_WINDOW_SIZE            (1U<<4)
329 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FORMAT_INDEX_OFFSET              2
330 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAME_INDEX_OFFSET               3
331 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAME_INTERVAL_OFFSET            4
332 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_KEY_FRAME_RATE_OFFSET            8
333 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_P_FRAME_RATE_OFFSET              10
334 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_COMP_QUALITY_OFFSET              12
335 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_COMP_WINDOW_SIZE_OFFSET          14
336 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_DELAY_OFFSET                     16
337 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_VIDEO_FRAME_SIZE_OFFSET      18
338 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET 22
339 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_CLOCK_FREQUENCY_OFFSET           26
340 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_OFFSET              30
341 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_FID_REQUIRED        (1U<<0)
342 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_EOF_MAY_PRESENT     (1U<<1)
343 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_FRAMING_INFO_EOS_MAY_PRESENT     (1U<<2)
344 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_PREFERED_VERSION_OFFSET          31
345 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MIN_VERSION_OFFSET               32
346 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_VERSION_OFFSET               33
347 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_USAGE_OFFSET                     34
348 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_BIT_DEPTH_LUMA_OFFSET            35
349 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_SETTINGS_OFFSET                  36
350 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_MAX_N_OF_FRAMES_PLUS1_OFFSET     37
351 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODES_OFFSET        38
352 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_NOT_APPLICABLE             0U
353 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_VBR_WITH_UNDERFLOW         1U
354 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_CBR                        2U
355 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_CONSTANT_QP                3U
356 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_GLOBAL_VBR_WITH_UNDERFLOW  4U
357 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_VBR                        5U
358 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_RATE_CONTROL_MODE_GLOBAL_VBR                 6U
359 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CONTROL_LAYOUT_PER_STREAM_OFFSET         40
360 
361 
362 /* Video Class Still Probe and Commit Controls structs and definitions.  */
363 typedef struct UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_STRUCT
364 {
365     UCHAR                                   bFormatIndex;
366     UCHAR                                   bFrameIndex;
367     UCHAR                                   bCompressionIndex;
368     UCHAR                                   dwMaxVideoFrameSize[4]; /* Not aligned from now.  */
369     UCHAR                                   dwMaxPayloadTransferSize[4];
370 } UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL;
371 #define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_FORMAT_INDEX_OFFSET                0
372 #define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_FRAME_INDEX_OFFSET                 1
373 #define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_COMPRESSION_INDEX_OFFSET           2
374 #define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_MAX_VIDEO_FRAME_SIZE_OFFSET        3
375 #define UX_DEVICE_CLASS_VIDEO_STILL_PROBE_COMMIT_CONTROL_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET   7
376 
377 
378 /* Video Class Status Packet structs and definitions.  */
379 
380 /* Offsets and possible values.  */
381 typedef struct UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_HEADER_STRUCT
382 {
383    UCHAR                                    bStatusType;
384    UCHAR                                    bOriginator;
385 } UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_HEADER;
386 typedef struct UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_STRUCT
387 {
388    UCHAR                                     bStatusType;
389    UCHAR                                     bOriginator;
390    UCHAR                                     bEvent;
391    UCHAR                                     bSelector;
392    UCHAR                                     bAttribute;
393    UCHAR                                     bValue[1];     /* varies on bAttribute.  */
394 } UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC;
395 typedef struct UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VS_STRUCT
396 {
397    UCHAR                                     bStatusType;
398    UCHAR                                     bOriginator;
399    UCHAR                                     bEvent;
400    UCHAR                                     bValue[1];     /* varies on bEvent.  */
401 } UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VS;
402 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_TYPE_OFFSET                                      0
403 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_TYPE_VC                                          1
404 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_TYPE_VS                                          2
405 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_ORIGINATOR_OFFSET                                1
406 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_EVENT_OFFSET                                     2
407 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_SELECTOR_OFFSET                               3
408 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_ATTRIBUTE_OFFSET                              4
409 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VC_VALUE_OFFSET                                  5
410 #define UX_DEVICE_CLASS_VIDEO_STATUS_PACKET_VS_VALUE_OFFSET                                  3
411 
412 
413 /* Define Video Class Payload Header structs and definitions.  */
414 typedef struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_STRUCT
415 {
416    UCHAR                                     bHeaderLength;
417    union UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_INFO_UNION {
418       UCHAR                                  value;
419       struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_INFO_STRUCT {
420          UCHAR                               bFID:1; /* Frame ID.  */
421          UCHAR                               bEOF:1; /* End of Frame.  */
422          UCHAR                               bPTS:1; /* Presentation Time.  */
423          UCHAR                               bSCR:1; /* Source Clock Reference.  */
424          UCHAR                               bRES:1; /* Reserved, Payload Specific.  */
425          UCHAR                               bSTI:1; /* Still Image.  */
426          UCHAR                               bERR:1; /* Error.  */
427          UCHAR                               bEOH:1; /* End of Header.  */
428       }                                      bm;
429    }                                         bmHeaderInfo;
430    UCHAR                                     dwPresentationTime[4];
431    union UX_DEVICE_CLASS_VIDEO_PAYLOAD_SCR_UNION {
432       UCHAR                                  byte_array[6];
433       struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_SCR_STRUCT {
434          UCHAR                               STC[4];  /* SourceTimeClock.  */
435          USHORT                              SCR;     /* 1KHz SOF token counter.  */
436       }                                      bm;
437    }                                         scrSourceClock;
438 } UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER;
439 #define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_LENGTH_OFFSET                                   0
440 #define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_INFO_OFFSET                                     1
441 #define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_PRESENTATION_TIME_OFFSET                        4
442 #define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_PTS_OFFSET                                      4
443 #define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_SCR_SOURCE_CLOCK_OFFSET                         6
444 #define UX_DEVICE_CLASS_VIDEO_PAYLOAD_HEADER_SCR_OFFSET                                      6
445 
446 
447 /* Define Video Class specific request codes.  */
448 #define UX_DEVICE_CLASS_VIDEO_REQUEST_CODE_UNDEFINED                                         0x00
449 #define UX_DEVICE_CLASS_VIDEO_RC_UNDEFINED                                                   0x00
450 #define UX_DEVICE_CLASS_VIDEO_SET_CUR                                                        0x01
451 #define UX_DEVICE_CLASS_VIDEO_GET_CUR                                                        0x81
452 #define UX_DEVICE_CLASS_VIDEO_GET_MIN                                                        0x82
453 #define UX_DEVICE_CLASS_VIDEO_GET_MAX                                                        0x83
454 #define UX_DEVICE_CLASS_VIDEO_GET_RES                                                        0x84
455 #define UX_DEVICE_CLASS_VIDEO_GET_INFO                                                       0x86
456 #define UX_DEVICE_CLASS_VIDEO_GET_DEF                                                        0x87
457 #define UX_DEVICE_CLASS_VIDEO_GET_CUR_ALL                                                    0x91
458 #define UX_DEVICE_CLASS_VIDEO_GET_MIN_ALL                                                    0x92
459 #define UX_DEVICE_CLASS_VIDEO_GET_MAX_ALL                                                    0x93
460 #define UX_DEVICE_CLASS_VIDEO_GET_RES_ALL                                                    0x94
461 #define UX_DEVICE_CLASS_VIDEO_GET_GET_DEF_ALL                                                0x97
462 
463 
464 /* Define Video Class Device Power Modes.  */
465 #define UX_DEVICE_CLASS_VIDEO_POWER_MODE_MASK                                                0x0Fu
466 #define UX_DEVICE_CLASS_VIDEO_POWER_MODE_FULL                                                0x00u
467 #define UX_DEVICE_CLASS_VIDEO_POWER_MODE_DEVICE_DEPENDENT                                    0x01u
468 #define UX_DEVICE_CLASS_VIDEO_POWER_DEPENDENT_MODE_SUPPORTED                                 0x10u
469 #define UX_DEVICE_CLASS_VIDEO_POWER_USES_USB                                                 0x20u
470 #define UX_DEVICE_CLASS_VIDEO_POWER_USES_BATTERY                                             0x40u
471 #define UX_DEVICE_CLASS_VIDEO_POWER_USES_AC                                                  0x80u
472 
473 
474 /* Define Video Class Request Error Codes.  */
475 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_NO_ERROR                                    0x00
476 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_NOT_READY                                   0x01
477 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_WRONG_STATE                                 0x02
478 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_POWER                                       0x03
479 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_OUT_OF_RANGE                                0x04
480 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_INPUT                               0x05
481 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_CONTROL                             0x06
482 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_REQUEST                             0x07
483 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_INVALID_VALUE_WITHIN_RANGE                  0x08
484 #define UX_DEVICE_CLASS_VIDEO_REQUEST_ERROR_CODE_UNKNOWN                                     0xFF
485 
486 
487 /* Define Video Class Probe and Commit Controls */
488 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_LENGTH_1_1                                        34
489 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_LENGTH_1_5                                        48
490 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_HINT_OFFSET                                       0
491 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FORMAT_INDEX_OFFSET                               2
492 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FRAME_INDEX_OFFSET                                3
493 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FRAME_INTERVAL_OFFSET                             4
494 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_KEY_FRAME_RATE_OFFSET                             8
495 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_PFRAME_RAE_OFFSET                                 10
496 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_COMP_QUALITY_OFFSET                               12
497 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_COMP_WINDOW_SIZE_OFFSET                           14
498 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_DELAY_OFFSET                                      16
499 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_VIDEO_FRAME_SIZE_OFFSET                       18
500 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_PAYLOAD_TRANSFER_SIZE_OFFSET                  22
501 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_CLOCK_FREQUENCY_OFFSET                            26
502 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_FRAMING_INFO_OFFSET                               30
503 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_PREFERED_VERSION_OFFSET                           31
504 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MIN_VERSION_OFFSET                                32
505 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_VERSION_OFFSET                                33
506 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_USAGE_OFFSET                                      34
507 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_BIT_DEPTH_LUMA_OFFSET                             35
508 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_SETTINGS_OFFSET                                   36
509 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_MAX_NUMBER_OF_REF_FRAMES_PLUS1_OFFSET             37
510 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_RATE_CONTROL_MODES_OFFSET                         38
511 #define UX_DEVICE_CLASS_VIDEO_PROBE_COMMIT_LAYOUT_PER_STREAM_OFFSET                          40
512 
513 
514 /* Define Video Class Stream Error Codes.  */
515 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_NO_ERROR                                     0
516 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_PROTECTED_CONTENT                            1
517 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_INPUT_BUFFER_UNDERRUN                        2
518 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_DATA_DISCONTINUITY                           3
519 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_OUTPUT_BUFFER_UNDERRUN                       4
520 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_OUTPUT_BUFFER_OVERRUN                        5
521 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_FORMAT_CHANGE                                6
522 #define UX_DEVICE_CLASS_VIDEO_STREAM_ERROR_CODE_STILL_IMAGE_CAPTURE_ERROR                    7
523 
524 
525 /* Define Video Class Task states.  */
526 #define UX_DEVICE_CLASS_VIDEO_STREAM_RW_STOP            (UX_STATE_RESET)
527 #define UX_DEVICE_CLASS_VIDEO_STREAM_RW_START           (UX_STATE_STEP + 1)
528 #define UX_DEVICE_CLASS_VIDEO_STREAM_RW_WAIT            (UX_STATE_STEP + 2)
529 
530 
531 /* Define Video Class callback structure.  */
532 
533 struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT;
534 struct UX_DEVICE_CLASS_VIDEO_STRUCT;
535 
536 typedef struct UX_DEVICE_CLASS_VIDEO_CALLBACKS_STRUCT
537 {
538 
539     VOID        (*ux_slave_class_video_instance_activate)(VOID *);
540     VOID        (*ux_slave_class_video_instance_deactivate)(VOID *);
541     UINT        (*ux_device_class_video_request)(struct UX_DEVICE_CLASS_VIDEO_STRUCT *, UX_SLAVE_TRANSFER *);
542     VOID         *ux_device_class_video_arg;
543 } UX_DEVICE_CLASS_VIDEO_CALLBACKS;
544 
545 typedef struct UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS_STRUCT
546 {
547     VOID        (*ux_device_class_video_stream_change)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT *, ULONG);
548     UINT        (*ux_device_class_video_stream_request)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT *, UX_SLAVE_TRANSFER *);
549     VOID        (*ux_device_class_video_stream_payload_done)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT *, ULONG);
550 } UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS;
551 
552 
553 /* Define Video Class Calling Parameter structure */
554 
555 typedef struct UX_DEVICE_CLASS_VIDEO_PAYLOAD_STRUCT
556 {
557 
558     ULONG                                   ux_device_class_video_payload_length;
559     UCHAR                                   ux_device_class_video_payload_data[4]; /* Actually size of length.  */
560 } UX_DEVICE_CLASS_VIDEO_PAYLOAD;
561 
562 typedef struct UX_DEVICE_CLASS_VIDEO_STREAM_PARAMETER_STRUCT
563 {
564 #if defined(UX_DEVICE_STANDALONE)
565     UINT                                   (*ux_device_class_video_stream_parameter_task_function)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT*);
566 #else
567     ULONG                                    ux_device_class_video_stream_parameter_thread_stack_size;
568     VOID                                   (*ux_device_class_video_stream_parameter_thread_entry)(ULONG id);
569 #endif
570     UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS   ux_device_class_video_stream_parameter_callbacks;
571 
572     ULONG                                    ux_device_class_video_stream_parameter_max_payload_buffer_size;
573     ULONG                                    ux_device_class_video_stream_parameter_max_payload_buffer_nb;
574 } UX_DEVICE_CLASS_VIDEO_STREAM_PARAMETER;
575 
576 typedef struct UX_DEVICE_CLASS_VIDEO_PARAMETER_STRUCT
577 {
578     ULONG                                    ux_device_class_video_parameter_master_interface;
579     UX_DEVICE_CLASS_VIDEO_CALLBACKS          ux_device_class_video_parameter_callbacks;
580 
581     ULONG                                    ux_device_class_video_parameter_streams_nb;
582     UX_DEVICE_CLASS_VIDEO_STREAM_PARAMETER  *ux_device_class_video_parameter_streams;
583 } UX_DEVICE_CLASS_VIDEO_PARAMETER;
584 
585 typedef struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT
586 {
587 
588     struct UX_DEVICE_CLASS_VIDEO_STRUCT     *ux_device_class_video_stream_video;
589     UX_SLAVE_INTERFACE                      *ux_device_class_video_stream_interface;
590     UX_SLAVE_ENDPOINT                       *ux_device_class_video_stream_endpoint;
591 
592     ULONG                                    ux_device_class_video_stream_error;
593 
594     UX_DEVICE_CLASS_VIDEO_STREAM_CALLBACKS   ux_device_class_video_stream_callbacks;
595 
596 #if !defined(UX_DEVICE_STANDALONE)
597     UCHAR                                   *ux_device_class_video_stream_thread_stack;
598     UX_THREAD                                ux_device_class_video_stream_thread;
599 #else
600     UINT                                   (*ux_device_class_video_stream_task_function)(struct UX_DEVICE_CLASS_VIDEO_STREAM_STRUCT*);
601     UINT                                    ux_device_class_video_stream_task_state;
602     UINT                                    ux_device_class_video_stream_task_status;
603 #endif
604 
605     ULONG                                   ux_device_class_video_stream_buffer_error_count;
606     UCHAR                                   *ux_device_class_video_stream_buffer;
607     ULONG                                    ux_device_class_video_stream_buffer_size;
608     ULONG                                    ux_device_class_video_stream_payload_buffer_size;
609 
610     UX_DEVICE_CLASS_VIDEO_PAYLOAD           *ux_device_class_video_stream_transfer_pos;
611     UX_DEVICE_CLASS_VIDEO_PAYLOAD           *ux_device_class_video_stream_access_pos;
612 } UX_DEVICE_CLASS_VIDEO_STREAM;
613 #define _ux_device_class_video_stream_error_set(s,e) do {                       \
614     (s)->ux_device_class_video_stream_error = (e);                              \
615 } while(0)
616 
617 typedef struct UX_DEVICE_CLASS_VIDEO_STRUCT
618 {
619 
620     UX_SLAVE_CLASS                          *ux_device_class_video_class;
621     UX_SLAVE_DEVICE                         *ux_device_class_video_device;
622     UX_SLAVE_INTERFACE                      *ux_device_class_video_interface;
623 
624     ULONG                                    ux_device_class_video_error;
625 
626     UX_DEVICE_CLASS_VIDEO_CALLBACKS          ux_device_class_video_callbacks;
627 
628     ULONG                                    ux_device_class_video_streams_nb;
629     UX_DEVICE_CLASS_VIDEO_STREAM            *ux_device_class_video_streams;
630 
631 } UX_DEVICE_CLASS_VIDEO;
632 #define _ux_device_class_video_request_error_set(v,e) do {                      \
633     (v)->ux_device_class_video_error = (e);                                     \
634 } while(0)
635 
636 
637 /* Define Video Class function prototypes.  */
638 
639 UINT    _ux_device_class_video_initialize(UX_SLAVE_CLASS_COMMAND *command);
640 UINT    _ux_device_class_video_uninitialize(UX_SLAVE_CLASS_COMMAND *command);
641 UINT    _ux_device_class_video_activate(UX_SLAVE_CLASS_COMMAND *command);
642 UINT    _ux_device_class_video_change(UX_SLAVE_CLASS_COMMAND *command);
643 UINT    _ux_device_class_video_deactivate(UX_SLAVE_CLASS_COMMAND *command);
644 UINT    _ux_device_class_video_control_request(UX_SLAVE_CLASS_COMMAND *command);
645 
646 UINT    _ux_device_class_video_entry(UX_SLAVE_CLASS_COMMAND *command);
647 
648 UINT    _ux_device_class_video_ioctl(UX_DEVICE_CLASS_VIDEO *video, ULONG ioctl_function,
649                                      VOID *parameter);
650 
651 UINT    _ux_device_class_video_stream_get(UX_DEVICE_CLASS_VIDEO *video, ULONG stream_index, UX_DEVICE_CLASS_VIDEO_STREAM **stream);
652 
653 VOID    _ux_device_class_video_write_thread_entry(ULONG video_stream);
654 VOID    _ux_device_class_video_read_thread_entry(ULONG video_stream);
655 
656 ULONG   _ux_device_class_video_max_payload_length(UX_DEVICE_CLASS_VIDEO_STREAM *video);
657 
658 UINT    _ux_device_class_video_reception_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);
659 
660 UINT    _ux_device_class_video_read_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **payload_data, ULONG *payload_length);
661 UINT    _ux_device_class_video_read_payload_free(UX_DEVICE_CLASS_VIDEO_STREAM *video);
662 
663 UINT    _ux_device_class_video_transmission_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);
664 
665 UINT    _ux_device_class_video_write_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **buffer, ULONG *max_length);
666 UINT    _ux_device_class_video_write_payload_commit(UX_DEVICE_CLASS_VIDEO_STREAM *video, ULONG length);
667 
668 UINT    _ux_device_class_video_tasks_run(VOID *instance);
669 UINT    _ux_device_class_video_read_task_function(UX_DEVICE_CLASS_VIDEO_STREAM *stream);
670 UINT    _ux_device_class_video_write_task_function(UX_DEVICE_CLASS_VIDEO_STREAM *stream);
671 
672 UINT    _uxe_device_class_video_initialize(UX_SLAVE_CLASS_COMMAND *command);
673 ULONG   _uxe_device_class_video_max_payload_length(UX_DEVICE_CLASS_VIDEO_STREAM *video);
674 UINT    _uxe_device_class_video_reception_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);
675 UINT    _uxe_device_class_video_read_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **payload_data, ULONG *payload_length);
676 UINT    _uxe_device_class_video_read_payload_free(UX_DEVICE_CLASS_VIDEO_STREAM *video);
677 UINT    _uxe_device_class_video_transmission_start(UX_DEVICE_CLASS_VIDEO_STREAM *video);
678 UINT    _uxe_device_class_video_write_payload_get(UX_DEVICE_CLASS_VIDEO_STREAM *video, UCHAR **buffer, ULONG *max_length);
679 UINT    _uxe_device_class_video_write_payload_commit(UX_DEVICE_CLASS_VIDEO_STREAM *video, ULONG length);
680 UINT    _uxe_device_class_video_ioctl(UX_DEVICE_CLASS_VIDEO *video, ULONG ioctl_function, VOID *parameter);
681 
682 /* Define Video Class API prototypes.  */
683 
684 #if defined(UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING)
685 
686 #define ux_device_class_video_entry                   _ux_device_class_video_entry
687 
688 #define ux_device_class_video_read_thread_entry       _ux_device_class_video_read_thread_entry
689 #define ux_device_class_video_write_thread_entry      _ux_device_class_video_write_thread_entry
690 
691 #define ux_device_class_video_request_error_set       _ux_device_class_video_request_error_set
692 #define ux_device_class_video_stream_error_set        _ux_device_class_video_stream_error_set
693 
694 #define ux_device_class_video_stream_get              _ux_device_class_video_stream_get
695 
696 #define ux_device_class_video_max_payload_length      _uxe_device_class_video_max_payload_length
697 
698 #define ux_device_class_video_reception_start         _uxe_device_class_video_reception_start
699 
700 #define ux_device_class_video_read_payload_get        _uxe_device_class_video_read_payload_get
701 #define ux_device_class_video_read_payload_free       _uxe_device_class_video_read_payload_free
702 
703 #define ux_device_class_video_transmission_start      _uxe_device_class_video_transmission_start
704 
705 #define ux_device_class_video_write_payload_get       _uxe_device_class_video_write_payload_get
706 #define ux_device_class_video_write_payload_commit    _uxe_device_class_video_write_payload_commit
707 
708 #define ux_device_class_video_ioctl                   _uxe_device_class_video_ioctl
709 
710 #define ux_device_class_video_read_task_function      _ux_device_class_video_read_task_function
711 #define ux_device_class_video_write_task_function     _ux_device_class_video_write_task_function
712 
713 #else
714 
715 #define ux_device_class_video_entry                   _ux_device_class_video_entry
716 
717 #define ux_device_class_video_read_thread_entry       _ux_device_class_video_read_thread_entry
718 #define ux_device_class_video_write_thread_entry      _ux_device_class_video_write_thread_entry
719 
720 #define ux_device_class_video_request_error_set       _ux_device_class_video_request_error_set
721 #define ux_device_class_video_stream_error_set        _ux_device_class_video_stream_error_set
722 
723 #define ux_device_class_video_stream_get              _ux_device_class_video_stream_get
724 
725 #define ux_device_class_video_max_payload_length      _ux_device_class_video_max_payload_length
726 
727 #define ux_device_class_video_reception_start         _ux_device_class_video_reception_start
728 
729 #define ux_device_class_video_read_payload_get        _ux_device_class_video_read_payload_get
730 #define ux_device_class_video_read_payload_free       _ux_device_class_video_read_payload_free
731 
732 #define ux_device_class_video_transmission_start      _ux_device_class_video_transmission_start
733 
734 #define ux_device_class_video_write_payload_get       _ux_device_class_video_write_payload_get
735 #define ux_device_class_video_write_payload_commit    _ux_device_class_video_write_payload_commit
736 
737 #define ux_device_class_video_ioctl                   _ux_device_class_video_ioctl
738 
739 #define ux_device_class_video_read_task_function      _ux_device_class_video_read_task_function
740 #define ux_device_class_video_write_task_function     _ux_device_class_video_write_task_function
741 
742 #endif  /* UX_DEVICE_CLASS_VIDEO_ENABLE_ERROR_CHECKING */
743 
744 /* Determine if a C++ compiler is being used.  If so, complete the standard
745    C conditional started above.  */
746 #ifdef __cplusplus
747 }
748 #endif
749 
750 #endif
751