aac5773f
hucm
功能基本完成,接口待打磨
|
1
|
#include "FFNvDecoderManager.h"
|
aac5773f
hucm
功能基本完成,接口待打磨
|
2
3
4
|
using namespace std;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
5
|
|
3c7e3e11
Hu Chunming
1.修改日志
|
6
|
FFNvDecoder* FFNvDecoderManager::createDecoder(MgrDecConfig config){
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
7
8
9
|
closeAllFinishedDecoder();
|
3c7e3e11
Hu Chunming
1.修改日志
|
10
11
12
13
14
|
std::lock_guard<std::mutex> l(m_mutex);
auto it = decoderMap.find(config.name);
if (it != decoderMap.end()){
av_log(NULL, AV_LOG_ERROR, "已存在name所标记的解码器 \n");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
15
16
17
18
19
20
21
22
23
|
return nullptr;
}
FFNvDecoder* dec = new FFNvDecoder();
if (dec == nullptr)
{
return nullptr;
}
|
e96e6489
Hu Chunming
优化代码;添加isRunning函数
|
24
|
bool bRet= dec->init(config.cfg);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
25
26
|
if (bRet)
{
|
7319ea36
Hu Chunming
多显卡设置
|
27
28
|
dec->setName(config.name) ;
dec->post_decoded_cbk = config.cfg.post_decoded_cbk;
|
3c7e3e11
Hu Chunming
1.修改日志
|
29
|
dec->decode_finished_cbk = config.cfg.decode_finished_cbk;
|
7319ea36
Hu Chunming
多显卡设置
|
30
|
decoderMap[config.name] = dec;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
31
32
33
34
35
36
37
38
39
40
|
return dec;
}
// 创建失败,关闭解码器
dec->close();
delete dec;
return nullptr;
}
|
0573bd98
Hu Chunming
优化代码;添加注释
|
41
|
bool FFNvDecoderManager::setUserPtr(const string name, const void * userPtr)
|
aac5773f
hucm
功能基本完成,接口待打磨
|
42
43
44
|
{
if (name.empty())
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
45
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
0573bd98
Hu Chunming
优化代码;添加注释
|
46
|
return false;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
47
48
|
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
49
50
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
51
52
53
54
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
dec->second->m_userPtr = userPtr;
|
0573bd98
Hu Chunming
优化代码;添加注释
|
55
|
return true;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
56
57
|
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
58
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
0573bd98
Hu Chunming
优化代码;添加注释
|
59
|
return false;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
60
61
62
63
64
65
|
}
FFNvDecoder* FFNvDecoderManager::getDecoderByName(const string name)
{
if (name.empty())
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
66
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
67
68
69
|
return nullptr;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
70
71
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
72
73
74
75
76
77
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
return dec->second;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
78
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
aac5773f
hucm
功能基本完成,接口待打磨
|
79
80
81
82
83
84
85
86
87
88
|
return nullptr;
}
void FFNvDecoderManager::startDecode(FFNvDecoder* dec){
if (dec != nullptr && !dec->isRunning())
{
dec->start();
}
}
|
0573bd98
Hu Chunming
优化代码;添加注释
|
89
|
bool FFNvDecoderManager::startDecodeByName(const string name){
|
aac5773f
hucm
功能基本完成,接口待打磨
|
90
91
|
if (name.empty())
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
92
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
93
94
95
|
return false;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
96
97
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
98
99
100
101
102
103
104
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
dec->second->start();
return true;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
105
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
aac5773f
hucm
功能基本完成,接口待打磨
|
106
107
108
109
|
return false;
}
void FFNvDecoderManager::startAllDecode(){
|
3c7e3e11
Hu Chunming
1.修改日志
|
110
111
112
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
113
|
for(auto iter = decoderMap.begin(); iter != decoderMap.end(); iter++){
|
0573bd98
Hu Chunming
优化代码;添加注释
|
114
115
116
117
|
if (!iter->second->isRunning())
{
iter->second->start();
}
|
aac5773f
hucm
功能基本完成,接口待打磨
|
118
119
120
|
}
}
|
0573bd98
Hu Chunming
优化代码;添加注释
|
121
|
bool FFNvDecoderManager::closeDecoderByName(const string name){
|
aac5773f
hucm
功能基本完成,接口待打磨
|
122
123
|
if (name.empty())
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
124
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
125
126
127
|
return false;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
128
129
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
130
131
132
133
134
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
dec->second->close();
delete dec->second;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
135
|
dec->second = nullptr;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
136
|
decoderMap.erase(dec);
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
137
|
|
aac5773f
hucm
功能基本完成,接口待打磨
|
138
139
140
|
return true;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
141
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
aac5773f
hucm
功能基本完成,接口待打磨
|
142
143
144
145
146
|
return false;
}
void FFNvDecoderManager::closeAllDecoder()
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
147
148
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
149
150
|
for(auto iter = decoderMap.begin(); iter != decoderMap.end(); iter++){
iter->second->close();
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
151
|
delete iter->second;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
152
|
iter->second = nullptr;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
153
154
|
}
decoderMap.clear();
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
155
156
157
158
|
}
void FFNvDecoderManager::closeAllFinishedDecoder()
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
159
160
|
std::lock_guard<std::mutex> l(m_mutex);
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
161
|
for(auto iter = decoderMap.begin(); iter != decoderMap.end(); ){
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
162
163
164
|
if (iter->second->isFinished())
{
delete iter->second;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
165
166
167
168
169
170
|
iter->second = nullptr;
iter = decoderMap.erase(iter);
}
else
{
iter++ ;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
171
|
}
|
aac5773f
hucm
功能基本完成,接口待打磨
|
172
|
}
|
aac5773f
hucm
功能基本完成,接口待打磨
|
173
174
175
176
|
}
int FFNvDecoderManager::count()
{
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
177
178
|
closeAllFinishedDecoder();
|
3c7e3e11
Hu Chunming
1.修改日志
|
179
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
180
181
182
|
return decoderMap.size();
}
|
0573bd98
Hu Chunming
优化代码;添加注释
|
183
|
bool FFNvDecoderManager::pauseDecoder(const string name)
|
aac5773f
hucm
功能基本完成,接口待打磨
|
184
185
186
|
{
if (name.empty())
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
187
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
188
189
190
|
return false;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
191
192
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
193
194
195
196
197
198
199
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
dec->second->pause();
return true;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
200
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
aac5773f
hucm
功能基本完成,接口待打磨
|
201
202
203
|
return false;
}
|
0573bd98
Hu Chunming
优化代码;添加注释
|
204
|
bool FFNvDecoderManager::resumeDecoder(const string name)
|
aac5773f
hucm
功能基本完成,接口待打磨
|
205
206
207
|
{
if (name.empty())
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
208
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
209
210
211
|
return false;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
212
213
|
std::lock_guard<std::mutex> l(m_mutex);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
214
215
216
217
218
219
220
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
dec->second->resume();
return true;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
221
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
aac5773f
hucm
功能基本完成,接口待打磨
|
222
223
224
|
return false;
}
|
e96e6489
Hu Chunming
优化代码;添加isRunning函数
|
225
|
bool FFNvDecoderManager::isSurport(FFDecConfig& cfg)
|
aac5773f
hucm
功能基本完成,接口待打磨
|
226
227
|
{
FFNvDecoder dec;
|
0573bd98
Hu Chunming
优化代码;添加注释
|
228
|
return dec.isSurport(cfg);
|
e96e6489
Hu Chunming
优化代码;添加isRunning函数
|
229
230
|
}
|
0573bd98
Hu Chunming
优化代码;添加注释
|
231
|
bool FFNvDecoderManager::isRunning(const string name){
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
232
|
if (name.empty())
|
e96e6489
Hu Chunming
优化代码;添加isRunning函数
|
233
|
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
234
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
e96e6489
Hu Chunming
优化代码;添加isRunning函数
|
235
236
237
|
return false;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
238
239
|
std::lock_guard<std::mutex> l(m_mutex);
|
e96e6489
Hu Chunming
优化代码;添加isRunning函数
|
240
241
242
243
244
245
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
return dec->second->isRunning();
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
return false;
}
bool FFNvDecoderManager::isFinished(const string name){
if (name.empty())
{
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
return false;
}
std::lock_guard<std::mutex> l(m_mutex);
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
return dec->second->isFinished();
}
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
return false;
}
bool FFNvDecoderManager::isPausing(const string name){
if (name.empty())
{
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
return false;
}
std::lock_guard<std::mutex> l(m_mutex);
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
return dec->second->isPausing();
}
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
e96e6489
Hu Chunming
优化代码;添加isRunning函数
|
285
|
return false;
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
286
287
288
289
290
291
|
}
bool FFNvDecoderManager::setDecKeyframe(const string name, bool bKeyframe)
{
if (name.empty())
{
|
3c7e3e11
Hu Chunming
1.修改日志
|
292
|
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
293
294
295
|
return false;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
296
297
|
std::lock_guard<std::mutex> l(m_mutex);
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
298
299
300
301
302
303
304
|
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
dec->second->setDecKeyframe(bKeyframe);
return true;
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
|
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
return false;
}
bool FFNvDecoderManager::getResolution(const string name, int &width, int &height)
{
if (name.empty())
{
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
return false;
}
std::lock_guard<std::mutex> l(m_mutex);
auto dec = decoderMap.find(name);
if (dec != decoderMap.end())
{
dec->second->getResolution(width, height);
return true;
}
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
327
|
return false;
|
3c7e3e11
Hu Chunming
1.修改日志
|
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
|
}
vector<string> FFNvDecoderManager::getAllDecodeName(){
closeAllFinishedDecoder();
std::lock_guard<std::mutex> l(m_mutex);
vector<string> decode_names;
for(auto it = decoderMap.begin(); it != decoderMap.end(); ++it){
decode_names.push_back(it->first);
}
return decode_names;
}
int FFNvDecoderManager::getCachedQueueLength(const string name){
if (name.empty()){
av_log(NULL, AV_LOG_ERROR, "name 为空! \n");
return -1;
}
std::lock_guard<std::mutex> l(m_mutex);
auto dec = decoderMap.find(name);
if (dec != decoderMap.end()){
return dec->second->getCachedQueueLength();
}
av_log(NULL, AV_LOG_ERROR, "没有找到name为 %s 的解码器! \n", name.c_str());
return -1;
}
FFImgInfo* FFNvDecoderManager::snapshot(const string& uri){
return FFNvDecoder::snapshot(uri);
}
void FFNvDecoderManager::releaseFFImgInfo(FFImgInfo* info){
FFNvDecoder::releaseFFImgInfo(info);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
366
|
}
|