#include "AbstractDecoder.h" #include #include #include #include using namespace std; struct MgrDecConfig { DECODER_TYPE dec_type; // 解码器类型 FFDecConfig cfg; // 解码器配置 string name{""}; // 解码器名称 }; struct FFImgInfo{ int width; int height; unsigned char * pData; }; /** * 解码器管理类,单例类 **/ class FFNvDecoderManager { public: /************************************************** * 接口:getInstance * 功能:获取解码器管理者实例 * 参数:无 * 返回:成功返回 解码器管理者实例, 失败返回 nullptr * 备注:调用其他接口前,需要先调用该接口获取管理者实例 **************************************************/ static FFNvDecoderManager* getInstance(){ static FFNvDecoderManager* singleton = nullptr; if (singleton == nullptr){ singleton = new FFNvDecoderManager(); } return singleton; } ~FFNvDecoderManager() { closeAllDecoder(); } /************************************************** * 接口:createDecoder * 功能:根据配置信息创建解码器 * 参数:MgrDecConfig& config 解码器配置信息 * 返回:成功返回解码器, 失败返回 nullptr * 备注: **************************************************/ AbstractDecoder* createDecoder(MgrDecConfig config); /************************************************** * 接口:setPostDecArg * 功能:设置解码数据回调接口的用户自定义参数 * 参数:string name 解码器名称 * const void * userPtr 用户自定义的要传到解码数据回调接口的数据 * 返回:设置成功返回true,失败返回false * 备注: **************************************************/ bool setPostDecArg(const string name, const void * userPtr); /************************************************** * 接口:setFinishedDecArg * 功能:设置解码结束回调接口的用户自定义参数 * 参数:string name 解码器名称 * const void * userPtr 用户自定义的要传到解码数据回调接口的数据 * 返回:设置成功返回true,失败返回false * 备注: **************************************************/ bool setFinishedDecArg(const string name, const void * userPtr); /************************************************** * 接口:getDecoderByName * 功能:根据解码器名称返回解码器对象指针 * 参数:const string name 解码器名称 * 返回:成功返回对应的解码器对象的指针,失败返回nullptr * 备注: **************************************************/ AbstractDecoder* getDecoderByName(const string name); /************************************************** * 接口:startDecode * 功能:启动解码 * 参数:FFNvDecoder* 解码器指针 * 返回:void * 备注: **************************************************/ void startDecode(AbstractDecoder*); /************************************************** * 接口:startAllDecode * 功能:启动全部解码 * 参数:void * 返回:void * 备注: **************************************************/ void startAllDecode(); /************************************************** * 接口:startDecodeByName * 功能:启动名称对应的解码器 * 参数:string name 解码器名称 * 返回:成功返回true,失败返回false * 备注: **************************************************/ bool startDecodeByName(const string name); /************************************************** * 接口:closeDecoderByName * 功能:关闭解码器名称对应的解码 * 参数:const string name 解码器名称 * 返回:成功返回true,失败返回false * 备注: **************************************************/ bool closeDecoderByName(const string name); /************************************************** * 接口:closeAllDecoder * 功能:关闭全部解码器 * 参数:void * 返回:void * 备注: **************************************************/ void closeAllDecoder(); /************************************************** * 接口:closeAllDecoderByGpuid * 功能:关闭某张显卡撒花姑娘的全部解码器 * 参数:const string gpuid gpu的id * 返回:void * 备注: **************************************************/ void closeAllDecoderByGpuid(const string gpuid); /************************************************** * 接口:pauseDecoder * 功能:暂停指定名称的解码器 * 参数:const string name 解码器名称 * 返回:成功返回true,失败返回false * 备注: **************************************************/ bool pauseDecoder(const string name); /************************************************** * 接口:pauseDecoder * 功能:恢复指定名称的解码器 * 参数:const string name 解码器名称 * 返回:成功返回true,失败返回false * 备注: **************************************************/ bool resumeDecoder(const string name); /************************************************** * 接口:isSurport * 功能:是否支持指定配置的解码 * 参数:FFDecConfig& cfg 解码器配置 * 返回:支持返回true,不支持返回false * 备注: **************************************************/ bool isSurport(MgrDecConfig& config); /************************************************** * 接口:isRunning * 功能:根据解码器名称判断解码器是否正在运行 * 参数:const string name 解码器名称 * 返回:正在运行返回true,否则返回false * 备注: **************************************************/ bool isRunning(const string name); /************************************************** * 接口:isFinished * 功能:根据解码器名称判断解码器是否已经结束 * 参数:const string name 解码器名称 * 返回:正在运行返回true,否则返回false * 备注: **************************************************/ bool isFinished(const string name); /************************************************** * 接口:isPausing * 功能:根据解码器名称判断解码器是否暂停 * 参数:const string name 解码器名称 * 返回:正在运行返回true,否则返回false * 备注: **************************************************/ bool isPausing(const string name); /************************************************** * 接口:count * 功能:获取正在运行的解码器数量 * 参数:void * 返回:正在运行的解码器数量 * 备注: **************************************************/ int count(); /************************************************** * 接口:setDecKeyframe * 功能:设置是否只解码关键帧。默认全解 * 参数:const string name 解码器名称 * bool bKeyframe 是否只解码关键帧。true,只解码关键帧;false,普通的全解码 * 返回:bool 成功返回true,失败返回false * 备注: **************************************************/ bool setDecKeyframe(const string name, bool bKeyframe); /************************************************** * 接口:getResolution * 功能:获取视频分辨率 * 参数:const string name 解码器名称 * int &width 从 width 返回视频宽度 * int &height 从 height 返回视频高度 * 返回:bool 成功获取返回true,失败返回false * 备注: **************************************************/ bool getResolution(const string name, int &width, int &height); /************************************************** * 接口:getAllDecodeName * 功能:获取全部解码器名称 * 参数:void * 返回:vector 返回全部解码器名称 * 备注: **************************************************/ vector getAllDecodeName(); /************************************************** * 接口:getCachedQueueLength * 功能:获取解码缓冲队列当前长度 * 参数:const string name 解码器名称 * 返回:int 解码缓冲队列当前长度 * 备注: **************************************************/ int getCachedQueueLength(const string name); /************************************************** * 接口:snapshot * 功能:获取视频快照 * 参数:const string& uri 视频地址 * 返回:FFImgInfo* 快照信息 * 备注: **************************************************/ FFImgInfo* snapshot(const string& uri); /************************************************** * 接口:releaseFFImgInfo * 功能:释放视频快照信息 * 参数:FFImgInfo* info 视频快照信息 * 返回:void * 备注: **************************************************/ void releaseFFImgInfo(FFImgInfo* info); private: FFNvDecoderManager(){} void closeAllFinishedDecoder(); private: map decoderMap; mutex m_mutex; };