Blame view

src/FFNvDecoderManager.cpp 4.82 KB
aac5773f   hucm   功能基本完成,接口待打磨
1
2
3
4
5
  #include "FFNvDecoderManager.h"
  #include<iostream>
  
  using namespace std;
  
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
6
  
7319ea36   Hu Chunming   多显卡设置
7
  FFNvDecoder* FFNvDecoderManager::createDecoder(MgrDecConfig& config){
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
8
9
10
  
      closeAllFinishedDecoder();
  
7319ea36   Hu Chunming   多显卡设置
11
      int num = decoderMap.count(config.name);
aac5773f   hucm   功能基本完成,接口待打磨
12
13
14
15
16
17
18
19
20
21
22
23
      if (num > 0)
      {
          cout << "已存在name所标记的解码器" << endl;
          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
29
          dec->setName(config.name) ;
          dec->post_decoded_cbk = config.cfg.post_decoded_cbk;
          decoderMap[config.name] = dec;
aac5773f   hucm   功能基本完成,接口待打磨
30
31
32
33
34
35
36
37
38
39
          return dec;
      }
      
      // 创建失败,关闭解码器
      dec->close();
      delete dec;
  
      return nullptr;
  }
  
0573bd98   Hu Chunming   优化代码;添加注释
40
  bool FFNvDecoderManager::setUserPtr(const string name, const void * userPtr)
aac5773f   hucm   功能基本完成,接口待打磨
41
42
43
44
  {
      if (name.empty())
      {
          cout << "name 为空!"<< endl;
0573bd98   Hu Chunming   优化代码;添加注释
45
          return false;
aac5773f   hucm   功能基本完成,接口待打磨
46
47
48
49
50
51
      }
  
      auto dec = decoderMap.find(name);
      if (dec != decoderMap.end())
      {
          dec->second->m_userPtr = userPtr;
0573bd98   Hu Chunming   优化代码;添加注释
52
          return true;
aac5773f   hucm   功能基本完成,接口待打磨
53
54
55
      }
  
      cout << "没有找到name为" << name << "的解码器!" << endl;
0573bd98   Hu Chunming   优化代码;添加注释
56
      return false;
aac5773f   hucm   功能基本完成,接口待打磨
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  }
  
  FFNvDecoder* FFNvDecoderManager::getDecoderByName(const string name)
  {
      if (name.empty())
      {
          cout << "name 为空!"<< endl;
          return nullptr;
      }
      
      auto dec = decoderMap.find(name);
      if (dec != decoderMap.end())
      {
          return dec->second;
      }
  
      cout << "没有找到name为" << name << "的解码器!" << endl;
      return nullptr;
  }
  
  void FFNvDecoderManager::startDecode(FFNvDecoder* dec){
      if (dec != nullptr && !dec->isRunning())
      {
          dec->start();
      }
  }
  
0573bd98   Hu Chunming   优化代码;添加注释
84
  bool FFNvDecoderManager::startDecodeByName(const string name){
aac5773f   hucm   功能基本完成,接口待打磨
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
       if (name.empty())
      {
          cout << "name 为空!"<< endl;
          return false;
      }
  
      auto dec = decoderMap.find(name);
      if (dec != decoderMap.end())
      {
          dec->second->start();
          return true;
      }
  
      cout << "没有找到name为" << name << "的解码器!" << endl;
      return false;
  }
  
  void FFNvDecoderManager::startAllDecode(){
      for(auto iter = decoderMap.begin(); iter != decoderMap.end(); iter++){
0573bd98   Hu Chunming   优化代码;添加注释
104
105
106
107
          if (!iter->second->isRunning())
          {
              iter->second->start();
          }
aac5773f   hucm   功能基本完成,接口待打磨
108
109
110
      }
  }
  
0573bd98   Hu Chunming   优化代码;添加注释
111
  bool FFNvDecoderManager::closeDecoderByName(const string name){
aac5773f   hucm   功能基本完成,接口待打磨
112
113
114
115
116
117
      if (name.empty())
      {
          cout << "name 为空!"<< endl;
          return false;
      }
  
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
118
      m_mutex_erase.lock();
aac5773f   hucm   功能基本完成,接口待打磨
119
120
121
122
123
      auto dec = decoderMap.find(name);
      if (dec != decoderMap.end())
      {
          dec->second->close();
          delete dec->second;
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
124
          dec->second = nullptr;
aac5773f   hucm   功能基本完成,接口待打磨
125
          decoderMap.erase(dec);
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
126
127
  
          m_mutex_erase.unlock();
aac5773f   hucm   功能基本完成,接口待打磨
128
129
130
          return true;
      }
      
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
131
      m_mutex_erase.unlock();
aac5773f   hucm   功能基本完成,接口待打磨
132
133
134
135
136
137
      cout << "没有找到name为" << name << "的解码器!" << endl;
      return false;
  }
  
  void FFNvDecoderManager::closeAllDecoder()
  {
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
138
      m_mutex_erase.lock();
aac5773f   hucm   功能基本完成,接口待打磨
139
140
      for(auto iter = decoderMap.begin(); iter != decoderMap.end(); iter++){
          iter->second->close();
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
141
          delete iter->second;
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
142
          iter->second = nullptr;
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
143
144
      }
      decoderMap.clear();
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
145
      m_mutex_erase.unlock();
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
146
147
148
149
  }
  
  void FFNvDecoderManager::closeAllFinishedDecoder()
  {
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
150
151
      m_mutex_erase.lock();
       for(auto iter = decoderMap.begin(); iter != decoderMap.end(); ){
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
152
153
154
          if (iter->second->isFinished())
          {
              delete iter->second;
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
155
156
157
158
159
160
              iter->second = nullptr;
              iter = decoderMap.erase(iter);
          }
          else
          {
              iter++ ;
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
161
          }
aac5773f   hucm   功能基本完成,接口待打磨
162
      }
f40cc409   Hu Chunming   优化显存占用。当前在3080显卡上...
163
      m_mutex_erase.unlock();
aac5773f   hucm   功能基本完成,接口待打磨
164
165
166
167
  }
  
  int FFNvDecoderManager::count()
  {
48330793   Hu Chunming   修正解码线程自然结束时解码器内存没...
168
169
      closeAllFinishedDecoder();
  
aac5773f   hucm   功能基本完成,接口待打磨
170
171
172
      return decoderMap.size();
  }
  
0573bd98   Hu Chunming   优化代码;添加注释
173
  bool FFNvDecoderManager::pauseDecoder(const string name)
aac5773f   hucm   功能基本完成,接口待打磨
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
  {
      if (name.empty())
      {
          cout << "name 为空!"<< endl;
          return false;
      }
  
      auto dec = decoderMap.find(name);
      if (dec != decoderMap.end())
      {
          dec->second->pause();
          return true;
      }
      
      cout << "没有找到name为" << name << "的解码器!" << endl;
      return false;
  }
  
0573bd98   Hu Chunming   优化代码;添加注释
192
  bool FFNvDecoderManager::resumeDecoder(const string name)
aac5773f   hucm   功能基本完成,接口待打磨
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
  {
      if (name.empty())
      {
          cout << "name 为空!"<< endl;
          return false;
      }
  
      auto dec = decoderMap.find(name);
      if (dec != decoderMap.end())
      {
          dec->second->resume();
          return true;
      }
      
      cout << "没有找到name为" << name << "的解码器!" << endl;
      return false;
  }
  
e96e6489   Hu Chunming   优化代码;添加isRunning函数
211
  bool FFNvDecoderManager::isSurport(FFDecConfig& cfg)
aac5773f   hucm   功能基本完成,接口待打磨
212
213
  {
      FFNvDecoder dec;
0573bd98   Hu Chunming   优化代码;添加注释
214
      return dec.isSurport(cfg);
e96e6489   Hu Chunming   优化代码;添加isRunning函数
215
216
  }
  
0573bd98   Hu Chunming   优化代码;添加注释
217
  bool FFNvDecoderManager::isRunning(const string name){
e96e6489   Hu Chunming   优化代码;添加isRunning函数
218
219
220
221
222
223
224
225
226
227
228
229
230
231
       if (name.empty())
      {
          cout << "name 为空!"<< endl;
          return false;
      }
  
      auto dec = decoderMap.find(name);
      if (dec != decoderMap.end())
      {
          return dec->second->isRunning();
      }
      
      cout << "没有找到name为" << name << "的解码器!" << endl;
      return false;
aac5773f   hucm   功能基本完成,接口待打磨
232
  }