DxDecoderInterface.h
5.35 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
#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,
DX_DECODER_TYPE_SFXLAB
}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() {};
/**************************************************
* 接口:OpenDecoder
* 功能:打开一个解码器,开始解码
* 参数:const char * uri 解码器数据源,以rtsp://为前
* 缀指定为RTSP流,以gb28181://为前缀指定为国
* 标流,其余则为文件流。
* 返回:成功返回 0, 失败返回 < 0
* 备注:RTSP流或国标流(历史流/实时流)都属于实时流
* 本接口属于异步接口
**************************************************/
virtual int OpenDecoder( const char * uri ) = 0;
/**************************************************
* 接口:CloseDecoder
* 功能:关闭一个解码器,停止解码
* 参数:无
* 返回:成功返回 0, 失败返回 < 0
* 备注:本接口内部会阻塞直到解码器正常关闭后退出
**************************************************/
virtual int CloseDecoder() = 0;
virtual int GetFrameCount() = 0;
};
#endif