Commit 0573bd980b8a8c92de81dce4b59afde0575ab934

Authored by Hu Chunming
1 parent e65720d4

优化代码;添加注释

src/FFNvDecoder.cpp
@@ -136,6 +136,13 @@ bool FFNvDecoder::init(const char* uri, const char* gpuid, bool force_tcp) @@ -136,6 +136,13 @@ bool FFNvDecoder::init(const char* uri, const char* gpuid, bool force_tcp)
136 return true; 136 return true;
137 } 137 }
138 138
  139 +bool FFNvDecoder::isSurport(FFDecConfig& cfg)
  140 +{
  141 + bool bRet = init(cfg);
  142 + decode_finished();
  143 + return bRet;
  144 +}
  145 +
139 void FFNvDecoder::start(){ 146 void FFNvDecoder::start(){
140 147
141 m_bRunning = true; 148 m_bRunning = true;
src/FFNvDecoder.h
@@ -31,10 +31,10 @@ typedef void(*POST_DECODE_CALLBACK)(const void * userPtr, AVFrame * gpuFrame); @@ -31,10 +31,10 @@ typedef void(*POST_DECODE_CALLBACK)(const void * userPtr, AVFrame * gpuFrame);
31 31
32 struct FFDecConfig 32 struct FFDecConfig
33 { 33 {
34 - string uri;  
35 - POST_DECODE_CALLBACK post_decoded_cbk;  
36 - string gpuid;  
37 - bool force_tcp{true}; 34 + string uri; // 视频地址
  35 + POST_DECODE_CALLBACK post_decoded_cbk; // 解码数据回调接口
  36 + string gpuid; // gpu id
  37 + bool force_tcp{true}; // 是否指定使用tcp连接
38 }; 38 };
39 39
40 class FFNvDecoder{ 40 class FFNvDecoder{
@@ -54,6 +54,8 @@ public: @@ -54,6 +54,8 @@ public:
54 void setName(string nm); 54 void setName(string nm);
55 string getName(); 55 string getName();
56 56
  57 + bool isSurport(FFDecConfig& cfg);
  58 +
57 public: 59 public:
58 AVPixelFormat getHwPixFmt(); 60 AVPixelFormat getHwPixFmt();
59 61
src/FFNvDecoderManager.cpp
@@ -37,23 +37,23 @@ FFNvDecoder* FFNvDecoderManager::createDecoder(MgrDecConfig& config){ @@ -37,23 +37,23 @@ FFNvDecoder* FFNvDecoderManager::createDecoder(MgrDecConfig& config){
37 return nullptr; 37 return nullptr;
38 } 38 }
39 39
40 -void FFNvDecoderManager::setUserPtr(string name, const void * userPtr) 40 +bool FFNvDecoderManager::setUserPtr(const string name, const void * userPtr)
41 { 41 {
42 if (name.empty()) 42 if (name.empty())
43 { 43 {
44 cout << "name 为空!"<< endl; 44 cout << "name 为空!"<< endl;
45 - return ; 45 + return false;
46 } 46 }
47 47
48 auto dec = decoderMap.find(name); 48 auto dec = decoderMap.find(name);
49 if (dec != decoderMap.end()) 49 if (dec != decoderMap.end())
50 { 50 {
51 dec->second->m_userPtr = userPtr; 51 dec->second->m_userPtr = userPtr;
52 - return; 52 + return true;
53 } 53 }
54 54
55 cout << "没有找到name为" << name << "的解码器!" << endl; 55 cout << "没有找到name为" << name << "的解码器!" << endl;
56 - return ; 56 + return false;
57 } 57 }
58 58
59 FFNvDecoder* FFNvDecoderManager::getDecoderByName(const string name) 59 FFNvDecoder* FFNvDecoderManager::getDecoderByName(const string name)
@@ -81,7 +81,7 @@ void FFNvDecoderManager::startDecode(FFNvDecoder* dec){ @@ -81,7 +81,7 @@ void FFNvDecoderManager::startDecode(FFNvDecoder* dec){
81 } 81 }
82 } 82 }
83 83
84 -bool FFNvDecoderManager::startDecodeByName(string name){ 84 +bool FFNvDecoderManager::startDecodeByName(const string name){
85 if (name.empty()) 85 if (name.empty())
86 { 86 {
87 cout << "name 为空!"<< endl; 87 cout << "name 为空!"<< endl;
@@ -101,11 +101,14 @@ bool FFNvDecoderManager::startDecodeByName(string name){ @@ -101,11 +101,14 @@ bool FFNvDecoderManager::startDecodeByName(string name){
101 101
102 void FFNvDecoderManager::startAllDecode(){ 102 void FFNvDecoderManager::startAllDecode(){
103 for(auto iter = decoderMap.begin(); iter != decoderMap.end(); iter++){ 103 for(auto iter = decoderMap.begin(); iter != decoderMap.end(); iter++){
104 - iter->second->start(); 104 + if (!iter->second->isRunning())
  105 + {
  106 + iter->second->start();
  107 + }
105 } 108 }
106 } 109 }
107 110
108 -bool FFNvDecoderManager::closeDecoderByName(string name){ 111 +bool FFNvDecoderManager::closeDecoderByName(const string name){
109 if (name.empty()) 112 if (name.empty())
110 { 113 {
111 cout << "name 为空!"<< endl; 114 cout << "name 为空!"<< endl;
@@ -167,7 +170,7 @@ int FFNvDecoderManager::count() @@ -167,7 +170,7 @@ int FFNvDecoderManager::count()
167 return decoderMap.size(); 170 return decoderMap.size();
168 } 171 }
169 172
170 -bool FFNvDecoderManager::pauseDecoder(string name) 173 +bool FFNvDecoderManager::pauseDecoder(const string name)
171 { 174 {
172 if (name.empty()) 175 if (name.empty())
173 { 176 {
@@ -186,7 +189,7 @@ bool FFNvDecoderManager::pauseDecoder(string name) @@ -186,7 +189,7 @@ bool FFNvDecoderManager::pauseDecoder(string name)
186 return false; 189 return false;
187 } 190 }
188 191
189 -bool FFNvDecoderManager::resumeDecoder(string name) 192 +bool FFNvDecoderManager::resumeDecoder(const string name)
190 { 193 {
191 if (name.empty()) 194 if (name.empty())
192 { 195 {
@@ -208,12 +211,10 @@ bool FFNvDecoderManager::resumeDecoder(string name) @@ -208,12 +211,10 @@ bool FFNvDecoderManager::resumeDecoder(string name)
208 bool FFNvDecoderManager::isSurport(FFDecConfig& cfg) 211 bool FFNvDecoderManager::isSurport(FFDecConfig& cfg)
209 { 212 {
210 FFNvDecoder dec; 213 FFNvDecoder dec;
211 - bool bRet = dec.init(cfg);  
212 - dec.close();  
213 - return bRet; 214 + return dec.isSurport(cfg);
214 } 215 }
215 216
216 -bool FFNvDecoderManager::isRunning(string name){ 217 +bool FFNvDecoderManager::isRunning(const string name){
217 if (name.empty()) 218 if (name.empty())
218 { 219 {
219 cout << "name 为空!"<< endl; 220 cout << "name 为空!"<< endl;
src/FFNvDecoderManager.h
@@ -9,12 +9,22 @@ using namespace std; @@ -9,12 +9,22 @@ using namespace std;
9 9
10 struct MgrDecConfig 10 struct MgrDecConfig
11 { 11 {
12 - FFDecConfig cfg;  
13 - string name{""}; 12 + FFDecConfig cfg; // 解码器配置
  13 + string name{""}; // 解码器名称
14 }; 14 };
15 15
  16 +/**
  17 + * 解码器管理类,单例类
  18 + **/
16 class FFNvDecoderManager{ 19 class FFNvDecoderManager{
17 public: 20 public:
  21 + /**************************************************
  22 + * 接口:getInstance
  23 + * 功能:获取解码器管理者实例
  24 + * 参数:无
  25 + * 返回:成功返回 解码器管理者实例, 失败返回 nullptr
  26 + * 备注:调用其他接口前,需要先调用该接口获取管理者实例
  27 + **************************************************/
18 static FFNvDecoderManager* getInstance(){ 28 static FFNvDecoderManager* getInstance(){
19 static FFNvDecoderManager* singleton = nullptr; 29 static FFNvDecoderManager* singleton = nullptr;
20 if (singleton == nullptr){ 30 if (singleton == nullptr){
@@ -28,32 +38,128 @@ public: @@ -28,32 +38,128 @@ public:
28 closeAllDecoder(); 38 closeAllDecoder();
29 } 39 }
30 40
  41 + /**************************************************
  42 + * 接口:createDecoder
  43 + * 功能:根据配置信息创建解码器
  44 + * 参数:MgrDecConfig& config 解码器配置信息
  45 + * 返回:成功返回解码器, 失败返回 nullptr
  46 + * 备注:
  47 + **************************************************/
31 FFNvDecoder* createDecoder(MgrDecConfig& config); 48 FFNvDecoder* createDecoder(MgrDecConfig& config);
32 - void setUserPtr(string name, const void * userPtr);  
33 49
  50 + /**************************************************
  51 + * 接口:setUserPtr
  52 + * 功能:设置解码数据回调接口的用户自定义参数
  53 + * 参数:string name 解码器名称
  54 + * const void * userPtr 用户自定义的要传到解码数据回调接口的数据
  55 + * 返回:设置成功返回true,失败返回false
  56 + * 备注:
  57 + **************************************************/
  58 + bool setUserPtr(const string name, const void * userPtr);
  59 +
  60 + /**************************************************
  61 + * 接口:getDecoderByName
  62 + * 功能:根据解码器名称返回解码器对象指针
  63 + * 参数:const string name 解码器名称
  64 + * 返回:成功返回对应的解码器对象的指针,失败返回nullptr
  65 + * 备注:
  66 + **************************************************/
34 FFNvDecoder* getDecoderByName(const string name); 67 FFNvDecoder* getDecoderByName(const string name);
35 68
  69 + /**************************************************
  70 + * 接口:startDecode
  71 + * 功能:启动解码
  72 + * 参数:FFNvDecoder* 解码器指针
  73 + * 返回:void
  74 + * 备注:
  75 + **************************************************/
36 void startDecode(FFNvDecoder*); 76 void startDecode(FFNvDecoder*);
  77 +
  78 + /**************************************************
  79 + * 接口:startDecode
  80 + * 功能:启动全部解码
  81 + * 参数:void
  82 + * 返回:void
  83 + * 备注:
  84 + **************************************************/
37 void startAllDecode(); 85 void startAllDecode();
38 - bool startDecodeByName(string name);  
39 86
40 - bool closeDecoderByName(string name); 87 + /**************************************************
  88 + * 接口:startDecodeByName
  89 + * 功能:启动解码器名称对应的解码
  90 + * 参数:string name 解码器名称
  91 + * 返回:成功返回true,失败返回false
  92 + * 备注:
  93 + **************************************************/
  94 + bool startDecodeByName(const string name);
  95 +
  96 + /**************************************************
  97 + * 接口:closeDecoderByName
  98 + * 功能:关闭解码器名称对应的解码
  99 + * 参数:string name 解码器名称
  100 + * 返回:成功返回true,失败返回false
  101 + * 备注:
  102 + **************************************************/
  103 + bool closeDecoderByName(const string name);
  104 +
  105 + /**************************************************
  106 + * 接口:closeAllDecoder
  107 + * 功能:关闭全部解码器
  108 + * 参数:void
  109 + * 返回:void
  110 + * 备注:
  111 + **************************************************/
41 void closeAllDecoder(); 112 void closeAllDecoder();
42 - void closeAllFinishedDecoder();  
43 -  
44 - bool removeDecoderByName(string name);  
45 -  
46 - bool pauseDecoder(string name);  
47 - bool resumeDecoder(string name);  
48 113
  114 + /**************************************************
  115 + * 接口:pauseDecoder
  116 + * 功能:暂停指定名称的解码器
  117 + * 参数:const string name 解码器名称
  118 + * 返回:成功返回true,失败返回false
  119 + * 备注:
  120 + **************************************************/
  121 + bool pauseDecoder(const string name);
  122 +
  123 + /**************************************************
  124 + * 接口:pauseDecoder
  125 + * 功能:恢复指定名称的解码器
  126 + * 参数:const string name 解码器名称
  127 + * 返回:成功返回true,失败返回false
  128 + * 备注:
  129 + **************************************************/
  130 + bool resumeDecoder(const string name);
  131 +
  132 + /**************************************************
  133 + * 接口:isSurport
  134 + * 功能:是否支持指定配置的解码
  135 + * 参数:FFDecConfig& cfg 解码器配置
  136 + * 返回:支持返回true,不支持返回false
  137 + * 备注:
  138 + **************************************************/
49 bool isSurport(FFDecConfig& cfg); 139 bool isSurport(FFDecConfig& cfg);
50 140
51 - bool isRunning(string name);  
52 - 141 + /**************************************************
  142 + * 接口:isRunning
  143 + * 功能:根据解码器名称判断解码器是否正在运行
  144 + * 参数:const string name 解码器名称
  145 + * 返回:正在运行返回true,否则返回false
  146 + * 备注:
  147 + **************************************************/
  148 + bool isRunning(const string name);
  149 +
  150 + /**************************************************
  151 + * 接口:count
  152 + * 功能:获取正在运行的解码器数量
  153 + * 参数:void
  154 + * 返回:正在运行的解码器数量
  155 + * 备注:
  156 + **************************************************/
53 int count(); 157 int count();
54 158
55 private: 159 private:
56 FFNvDecoderManager(){} 160 FFNvDecoderManager(){}
  161 +
  162 + void closeAllFinishedDecoder();
57 163
58 private: 164 private:
59 map<string, FFNvDecoder*> decoderMap; 165 map<string, FFNvDecoder*> decoderMap;