DxDecoderInterface.h
7.06 KB
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
#ifndef __DxDecoder__DxDecoderInterface__
#define __DxDecoder__DxDecoderInterface__
#ifdef _MSC_VER
#define DX_WINDOWS
#else
#define DX_LINUX
#endif
#ifdef DX_LINUX
#undef DX_WINDOWS
#endif
#ifdef DX_LINUX
#include "DxStd.h"
#define DXDECODE_API
#endif
#ifdef DX_WINDOWS
#ifdef DXDECODER_EXPORTS
#define DXDECODE_API __declspec(dllexport)
#else
#define DXDECODE_API __declspec(dllimport)
#endif
#endif
#ifndef DX_LOG_LEVEL
#define DX_LOG_LEVEL
typedef enum DxLogLevel
{
DX_LOG_LEVEL_UNKNOW = 0, // 未知日志等级
DX_LOG_LEVEL_INFO, // 普通日志信息 (如:无关紧要的信息输出)
DX_LOG_LEVEL_IMPORTANT, // 重要的日志通知,模块一切正常(如:重要流程通知)
DX_LOG_LEVEL_WARNING, // 警告日志,即将可能发生致命错误(如:资源不足)
DX_LOG_LEVEL_FATAL, // 致命错误,模块将停止工作(如:网络断开)
DX_LOG_LEVEL_CLEANUP // 此模块已退出所有线程、流程,不再执行任何代码,
// 通常通过该日志等级回调,实现在回调内释放模块自身
// 本日志等级在模块生命周期内只会发生一次调用
}DxLogLevel;
#define DX_USE_SHARE_CONTEXT
#define DX_USE_DECODER_CUDA
#define DX_USE_DECODER_CPU
#define DX_DXDECODER_OUTPUT_NV12
/**************************************************
* 接口:DxLogHandler
* 功能:日志回调接口
* 参数:const dx_void * userPtr 用户自定义数据
* DxLogLevel level 日志等级
* const dx_8 * log 日志内容
* dx_u32 logLen 日志信息长度,如果log指向字符串,
* 可忽略本参数
* 返回:已处理返回 0,未处理返回 -1。
* 备注:本接口内不可进行阻塞/耗时操作。
**************************************************/
typedef int(*DxLogHandler)(
const void * userPtr,
DxLogLevel level,
const char * log,
unsigned int logLen
);
#endif
typedef struct DxVideoConfig // 视频相关配置信息,根据实际应用,填充部分或全部数据
{
float minQP; // 编码时最小量化步长(仅在打开编码器时填充)
float maxQP; // 编码时最大量化步长(仅在打开编码器时填充)
int width; // 图像宽度值
int height; // 图像高度值
int gopSize; // 视频流GOP大小(仅在打开编码器时填充)
//DxCodecType codec; // 视频编解码器类型
}DxVideoConfig;
/**************************************************
* 接口:DXDECODER_CALLBACK
* 功能:解码数据回调接口
* 参数:const dx_void * userPtr 用户自定义数据
* void * buf RGB数据显存指针,当 0 == size时,
* buf指向 DxVideoConfig 结构体
* unsigned int size 当前帧大小
* unsigned long long timestamp 当前帧时间戳
* 返回:无
* 备注:当解码库数据源为实时流时(RTSP/GB28181),本接
* 口内不可进行阻塞/耗时操作。当解码库数据源为
* 非实时流时(本地/网络文件),本接口可以进行
* 阻塞/耗时操作
**************************************************/
typedef void(*DXDECODER_CALLBACK)(const void * userPtr, void * buf, unsigned int size, unsigned long long timestamp);
typedef enum DxDecoderType
{
DX_DECODER_TYPE_UNKNOW = 0,
DX_DECODER_TYPE_CUDA,
DX_DECODER_TYPE_CPU
}DxDecoderType;
typedef struct DxConfig
{
int devId; // 设备(GPU)ID
int decMode; // 解码模式
int colorFmt; // 颜色空间
bool forceTcp; // 对于实时流,是否强制为TCP取流
DxDecoderType type;
}DxConfig;
typedef struct DxDecoderConfig
{
DxConfig cfg;
DxLogHandler logcbk; // 日志回调接口
const void * userPtr; // 用户数据
DXDECODER_CALLBACK escbk; // 解码后帧数据回调接口
}DxDecoderConfig;
class DxDecoderInterface
//class DXDECODE_API DxDecoderInterface
{
public:
virtual ~DxDecoderInterface() {};
/**************************************************
* 接口:InitDecoderModule
* 功能:初始化解码模块
* 参数:无
* 返回:成功返回 0, 失败返回错误码
* 备注:必须优先其它接口调用,且只须调用一次,本接口
* 为非线程安全接口
**************************************************/
static int InitDecoderModule();
/**************************************************
* 接口:UninitDecoderModule
* 功能:反初始化解码模块
* 参数:无
* 返回:无
* 备注:必须在释放所有解码实例之后调用,本接口为非线程
* 安全接口
**************************************************/
static void UninitDecoderModule();
/**************************************************
* 接口:AllocDecoder
* 功能:分配一个解码器实例
* 参数:DxDecoderConfig * cfg 解码器初始化参数,参
* 见该结构体定义
* 返回:成功返回新解码器实例,失败返回 NULL
* 备注:当解码库数据源为实时流时(RTSP/GB28181),本接
* 口内不可进行阻塞/耗时操作。当解码库数据源为
* 非实时流时(本地/网络文件),本接口可以进行
* 阻塞/耗时操作
**************************************************/
static DxDecoderInterface * AllocDecoder(const DxDecoderConfig * cfg);
/**************************************************
* 接口:FreeDecoder
* 功能:释放一个解码器实例
* 参数:DxDecoderInterface 待释放解码器实例
* 返回:无
* 备注:调用本接口之前可无须调用CloseDecoder
**************************************************/
static void FreeDecoder(DxDecoderInterface * dec);
/**************************************************
* 接口:IsSupport
* 功能:判断输入源该解码库是否支持
* 参数:const char * uri 待判断的资源路径
* 返回:解码库支持该文件则返回 0, 否则返回非 0值
* 备注:调用本接口之前可无须调用CloseDecoder
**************************************************/
static int IsSupport(const char * uri);
/**************************************************
* 接口:OpenDecoder
* 功能:打开一个解码器,开始解码
* 参数:const char * uri 解码器数据源,以rtsp://为前
* 缀指定为RTSP流,以gb28181://为前缀指定为国
* 标流,其余则为文件流。
* 返回:成功返回 0, 失败返回 < 0
* 备注:RTSP流或国标流(历史流/实时流)都属于实时流
* 本接口属于异步接口
**************************************************/
virtual int OpenDecoder(const char * uri) = 0;
/**************************************************
* 接口:CloseDecoder
* 功能:关闭一个解码器,停止解码
* 参数:无
* 返回:成功返回 0, 失败返回 < 0
* 备注:本接口内部会阻塞直到解码器正常关闭后退出
**************************************************/
virtual int CloseDecoder() = 0;
};
#endif