FFNvDecoderManager.h 8.72 KB
#include "AbstractDecoder.h"
#include<iostream>
#include<vector>
#include<map>

#include <mutex>

using namespace std;

struct MgrDecConfig
{
	DECODER_TYPE dec_type;	// 解码器类型
    FFDecConfig cfg;    // 解码器配置
    string name{""};    // 解码器名称
	long snap_time_interval; // 定时抓拍时间间隔
};

// #define USE_NVDEC
// #define USE_DVPP
/**
 * 解码器管理类,单例类
 * 谨防死锁
 **/
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
	* 备注:
	**************************************************/
    bool 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<string> 返回全部解码器名称
	* 备注:
	**************************************************/
	vector<string> getAllDecodeName();

	/**************************************************
	* 接口:getCachedQueueLength
	* 功能:获取解码缓冲队列当前长度
	* 参数:const string name 解码器名称
	* 返回:int 解码缓冲队列当前长度
	* 备注:
	**************************************************/
	int getCachedQueueLength(const string name);

	/**************************************************
	* 接口:releaseFFImgInfo
	* 功能:释放视频快照信息
	* 参数:FFImgInfo* info 视频快照信息
	* 返回:void
	* 备注:
	**************************************************/
	void releaseFFImgInfo(FFImgInfo* info);

	FFImgInfo* snapshot_in_task(const string name);

	vector<FFImgInfo*> timing_snapshot_all();

private:
    FFNvDecoderManager(){}
    
    void closeAllFinishedDecoder();

private:
    map<string, AbstractDecoder*> decoderMap;

    mutex m_mutex;
};