DxDecoderInterface.h 5.35 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,
	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