aac5773f
hucm
功能基本完成,接口待打磨
|
1
|
#include <iostream>
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
2
3
|
#include <pthread.h>
#include <thread>
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
4
|
#include <chrono>
|
3d2ab595
Hu Chunming
支持gb28181
|
5
6
7
8
9
10
11
12
13
14
15
16
|
#include <unistd.h>
#ifdef _WIN32
#include "Winsock2.h"
#pragma comment(lib, "ws2_32.lib")
#endif
#ifdef __linux__
#include "arpa/inet.h"
#endif
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
17
18
|
#include "../interface/FFNvDecoderManager.h"
#include "../interface/utiltools.hpp"
|
3d2ab595
Hu Chunming
支持gb28181
|
19
20
21
22
|
#define MIN_RTP_PORT 10000
#define MAX_RTP_PORT 60000
|
3d2ab595
Hu Chunming
支持gb28181
|
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
// ȡ MIN_RTP_PORT(10000)~MAX_RTP_PORT(60000)֮�������˿�(ż���������������˿ڿ���)
int allocRtpPort() {
static int s_rtpPort = MIN_RTP_PORT;
if (MIN_RTP_PORT == s_rtpPort)
{
srand((unsigned int)time(NULL));
s_rtpPort = MIN_RTP_PORT + (rand() % MIN_RTP_PORT);
}
if (s_rtpPort % 2)
++s_rtpPort;
while (true)
{
s_rtpPort += 2;
s_rtpPort = s_rtpPort >= MAX_RTP_PORT ? MIN_RTP_PORT : s_rtpPort;
int i = 0;
for (; i < 2; i++)
{
sockaddr_in sRecvAddr;
int s = socket(AF_INET, SOCK_DGRAM, 0);
sRecvAddr.sin_family = AF_INET;
sRecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
sRecvAddr.sin_port = htons(s_rtpPort + i);
int nResult = bind(s, (sockaddr *)&sRecvAddr, sizeof(sRecvAddr));
if (nResult != 0)
{
break;
}
nResult = close(s);
if (nResult != 0)
{
printf("closesocket failed:%d\n", nResult);
break;
}
}
if (i == 2)
break;
}
return s_rtpPort;
}
|
e65720d4
Hu Chunming
优化demo
|
76
77
78
79
80
|
unsigned char *pHwRgb[2] = {nullptr, nullptr};
int sum1 = 0;
int sum2 = 0;
|
e41a52bb
Hu Chunming
1.优化数据读取线程;2. 添加A...
|
81
|
|
92989af0
ming
更新解码器
|
82
|
string data_home = "/mnt/data/cmhu/tmp/";
|
a2b7fd92
ming
测试代码优化
|
83
84
|
|
a2b7fd92
ming
测试代码优化
|
85
|
|
a2b7fd92
ming
测试代码优化
|
86
|
|
0b43216c
Hu Chunming
添加重要注释
|
87
88
89
|
/**
* 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
* */
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
90
|
void postDecoded(const void * userPtr, DeviceRgbMemory* devFrame){
|
3d2ab595
Hu Chunming
支持gb28181
|
91
|
AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
92
93
|
if (decoder!= nullptr)
{
|
d248da62
Hu Chunming
优化代码,修正dvpp的一些bug
|
94
|
}
|
e65720d4
Hu Chunming
优化demo
|
95
|
|
d248da62
Hu Chunming
优化代码,修正dvpp的一些bug
|
96
97
98
|
if(devFrame){
delete devFrame;
devFrame = nullptr;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
99
100
101
|
}
}
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
102
103
104
105
106
107
|
long start_time = 0;
long end_time = 0;
bool count_flag = false;
int count = 0;
int count_std = 100;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
108
|
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
109
|
static int sum = 0;
|
e65720d4
Hu Chunming
优化demo
|
110
111
|
unsigned char *pHwData = nullptr;
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
112
|
void postDecoded0(const void * userPtr, DeviceRgbMemory* devFrame){
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
113
114
|
// std::this_thread::sleep_for(std::chrono::milliseconds(30000));
|
3d2ab595
Hu Chunming
支持gb28181
|
115
|
AbstractDecoder* decoder = (AbstractDecoder*)userPtr;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
116
117
118
119
120
121
122
123
124
|
if (decoder!= nullptr)
{
// cout << "decode name: " << decoder->getName() << endl;
if (decoder->getName() == "dec")
{
if (! count_flag)
{
count_flag = true;
count = 0;
|
92989af0
ming
更新解码器
|
125
|
end_time = start_time = UtilTools::get_cur_time_ms();
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
126
127
128
|
}
count++;
sum ++ ;
|
0a826b3d
Hu Chunming
适应WSL的修改
|
129
130
|
if (count >= count_std)
{
|
92989af0
ming
更新解码器
|
131
|
// end_time = UtilTools::get_cur_time_ms();
|
0a826b3d
Hu Chunming
适应WSL的修改
|
132
133
134
|
// long time_using = end_time - start_time;
// double time_per_frame = double(time_using)/count_std ;
// cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl;
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
135
|
cout << decoder->getName() << " keyframe: " << devFrame->isKeyFrame() << " width: " << devFrame->getWidth() << " height: "<< devFrame->getHeight() << endl;
|
a2b7fd92
ming
测试代码优化
|
136
|
// cout << gpuFrame->pts << endl;
|
0a826b3d
Hu Chunming
适应WSL的修改
|
137
138
139
|
count_flag = false;
}
|
a2b7fd92
ming
测试代码优化
|
140
|
// cout << "帧数:" << sum << endl;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
141
142
143
144
|
}
}
}
|
6fc86385
ming
代码优化
|
145
|
void decode_finished_cbk(const void* userPtr){
|
92989af0
ming
更新解码器
|
146
|
cout << "当前时间戳: " << UtilTools::get_cur_time_ms() << endl;
|
6fc86385
ming
代码优化
|
147
148
|
}
|
92989af0
ming
更新解码器
|
149
|
bool decode_request_stream_cbk(const char* deviceId){
|
372e629f
ming
gb28181支持TCP数据流
|
150
151
152
153
|
cout << "需在此请求流" << endl;
return true;
}
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
154
|
// string test_uri = "rtmp://192.168.10.56:1935/objecteye/1";
|
e65720d4
Hu Chunming
优化demo
|
155
|
// string test_uri = "/home/cmhu/data/output_800x480.mp4";
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
156
157
|
// string test_uri = "/home/cmhu/data/output_1920x1080.mp4";
// string test_uri = "rtsp://176.10.0.2:8554/stream";
|
d384f0e9
Hu Chunming
代码优化
|
158
|
// string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
159
|
// string test_uri = "rtsp://176.10.0.4:8554/stream";
|
d248da62
Hu Chunming
优化代码,修正dvpp的一些bug
|
160
161
|
// string test_uri = "rtsp://admin:admin@123456@192.168.60.176:554/cam/realmonitor?channel=1&subtype=0";
string test_uri = "/home/huchunming/data/woyikewangh265.mp4";
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
162
|
|
a2b7fd92
ming
测试代码优化
|
163
|
void createDecode(int index, const char* gpu_id){
|
aac5773f
hucm
功能基本完成,接口待打磨
|
164
|
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
|
7319ea36
Hu Chunming
多显卡设置
|
165
|
MgrDecConfig config;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
166
|
config.name = "dec" + to_string(index);
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
167
|
config.cfg.uri = test_uri;
|
7319ea36
Hu Chunming
多显卡设置
|
168
|
config.cfg.post_decoded_cbk = postDecoded;
|
6fc86385
ming
代码优化
|
169
|
config.cfg.decode_finished_cbk = decode_finished_cbk;
|
7319ea36
Hu Chunming
多显卡设置
|
170
|
config.cfg.force_tcp = true;
|
3d2ab595
Hu Chunming
支持gb28181
|
171
|
config.dec_type = DECODER_TYPE_FFMPEG;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
172
|
|
372e629f
ming
gb28181支持TCP数据流
|
173
|
config.cfg.gpuid = gpu_id;
|
a2b7fd92
ming
测试代码优化
|
174
175
|
// if (index % 2 == 0)
// {
|
3d2ab595
Hu Chunming
支持gb28181
|
176
|
// config.cfg.gpuid = "0";
|
a2b7fd92
ming
测试代码优化
|
177
178
179
180
181
|
// }
// else
// {
// config.cfg.gpuid = "0";
// }
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
182
|
|
3d2ab595
Hu Chunming
支持gb28181
|
183
184
|
AbstractDecoder* decoder = pDecManager->createDecoder(config);
if (!decoder)
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
185
|
{
|
3d2ab595
Hu Chunming
支持gb28181
|
186
|
return ;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
187
|
}
|
3d2ab595
Hu Chunming
支持gb28181
|
188
189
190
191
192
|
pDecManager->setPostDecArg(config.name, decoder);
pDecManager->setFinishedDecArg(config.name, decoder);
pDecManager->startDecodeByName(config.name);
}
|
372e629f
ming
gb28181支持TCP数据流
|
193
|
void createGB28181Decode(int index, char* gpu_id, int port){
|
3d2ab595
Hu Chunming
支持gb28181
|
194
195
196
197
198
199
|
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
MgrDecConfig config;
config.name = "dec" + to_string(index);
config.cfg.uri = config.name;
config.cfg.post_decoded_cbk = postDecoded;
config.cfg.decode_finished_cbk = decode_finished_cbk;
|
372e629f
ming
gb28181支持TCP数据流
|
200
|
config.cfg.request_stream_cbk = decode_request_stream_cbk;
|
3d2ab595
Hu Chunming
支持gb28181
|
201
202
203
|
config.cfg.force_tcp = true;
config.dec_type = DECODER_TYPE_GB28181;
|
372e629f
ming
gb28181支持TCP数据流
|
204
|
config.cfg.port = port;//allocRtpPort();
|
3d2ab595
Hu Chunming
支持gb28181
|
205
|
|
372e629f
ming
gb28181支持TCP数据流
|
206
|
config.cfg.gpuid = gpu_id;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
207
|
|
3d2ab595
Hu Chunming
支持gb28181
|
208
|
AbstractDecoder* decoder = pDecManager->createDecoder(config);
|
7319ea36
Hu Chunming
多显卡设置
|
209
210
|
if (!decoder)
{
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
211
|
return ;
|
7319ea36
Hu Chunming
多显卡设置
|
212
|
}
|
3d2ab595
Hu Chunming
支持gb28181
|
213
214
|
pDecManager->setPostDecArg(config.name, decoder);
pDecManager->setFinishedDecArg(config.name, decoder);
|
7319ea36
Hu Chunming
多显卡设置
|
215
|
pDecManager->startDecodeByName(config.name);
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
216
217
|
}
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
void createDvppDecoder(int index, char* devId, int channelId){
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
MgrDecConfig config;
config.name = "dec" + to_string(index);
config.cfg.uri = test_uri;
config.cfg.post_decoded_cbk = postDecoded;
config.cfg.decode_finished_cbk = decode_finished_cbk;
config.cfg.force_tcp = true;
config.dec_type = DECODER_TYPE_DVPP;
config.cfg.gpuid = devId;
AbstractDecoder* decoder = pDecManager->createDecoder(config);
if (!decoder)
{
|
d248da62
Hu Chunming
优化代码,修正dvpp的一些bug
|
233
|
cout << "创建解码器失败" << endl;
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
234
235
236
237
238
239
240
|
return ;
}
pDecManager->setPostDecArg(config.name, decoder);
pDecManager->setFinishedDecArg(config.name, decoder);
pDecManager->startDecodeByName(config.name);
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
241
242
243
244
245
246
|
void logFF(void *, int level, const char *fmt, va_list ap)
{
vfprintf(stdout, fmt, ap);
}
|
2b980c5a
ming
优化代码
|
247
248
|
int main(int argc, char* argv[]){
|
d248da62
Hu Chunming
优化代码,修正dvpp的一些bug
|
249
|
// test_uri = argv[1];
|
372e629f
ming
gb28181支持TCP数据流
|
250
251
252
|
char* gpuid = argv[2];
int port = atoi(argv[3]);
cout << test_uri << " gpu_id:" << gpuid << " port:" << port << endl;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
253
|
|
3c7e3e11
Hu Chunming
1.修改日志
|
254
255
|
// av_log_set_callback(&logFF);
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
256
|
// CheckCUDAProperty(atoi(gpuid));
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
257
|
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
258
259
260
261
|
pthread_t m_decode_thread;
pthread_create(&m_decode_thread,0,
[](void* arg)
{
|
a2b7fd92
ming
测试代码优化
|
262
|
// cudaSetDevice(atoi(gpuid));
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
263
264
|
while (true)
{
|
d248da62
Hu Chunming
优化代码,修正dvpp的一些bug
|
265
|
std::this_thread::sleep_for(std::chrono::seconds(10));
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
266
267
|
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
int count = pDecManager->count();
|
92989af0
ming
更新解码器
|
268
|
cout << "当前时间:" << UtilTools::get_cur_time_ms() << " 当前运行路数: " << pDecManager->count() << endl;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
269
270
271
272
273
274
|
}
return (void*)0;
}
,nullptr);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
275
|
|
3d2ab595
Hu Chunming
支持gb28181
|
276
277
|
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
int i = 0;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
278
|
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
279
|
createDvppDecoder(i, gpuid, 0);
|
6042f34b
Hu Chunming
代码优化
|
280
|
i++;
|
d248da62
Hu Chunming
优化代码,修正dvpp的一些bug
|
281
282
283
284
285
286
287
288
|
createDvppDecoder(i, gpuid, 0);
i++;
createDvppDecoder(i, gpuid, 0);
i++;
for(;i<30;i++){
createDvppDecoder(i, gpuid, 0);
}
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
289
|
|
3d2ab595
Hu Chunming
支持gb28181
|
290
291
292
293
294
295
296
|
while (true)
{
int ch = getchar();
if (ch == 'q')
{
break;
}
|
aac5773f
hucm
功能基本完成,接口待打磨
|
297
|
|
3d2ab595
Hu Chunming
支持gb28181
|
298
299
300
301
|
switch (ch)
{
case 'f':
case 'F':
|
372e629f
ming
gb28181支持TCP数据流
|
302
|
createDecode(i, gpuid);
|
3d2ab595
Hu Chunming
支持gb28181
|
303
304
305
306
|
i++;
break;
case 'g':
case 'G':
|
372e629f
ming
gb28181支持TCP数据流
|
307
|
createGB28181Decode(i, gpuid, port);
|
3d2ab595
Hu Chunming
支持gb28181
|
308
309
|
i++;
break;
|
63e6f7bc
Hu Chunming
完成dvpp。但是nv和gb281...
|
310
311
312
313
314
|
case 'd':
case 'D':
createDvppDecoder(i, gpuid, 0);
i++;
break;
|
3d2ab595
Hu Chunming
支持gb28181
|
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
|
case 'r':
case 'R':
pDecManager->resumeDecoder("dec0");
break;
case 'p':
case 'P':
pDecManager->pauseDecoder("dec0");
break;
case 'c':
case 'C':
i--;
pDecManager->closeDecoderByName("dec" + to_string(i));
break;
case 'i':
case 'I':
{
int w,h;
pDecManager->getResolution("dec0", w,h);
printf( "%s : %dx%d\n", "dec0" , w,h );
}
break;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
338
|
|
3d2ab595
Hu Chunming
支持gb28181
|
339
340
341
|
default:
break;
}
|
aac5773f
hucm
功能基本完成,接口待打磨
|
342
|
|
3d2ab595
Hu Chunming
支持gb28181
|
343
344
|
/* code */
}
|
aac5773f
hucm
功能基本完成,接口待打磨
|
345
|
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
346
|
cout << "总共帧数:" << sum << endl;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
347
348
|
pDecManager->closeAllDecoder();
}
|