DxDecoderInterface.h 7.06 KB
#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