diff --git a/src/FFNvDecoder.cpp b/src/FFNvDecoder.cpp index 7d070ed..ffd6be9 100644 --- a/src/FFNvDecoder.cpp +++ b/src/FFNvDecoder.cpp @@ -136,6 +136,13 @@ bool FFNvDecoder::init(const char* uri, const char* gpuid, bool force_tcp) return true; } +bool FFNvDecoder::isSurport(FFDecConfig& cfg) +{ + bool bRet = init(cfg); + decode_finished(); + return bRet; +} + void FFNvDecoder::start(){ m_bRunning = true; diff --git a/src/FFNvDecoder.h b/src/FFNvDecoder.h index 6e39b93..7fcce6c 100644 --- a/src/FFNvDecoder.h +++ b/src/FFNvDecoder.h @@ -31,10 +31,10 @@ typedef void(*POST_DECODE_CALLBACK)(const void * userPtr, AVFrame * gpuFrame); struct FFDecConfig { - string uri; - POST_DECODE_CALLBACK post_decoded_cbk; - string gpuid; - bool force_tcp{true}; + string uri; // 视频地址 + POST_DECODE_CALLBACK post_decoded_cbk; // 解码数据回调接口 + string gpuid; // gpu id + bool force_tcp{true}; // 是否指定使用tcp连接 }; class FFNvDecoder{ @@ -54,6 +54,8 @@ public: void setName(string nm); string getName(); + bool isSurport(FFDecConfig& cfg); + public: AVPixelFormat getHwPixFmt(); diff --git a/src/FFNvDecoderManager.cpp b/src/FFNvDecoderManager.cpp index 54373cf..4044778 100644 --- a/src/FFNvDecoderManager.cpp +++ b/src/FFNvDecoderManager.cpp @@ -37,23 +37,23 @@ FFNvDecoder* FFNvDecoderManager::createDecoder(MgrDecConfig& config){ return nullptr; } -void FFNvDecoderManager::setUserPtr(string name, const void * userPtr) +bool FFNvDecoderManager::setUserPtr(const string name, const void * userPtr) { if (name.empty()) { cout << "name 为空!"<< endl; - return ; + return false; } auto dec = decoderMap.find(name); if (dec != decoderMap.end()) { dec->second->m_userPtr = userPtr; - return; + return true; } cout << "没有找到name为" << name << "的解码器!" << endl; - return ; + return false; } FFNvDecoder* FFNvDecoderManager::getDecoderByName(const string name) @@ -81,7 +81,7 @@ void FFNvDecoderManager::startDecode(FFNvDecoder* dec){ } } -bool FFNvDecoderManager::startDecodeByName(string name){ +bool FFNvDecoderManager::startDecodeByName(const string name){ if (name.empty()) { cout << "name 为空!"<< endl; @@ -101,11 +101,14 @@ bool FFNvDecoderManager::startDecodeByName(string name){ void FFNvDecoderManager::startAllDecode(){ for(auto iter = decoderMap.begin(); iter != decoderMap.end(); iter++){ - iter->second->start(); + if (!iter->second->isRunning()) + { + iter->second->start(); + } } } -bool FFNvDecoderManager::closeDecoderByName(string name){ +bool FFNvDecoderManager::closeDecoderByName(const string name){ if (name.empty()) { cout << "name 为空!"<< endl; @@ -167,7 +170,7 @@ int FFNvDecoderManager::count() return decoderMap.size(); } -bool FFNvDecoderManager::pauseDecoder(string name) +bool FFNvDecoderManager::pauseDecoder(const string name) { if (name.empty()) { @@ -186,7 +189,7 @@ bool FFNvDecoderManager::pauseDecoder(string name) return false; } -bool FFNvDecoderManager::resumeDecoder(string name) +bool FFNvDecoderManager::resumeDecoder(const string name) { if (name.empty()) { @@ -208,12 +211,10 @@ bool FFNvDecoderManager::resumeDecoder(string name) bool FFNvDecoderManager::isSurport(FFDecConfig& cfg) { FFNvDecoder dec; - bool bRet = dec.init(cfg); - dec.close(); - return bRet; + return dec.isSurport(cfg); } -bool FFNvDecoderManager::isRunning(string name){ +bool FFNvDecoderManager::isRunning(const string name){ if (name.empty()) { cout << "name 为空!"<< endl; diff --git a/src/FFNvDecoderManager.h b/src/FFNvDecoderManager.h index 3d3fc77..055f77a 100644 --- a/src/FFNvDecoderManager.h +++ b/src/FFNvDecoderManager.h @@ -9,12 +9,22 @@ using namespace std; struct MgrDecConfig { - FFDecConfig cfg; - string name{""}; + FFDecConfig cfg; // 解码器配置 + string name{""}; // 解码器名称 }; +/** + * 解码器管理类,单例类 + **/ class FFNvDecoderManager{ public: + /************************************************** + * 接口:getInstance + * 功能:获取解码器管理者实例 + * 参数:无 + * 返回:成功返回 解码器管理者实例, 失败返回 nullptr + * 备注:调用其他接口前,需要先调用该接口获取管理者实例 + **************************************************/ static FFNvDecoderManager* getInstance(){ static FFNvDecoderManager* singleton = nullptr; if (singleton == nullptr){ @@ -28,32 +38,128 @@ public: closeAllDecoder(); } + /************************************************** + * 接口:createDecoder + * 功能:根据配置信息创建解码器 + * 参数:MgrDecConfig& config 解码器配置信息 + * 返回:成功返回解码器, 失败返回 nullptr + * 备注: + **************************************************/ FFNvDecoder* createDecoder(MgrDecConfig& config); - void setUserPtr(string name, const void * userPtr); + /************************************************** + * 接口: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*); + + /************************************************** + * 接口:startDecode + * 功能:启动全部解码 + * 参数:void + * 返回:void + * 备注: + **************************************************/ void startAllDecode(); - bool startDecodeByName(string name); - bool closeDecoderByName(string name); + /************************************************** + * 接口:startDecodeByName + * 功能:启动解码器名称对应的解码 + * 参数:string name 解码器名称 + * 返回:成功返回true,失败返回false + * 备注: + **************************************************/ + bool startDecodeByName(const string name); + + /************************************************** + * 接口:closeDecoderByName + * 功能:关闭解码器名称对应的解码 + * 参数:string name 解码器名称 + * 返回:成功返回true,失败返回false + * 备注: + **************************************************/ + bool closeDecoderByName(const string name); + + /************************************************** + * 接口:closeAllDecoder + * 功能:关闭全部解码器 + * 参数:void + * 返回:void + * 备注: + **************************************************/ void closeAllDecoder(); - void closeAllFinishedDecoder(); - - bool removeDecoderByName(string name); - - bool pauseDecoder(string name); - bool resumeDecoder(string name); + /************************************************** + * 接口: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); - bool isRunning(string name); - + /************************************************** + * 接口:isRunning + * 功能:根据解码器名称判断解码器是否正在运行 + * 参数:const string name 解码器名称 + * 返回:正在运行返回true,否则返回false + * 备注: + **************************************************/ + bool isRunning(const string name); + + /************************************************** + * 接口:count + * 功能:获取正在运行的解码器数量 + * 参数:void + * 返回:正在运行的解码器数量 + * 备注: + **************************************************/ int count(); private: FFNvDecoderManager(){} + + void closeAllFinishedDecoder(); private: map decoderMap;