Commit 0573bd980b8a8c92de81dce4b59afde0575ab934
1 parent
e65720d4
优化代码;添加注释
Showing
4 changed files
with
146 additions
and
30 deletions
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; |