aac5773f
hucm
功能基本完成,接口待打磨
|
1
2
3
|
#include "FFNvDecoderManager.h"
#include <iostream>
|
e41a52bb
Hu Chunming
1.优化数据读取线程;2. 添加A...
|
4
5
6
7
|
#include "cuda_kernels.h"
#include "NvJpegEncoder.h"
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
8
9
10
11
12
|
#include <pthread.h>
#include <thread>
#include <chrono>
|
e65720d4
Hu Chunming
优化demo
|
13
14
15
16
17
18
|
unsigned char *pHwRgb[2] = {nullptr, nullptr};
int sum1 = 0;
int sum2 = 0;
cudaStream_t stream[2];
|
e41a52bb
Hu Chunming
1.优化数据读取线程;2. 添加A...
|
19
|
|
a2b7fd92
ming
测试代码优化
|
20
21
22
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
76
77
78
79
80
81
82
83
84
85
86
87
|
string data_home = "/mnt/data/cmhu/FFNvDecoder/data/";
#define checkCudaErrors(S) do {CUresult status; \
status = S; \
if (status != CUDA_SUCCESS ) std::cout << __LINE__ <<" checkCudaErrors - status = " << status << std::endl; \
} while (false)
static void gpu_helper(int gpuid)
{
cudaSetDevice(gpuid);
// int *dn;
// cudaMalloc((void **)&dn, 1 * sizeof(int));
size_t free_byte;
size_t total_byte;
CUresult cuda_status = cuMemGetInfo(&free_byte, &total_byte);
const char *pStr = nullptr;
if (CUDA_SUCCESS != cuda_status) {
cuGetErrorString(cuda_status, &pStr);
printf("Error: cudaMemGetInfo fails, %s \n", pStr);
return;
}
double free_db = (double)free_byte;
double total_db = (double)total_byte;
double used_db_1 = (total_db - free_db) / 1024.0 / 1024.0;
std::cout <<"显存已使用 " << used_db_1 << " MB\n";
// cudaFree(dn);
}
int CheckCUDAProperty( int devId )
{
cuInit(0);
CUdevice dev = devId;
size_t memSize = 0;
char devName[256] = {0};
int major = 0, minor = 0;
CUresult rlt = CUDA_SUCCESS;
rlt = cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);
checkCudaErrors( rlt );
rlt = cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);
checkCudaErrors( rlt );
rlt = cuDeviceGetName( devName, sizeof( devName ), dev );
checkCudaErrors( rlt );
printf( "Using GPU Device %d: %s has SM %d.%d compute capability\n",
dev, devName, major, minor );
rlt = cuDeviceTotalMem( &memSize, dev );
checkCudaErrors( rlt );
printf( "Total amount of global memory: %4.4f MB\n",
(float)memSize / ( 1024 * 1024 ) );
return 0;
}
|
0b43216c
Hu Chunming
添加重要注释
|
88
89
90
|
/**
* 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
* */
|
aac5773f
hucm
功能基本完成,接口待打磨
|
91
|
void postDecoded(const void * userPtr, AVFrame * gpuFrame){
|
a2b7fd92
ming
测试代码优化
|
92
|
|
aac5773f
hucm
功能基本完成,接口待打磨
|
93
94
95
|
FFNvDecoder* decoder = (FFNvDecoder*)userPtr;
if (decoder!= nullptr)
{
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
96
97
|
// cout << "decode name: " << decoder->getName() << endl;
|
e65720d4
Hu Chunming
优化demo
|
98
99
100
101
102
103
104
105
106
107
108
109
110
|
// const char* gpu_pixfmt = av_get_pix_fmt_name((AVPixelFormat)gpuFrame->format);
// cout << "pixfmt: " << gpu_pixfmt << endl;
// cout << "keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
// cout << "decode successed ✿✿ヽ(°▽°)ノ✿ " << endl;
int sum = sum1;
if (decoder->getName() == "dec1")
{
sum1 ++ ;
sum = sum1;
if (gpuFrame->format == AV_PIX_FMT_CUDA)
{
|
a2b7fd92
ming
测试代码优化
|
111
|
// cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
|
e65720d4
Hu Chunming
优化demo
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
cudaError_t cudaStatus;
if(pHwRgb[0] == nullptr){
// cudaStreamCreate(&stream[0]);
cuda_common::setColorSpace2( ITU709, 0 );
cudaStatus = cudaMalloc((void **)&pHwRgb[0], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
}
cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[0], gpuFrame->width, gpuFrame->height);
cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
cout << "CUDAToBGR failed !!!" << endl;
return;
}
|
a2b7fd92
ming
测试代码优化
|
126
|
string path = data_home + decoder->getName() + ".jpg";
|
e65720d4
Hu Chunming
优化demo
|
127
128
129
130
131
132
133
134
135
|
saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]); // 验证 CUDAToRGB
}
} else if (decoder->getName() == "dec2")
{
sum2 ++ ;
sum = sum2;
if (gpuFrame->format == AV_PIX_FMT_CUDA)
{
|
a2b7fd92
ming
测试代码优化
|
136
|
// cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
|
e65720d4
Hu Chunming
优化demo
|
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
cudaError_t cudaStatus;
if(pHwRgb[1] == nullptr){
// cudaStreamCreate(&stream[1]);
cuda_common::setColorSpace2( ITU709, 0 );
cudaStatus = cudaMalloc((void **)&pHwRgb[1], 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
}
cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb[1], gpuFrame->width, gpuFrame->height);
cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
cout << "CUDAToBGR failed !!!" << endl;
return;
}
|
a2b7fd92
ming
测试代码优化
|
151
|
string path = data_home + decoder->getName() + ".jpg";
|
e65720d4
Hu Chunming
优化demo
|
152
153
154
|
saveJpeg(path.c_str(), pHwRgb[1], gpuFrame->width, gpuFrame->height, stream[1]); // 验证 CUDAToRGB
}
}
|
aac5773f
hucm
功能基本完成,接口待打磨
|
155
156
157
|
}
}
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
158
159
160
161
162
163
|
long start_time = 0;
long end_time = 0;
bool count_flag = false;
int count = 0;
int count_std = 100;
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
164
|
static long long get_cur_time(){
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
165
|
// 获取操作系统当前时间点(精确到微秒)
|
6fc86385
ming
代码优化
|
166
167
|
chrono::time_point<chrono::system_clock, chrono::milliseconds> tpMicro
= chrono::time_point_cast<chrono::milliseconds>(chrono::system_clock::now());
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
168
|
// (微秒精度的)时间点 => (微秒精度的)时间戳
|
6fc86385
ming
代码优化
|
169
|
return tpMicro.time_since_epoch().count();
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
170
171
|
}
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
172
|
static int sum = 0;
|
e65720d4
Hu Chunming
优化demo
|
173
174
|
unsigned char *pHwData = nullptr;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
175
|
void postDecoded0(const void * userPtr, AVFrame * gpuFrame){
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
176
177
|
// std::this_thread::sleep_for(std::chrono::milliseconds(30000));
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
FFNvDecoder* decoder = (FFNvDecoder*)userPtr;
if (decoder!= nullptr)
{
// cout << "decode name: " << decoder->getName() << endl;
if (decoder->getName() == "dec")
{
if (! count_flag)
{
count_flag = true;
count = 0;
end_time = start_time = get_cur_time();
}
count++;
sum ++ ;
|
0a826b3d
Hu Chunming
适应WSL的修改
|
192
193
194
195
196
197
|
if (count >= count_std)
{
// end_time = get_cur_time();
// 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;
|
a2b7fd92
ming
测试代码优化
|
198
199
|
cout << decoder->getName() << " keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
// cout << gpuFrame->pts << endl;
|
0a826b3d
Hu Chunming
适应WSL的修改
|
200
201
202
|
count_flag = false;
}
|
a2b7fd92
ming
测试代码优化
|
203
|
// cout << "帧数:" << sum << endl;
|
0a826b3d
Hu Chunming
适应WSL的修改
|
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
if (gpuFrame->format == AV_PIX_FMT_CUDA)
{
cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
// cout << "gpu id : " << decoder->m_cfg.gpuid.c_str() << endl;
cudaError_t cudaStatus;
if(pHwData == nullptr){
cuda_common::setColorSpace2( ITU709, 0 );
cudaStatus = cudaMalloc((void **)&pHwData, 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
}
cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwData, gpuFrame->width, gpuFrame->height);
cudaDeviceSynchronize();
if (cudaStatus != cudaSuccess) {
cout << "CUDAToBGR failed !!!" << endl;
return;
}
|
a2b7fd92
ming
测试代码优化
|
221
|
string path = data_home + decoder->getName() + ".jpg";
|
0a826b3d
Hu Chunming
适应WSL的修改
|
222
223
|
saveJpeg(path.c_str(), pHwData, gpuFrame->width, gpuFrame->height, nullptr); // 验证 CUDAToRGB
}
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
224
225
226
227
|
}
}
}
|
6fc86385
ming
代码优化
|
228
229
230
231
|
void decode_finished_cbk(const void* userPtr){
cout << "decode_finish timestamp: " << get_cur_time() << endl;
}
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
232
|
// string test_uri = "rtmp://192.168.10.56:1935/objecteye/1";
|
e65720d4
Hu Chunming
优化demo
|
233
|
// string test_uri = "/home/cmhu/data/output_800x480.mp4";
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
234
235
|
// string test_uri = "/home/cmhu/data/output_1920x1080.mp4";
// string test_uri = "rtsp://176.10.0.2:8554/stream";
|
d384f0e9
Hu Chunming
代码优化
|
236
237
|
// string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
string test_uri = "rtsp://176.10.0.4:8554/stream";
|
a2b7fd92
ming
测试代码优化
|
238
|
char* gpuid = "0";
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
239
|
|
a2b7fd92
ming
测试代码优化
|
240
|
void createDecode(int index, const char* gpu_id){
|
aac5773f
hucm
功能基本完成,接口待打磨
|
241
|
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
|
7319ea36
Hu Chunming
多显卡设置
|
242
|
MgrDecConfig config;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
243
|
config.name = "dec" + to_string(index);
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
244
|
config.cfg.uri = test_uri;
|
7319ea36
Hu Chunming
多显卡设置
|
245
|
config.cfg.post_decoded_cbk = postDecoded;
|
6fc86385
ming
代码优化
|
246
|
config.cfg.decode_finished_cbk = decode_finished_cbk;
|
7319ea36
Hu Chunming
多显卡设置
|
247
|
config.cfg.force_tcp = true;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
248
|
|
a2b7fd92
ming
测试代码优化
|
249
250
251
252
253
254
255
256
257
|
config.cfg.gpuid = gpu_id;
// if (index % 2 == 0)
// {
// config.cfg.gpuid = gpu_id;
// }
// else
// {
// config.cfg.gpuid = "0";
// }
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
258
|
|
7319ea36
Hu Chunming
多显卡设置
|
259
260
261
|
FFNvDecoder* decoder = pDecManager->createDecoder(config);
if (!decoder)
{
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
262
|
return ;
|
7319ea36
Hu Chunming
多显卡设置
|
263
264
265
|
}
pDecManager->setUserPtr(config.name, decoder);
pDecManager->startDecodeByName(config.name);
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
266
267
|
}
|
3c7e3e11
Hu Chunming
1.修改日志
|
268
269
270
271
272
273
|
void logFF(void *, int level, const char *fmt, va_list ap)
{
vfprintf(stdout, fmt, ap);
}
|
2b980c5a
ming
优化代码
|
274
275
276
|
int main(int argc, char* argv[]){
test_uri = argv[1];
|
a2b7fd92
ming
测试代码优化
|
277
|
gpuid = argv[2];
|
2b980c5a
ming
优化代码
|
278
|
cout << test_uri << endl;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
279
|
|
3c7e3e11
Hu Chunming
1.修改日志
|
280
281
|
// av_log_set_callback(&logFF);
|
a2b7fd92
ming
测试代码优化
|
282
|
CheckCUDAProperty(atoi(gpuid));
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
283
|
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
284
|
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
|
7319ea36
Hu Chunming
多显卡设置
|
285
|
|
a2b7fd92
ming
测试代码优化
|
286
|
// int count = 4;
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
287
288
|
// for (size_t i = 0; i < count ; i++)
// {
|
a2b7fd92
ming
测试代码优化
|
289
|
// createDecode(i, gpuid);
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
290
|
// }
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
291
292
|
MgrDecConfig config;
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
293
294
295
|
config.name = "dec";
config.cfg.uri = test_uri;
config.cfg.post_decoded_cbk = postDecoded0;
|
6fc86385
ming
代码优化
|
296
|
config.cfg.decode_finished_cbk = decode_finished_cbk;
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
297
|
config.cfg.force_tcp = true;
|
a2b7fd92
ming
测试代码优化
|
298
|
config.cfg.gpuid = gpuid;
|
7319ea36
Hu Chunming
多显卡设置
|
299
|
FFNvDecoder* dec2 = pDecManager->createDecoder(config);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
300
301
302
303
|
if (!dec2)
{
return 1;
}
|
7319ea36
Hu Chunming
多显卡设置
|
304
|
pDecManager->setUserPtr(config.name, dec2);
|
0a826b3d
Hu Chunming
适应WSL的修改
|
305
|
// pDecManager->setDecKeyframe(config.name, true);
|
7319ea36
Hu Chunming
多显卡设置
|
306
307
|
pDecManager->startDecodeByName(config.name);
|
d384f0e9
Hu Chunming
代码优化
|
308
309
310
311
|
int w,h;
pDecManager->getResolution(config.name, w,h);
printf( "%s : %dx%d\n", config.name.c_str() , w,h );
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
312
313
314
315
|
pthread_t m_decode_thread;
pthread_create(&m_decode_thread,0,
[](void* arg)
{
|
a2b7fd92
ming
测试代码优化
|
316
|
// cudaSetDevice(atoi(gpuid));
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
317
318
319
320
321
|
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
int count = pDecManager->count();
|
a2b7fd92
ming
测试代码优化
|
322
323
|
cout << "当前时间戳:" << get_cur_time() << " 当前运行路数:" << pDecManager->count() << endl;
// gpu_helper(atoi(gpuid));
|
f40cc409
Hu Chunming
优化显存占用。当前在3080显卡上...
|
324
325
326
327
328
329
330
331
332
333
|
if (count <= 0)
{
break;
}
}
return (void*)0;
}
,nullptr);
|
7319ea36
Hu Chunming
多显卡设置
|
334
|
|
48330793
Hu Chunming
修正解码线程自然结束时解码器内存没...
|
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
|
// config.name = "dec0";
// config.cfg.uri = "rtmp://192.168.10.56:1935/objecteye/1";
// config.cfg.gpuid = "0";
// FFNvDecoder* dec0 = pDecManager->createDecoder(config);
// if (!dec0)
// {
// return 1;
// }
// pDecManager->setUserPtr(config.name, dec0);
// pDecManager->startDecodeByName(config.name);
// config.name = "dec01";
// config.cfg.uri = "rtmp://192.168.10.56:1935/objecteye/1";
// config.cfg.gpuid = "0";
// FFNvDecoder* dec01 = pDecManager->createDecoder(config);
// if (!dec01)
// {
// return 1;
// }
// pDecManager->setUserPtr(config.name, dec01);
// pDecManager->startDecodeByName(config.name);
|
aac5773f
hucm
功能基本完成,接口待打磨
|
356
|
|
e41a52bb
Hu Chunming
1.优化数据读取线程;2. 添加A...
|
357
|
// while (getchar() != 'q');
|
aac5773f
hucm
功能基本完成,接口待打磨
|
358
|
|
e41a52bb
Hu Chunming
1.优化数据读取线程;2. 添加A...
|
359
360
361
|
// // pDecManager->closeDecoderByName("dec1");
// // pDecManager->pauseDecoder("dec1");
// pDecManager->pauseDecoder("dec2");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
362
|
|
e41a52bb
Hu Chunming
1.优化数据读取线程;2. 添加A...
|
363
|
// while (getchar() != 'q');
|
aac5773f
hucm
功能基本完成,接口待打磨
|
364
|
|
e41a52bb
Hu Chunming
1.优化数据读取线程;2. 添加A...
|
365
366
|
// // pDecManager->resumeDecoder("dec1");
// pDecManager->resumeDecoder("dec2");
|
aac5773f
hucm
功能基本完成,接口待打磨
|
367
|
|
aac5773f
hucm
功能基本完成,接口待打磨
|
368
369
|
while (getchar() != 'q');
|
bc52e542
Hu Chunming
添加关键帧解码功能
|
370
371
|
cout << "总共帧数:" << sum << endl;
|
aac5773f
hucm
功能基本完成,接口待打磨
|
372
373
|
pDecManager->closeAllDecoder();
}
|