#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