FFNvDecoderManager.h 5.2 KB
#include "FFNvDecoder.h"
#include<iostream>
#include<vector>
#include<map>

#include <mutex>

using namespace std;

struct MgrDecConfig
{
    FFDecConfig cfg;    // 解码器配置
    string name{""};    // 解码器名称
};

/**
 * 解码器管理类,单例类
 **/
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
	* 备注:
	**************************************************/
    FFNvDecoder* createDecoder(MgrDecConfig& config);

    /**************************************************
	* 接口:setUserPtr
	* 功能:设置解码数据回调接口的用户自定义参数
	* 参数:string name 解码器名称
    *       const void * userPtr  用户自定义的要传到解码数据回调接口的数据
	* 返回:设置成功返回true,失败返回false
	* 备注:
	**************************************************/
    bool setUserPtr(const string name, const void * userPtr);

    /**************************************************
	* 接口:getDecoderByName
	* 功能:根据解码器名称返回解码器对象指针
	* 参数:const string name 解码器名称
	* 返回:成功返回对应的解码器对象的指针,失败返回nullptr
	* 备注:
	**************************************************/
    FFNvDecoder* getDecoderByName(const string name);

    /**************************************************
	* 接口:startDecode
	* 功能:启动解码
	* 参数:FFNvDecoder* 解码器指针
	* 返回:void
	* 备注:
	**************************************************/
    void startDecode(FFNvDecoder*);

    /**************************************************
	* 接口: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();

    /**************************************************
	* 接口: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(FFDecConfig& cfg);

    /**************************************************
	* 接口:isRunning
	* 功能:根据解码器名称判断解码器是否正在运行
	* 参数:const string name 解码器名称
	* 返回:正在运行返回true,否则返回false
	* 备注:
	**************************************************/
    bool isRunning(const string name);

    /**************************************************
	* 接口:count
	* 功能:获取正在运行的解码器数量
	* 参数:void
	* 返回:正在运行的解码器数量
	* 备注:
	**************************************************/
    int count();

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

private:
    map<string, FFNvDecoder*> decoderMap;

    mutex m_mutex_erase;
};