#ifndef _ABSTRACT_DECODER_H_ #define _ABSTRACT_DECODER_H_ #include extern "C" { #include #include #include #include #include #include #include #include } #include #include using namespace std; /************************************************** * 接口:DXDECODER_CALLBACK * 功能:解码数据回调接口 * 参数:const dx_void * userPtr 用户自定义数据 * AVFrame * gpuFrame 解码结果帧数据,在设置的对应的gpu上,要十分注意这一点,尤其是多线程情况 * 返回:无 * 备注:当解码库数据源为实时流时(RTSP/GB28181),本接 * 口内不可进行阻塞/耗时操作。当解码库数据源为 * 非实时流时(本地/网络文件),本接口可以进行 * 阻塞/耗时操作 **************************************************/ typedef void(*POST_DECODE_CALLBACK)(const void * userPtr, AVFrame * gpuFrame); typedef void(*DECODE_FINISHED_CALLBACK)(const void* userPtr); typedef bool(*DECODE_REQUEST_STREAM_CALLBACK)(const char* deviceId); struct FFDecConfig{ string uri; // 视频地址 POST_DECODE_CALLBACK post_decoded_cbk; // 解码数据回调接口 DECODE_FINISHED_CALLBACK decode_finished_cbk; // 解码线程结束后的回调接口 string gpuid; // gpu id bool force_tcp{true}; // 是否指定使用tcp连接 int skip_frame{1}; // 跳帧数 int port; // gb28181接收数据的端口号 DECODE_REQUEST_STREAM_CALLBACK request_stream_cbk; // gb28181请求流 }; enum DECODER_TYPE{ DECODER_TYPE_GB28181, DECODER_TYPE_FFMPEG }; struct FFImgInfo{ string dec_name; int width; int height; unsigned char * pData; long timestamp; long index; }; class AbstractDecoder { public: virtual ~AbstractDecoder(){}; virtual bool init(FFDecConfig& cfg) = 0; virtual void close() = 0; virtual bool start() = 0; virtual void pause() = 0; virtual void resume() = 0; virtual void setDecKeyframe(bool bKeyframe) = 0; virtual bool isRunning() = 0; virtual bool isFinished() = 0; virtual bool isPausing() = 0; virtual bool getResolution( int &width, int &height ) = 0; virtual bool isSurport(FFDecConfig& cfg) = 0; virtual int getCachedQueueLength() = 0; virtual float fps() = 0; virtual DECODER_TYPE getDecoderType() = 0; void setName(string nm){ m_dec_name = nm; } string getName(){ return m_dec_name; } FFImgInfo* snapshot(); bool isSnapTime(); void updateLastSnapTime(); void setSnapTimeInterval(long interval); public: const void * m_postDecArg; POST_DECODE_CALLBACK post_decoded_cbk; const void * m_finishedDecArg; DECODE_FINISHED_CALLBACK decode_finished_cbk; public: string m_dec_name; bool m_dec_keyframe; FFDecConfig m_cfg; queue mFrameQueue; mutex m_queue_mutex; mutex m_snapshot_mutex; long m_snap_time_interval{-1}; long m_last_snap_time; long m_index{0}; }; #endif // _ABSTRACT_DECODER_H_