mirror of
https://github.com/azure-rtos/usbx.git
synced 2025-01-28 07:03:07 +08:00
751 lines
47 KiB
C
751 lines
47 KiB
C
/***************************************************************************
|
|
* Copyright (c) 2024 Microsoft Corporation
|
|
*
|
|
* 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. */
|
|
/* */
|
|
/* RELEASE HISTORY */
|
|
/* */
|
|
/* DATE NAME DESCRIPTION */
|
|
/* */
|
|
/* 04-25-2022 Chaoqiong Xiao Initial Version 6.1.11 */
|
|
/* 10-31-2022 Chaoqiong Xiao Modified comment(s), */
|
|
/* added standalone support, */
|
|
/* resulting in version 6.2.0 */
|
|
/* 10-31-2023 Yajun xia, CQ Xiao Modified comment(s), */
|
|
/* added a new mode to manage */
|
|
/* endpoint buffer in classes */
|
|
/* with zero copy enabled, */
|
|
/* added error checks support, */
|
|
/* resulting in version 6.3.0 */
|
|
/* */
|
|
/**************************************************************************/
|
|
|
|
#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
|