Commit a2b7fd92417c709f1243eb482b13c6c0caf925f0

Authored by ming
1 parent 2b980c5a

测试代码优化

.vscode/launch.json
@@ -6,7 +6,25 @@ @@ -6,7 +6,25 @@
6 "type": "cppdbg", 6 "type": "cppdbg",
7 "request": "launch", 7 "request": "launch",
8 "program": "${workspaceFolder}/bin/lib/test", 8 "program": "${workspaceFolder}/bin/lib/test",
9 - "args": ["rtsp://176.10.0.4:8554/stream","0"], 9 + "args": ["rtsp://122.97.218.170:8604/openUrl/V5nXRHa?params=eyJwcm90b2NhbCI6InJ0c3AiLCJjbGllbnRUeXBlIjoib3Blbl9hcGkiLCJleHByaWVUaW1lIjotMSwicHJvdG9jb2wiOiJydHNwIiwiZXhwaXJlVGltZSI6MzAwLCJlbmFibGVNR0MiOnRydWUsImV4cGFuZCI6InN0YW5kYXJkPXJ0c3Amc3RyZWFtZm9ybT1ydHAiLCJhIjoiMTBjZjM4N2JjY2Y5NDg3YzhjNWYzNjE2M2ViMWUyNTJ8MXwwfDEiLCJ0IjoxfQ==","3"],
  10 + "stopAtEntry": false,
  11 + "cwd": "${workspaceFolder}/bin/lib",
  12 + "environment": [],
  13 + "externalConsole": false,
  14 + "MIMode": "gdb",
  15 + "setupCommands": [
  16 + {
  17 + "description": "Enable pretty-printing for gdb",
  18 + "text": "-enable-pretty-printing",
  19 + "ignoreFailures": true
  20 + }
  21 + ]
  22 + },{
  23 + "name": "ffmpeg",
  24 + "type": "cppdbg",
  25 + "request": "launch",
  26 + "program": "${workspaceFolder}/bin/lib/ffmpeg_g",
  27 + "args": ["-vsync","0","-hwaccel","cuvid","-hwaccel_device","1","-c:v","h264_cuvid","-i","rtmp://192.168.10.56:1935/objecteye/116","-c:a","copy","-vf","scale_npp=800:480","-c:v","h264","/mnt/data/cmhu/FFNvDecoder/data/output1.mp4"],
10 "stopAtEntry": false, 28 "stopAtEntry": false,
11 "cwd": "${workspaceFolder}/bin/lib", 29 "cwd": "${workspaceFolder}/bin/lib",
12 "environment": [], 30 "environment": [],
src/Makefile
1 -  
2 XX = g++ 1 XX = g++
3 -NVCC = nvcc 2 +
  3 +CUDA_ROOT = /usr/local/cuda-11.1
  4 +NVCC = $(CUDA_ROOT)/bin/nvcc
4 5
5 6
6 PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder 7 PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder
7 8
8 DEPEND_DIR = $(PROJECT_ROOT)/bin 9 DEPEND_DIR = $(PROJECT_ROOT)/bin
9 SRC_ROOT = $(PROJECT_ROOT)/src 10 SRC_ROOT = $(PROJECT_ROOT)/src
10 -CUDA_ROOT = /usr/local/cuda-11.1  
11 11
12 TARGET= $(DEPEND_DIR)/lib/test 12 TARGET= $(DEPEND_DIR)/lib/test
13 13
14 -  
15 INCLUDE= -I $(DEPEND_DIR)/include \ 14 INCLUDE= -I $(DEPEND_DIR)/include \
16 -I $(CUDA_ROOT)/include \ 15 -I $(CUDA_ROOT)/include \
17 -I $(SRC_ROOT)/common/inc \ 16 -I $(SRC_ROOT)/common/inc \
@@ -19,7 +18,8 @@ INCLUDE= -I $(DEPEND_DIR)/include \ @@ -19,7 +18,8 @@ INCLUDE= -I $(DEPEND_DIR)/include \
19 -I $(SRC_ROOT)\ 18 -I $(SRC_ROOT)\
20 19
21 LIBSPATH= -L $(DEPEND_DIR)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \ 20 LIBSPATH= -L $(DEPEND_DIR)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \
22 - -L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid -lcurand -lcublas -lnvjpeg \ 21 + -L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid \
  22 + -L $(CUDA_ROOT)/lib64/stubs -lcurand -lcublas -lnvjpeg \
23 23
24 CFLAGS= -g -fPIC -O0 $(INCLUDE) -pthread -lrt -lz -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl 24 CFLAGS= -g -fPIC -O0 $(INCLUDE) -pthread -lrt -lz -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
25 # -DUNICODE -D_UNICODE 25 # -DUNICODE -D_UNICODE
@@ -47,6 +47,4 @@ $(TARGET):$(OBJS) $(CU_OBJS) @@ -47,6 +47,4 @@ $(TARGET):$(OBJS) $(CU_OBJS)
47 $(NVCC) $(NFLAGS) -o $@ $< 47 $(NVCC) $(NFLAGS) -o $@ $<
48 48
49 clean: 49 clean:
50 - rm -f *.o $(TARGET)  
51 -  
52 - 50 + rm -f *.o $(TARGET)
53 \ No newline at end of file 51 \ No newline at end of file
src/main.cpp
@@ -17,10 +17,79 @@ int sum2 = 0; @@ -17,10 +17,79 @@ int sum2 = 0;
17 17
18 cudaStream_t stream[2]; 18 cudaStream_t stream[2];
19 19
  20 +string data_home = "/mnt/data/cmhu/FFNvDecoder/data/";
  21 +
  22 +
  23 +#define checkCudaErrors(S) do {CUresult status; \
  24 + status = S; \
  25 + if (status != CUDA_SUCCESS ) std::cout << __LINE__ <<" checkCudaErrors - status = " << status << std::endl; \
  26 + } while (false)
  27 +
  28 +
  29 +static void gpu_helper(int gpuid)
  30 +{
  31 + cudaSetDevice(gpuid);
  32 +
  33 + // int *dn;
  34 + // cudaMalloc((void **)&dn, 1 * sizeof(int));
  35 +
  36 + size_t free_byte;
  37 + size_t total_byte;
  38 +
  39 + CUresult cuda_status = cuMemGetInfo(&free_byte, &total_byte);
  40 +
  41 + const char *pStr = nullptr;
  42 + if (CUDA_SUCCESS != cuda_status) {
  43 + cuGetErrorString(cuda_status, &pStr);
  44 + printf("Error: cudaMemGetInfo fails, %s \n", pStr);
  45 + return;
  46 + }
  47 +
  48 + double free_db = (double)free_byte;
  49 + double total_db = (double)total_byte;
  50 + double used_db_1 = (total_db - free_db) / 1024.0 / 1024.0;
  51 +
  52 + std::cout <<"显存已使用 " << used_db_1 << " MB\n";
  53 +
  54 + // cudaFree(dn);
  55 +}
  56 +
  57 +int CheckCUDAProperty( int devId )
  58 +{
  59 + cuInit(0);
  60 +
  61 + CUdevice dev = devId;
  62 + size_t memSize = 0;
  63 + char devName[256] = {0};
  64 + int major = 0, minor = 0;
  65 + CUresult rlt = CUDA_SUCCESS;
  66 +
  67 + rlt = cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);
  68 + checkCudaErrors( rlt );
  69 +
  70 + rlt = cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);
  71 + checkCudaErrors( rlt );
  72 +
  73 + rlt = cuDeviceGetName( devName, sizeof( devName ), dev );
  74 + checkCudaErrors( rlt );
  75 +
  76 + printf( "Using GPU Device %d: %s has SM %d.%d compute capability\n",
  77 + dev, devName, major, minor );
  78 +
  79 + rlt = cuDeviceTotalMem( &memSize, dev );
  80 + checkCudaErrors( rlt );
  81 +
  82 + printf( "Total amount of global memory: %4.4f MB\n",
  83 + (float)memSize / ( 1024 * 1024 ) );
  84 +
  85 + return 0;
  86 +}
  87 +
20 /** 88 /**
21 * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况 89 * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
22 * */ 90 * */
23 void postDecoded(const void * userPtr, AVFrame * gpuFrame){ 91 void postDecoded(const void * userPtr, AVFrame * gpuFrame){
  92 +
24 FFNvDecoder* decoder = (FFNvDecoder*)userPtr; 93 FFNvDecoder* decoder = (FFNvDecoder*)userPtr;
25 if (decoder!= nullptr) 94 if (decoder!= nullptr)
26 { 95 {
@@ -39,7 +108,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ @@ -39,7 +108,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
39 108
40 if (gpuFrame->format == AV_PIX_FMT_CUDA) 109 if (gpuFrame->format == AV_PIX_FMT_CUDA)
41 { 110 {
42 - cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl; 111 + // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
43 cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str())); 112 cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
44 cudaError_t cudaStatus; 113 cudaError_t cudaStatus;
45 if(pHwRgb[0] == nullptr){ 114 if(pHwRgb[0] == nullptr){
@@ -54,7 +123,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ @@ -54,7 +123,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
54 return; 123 return;
55 } 124 }
56 125
57 - string path = "/mnt/f/fiss/data/" + decoder->getName() + "/" + to_string(sum) + ".jpg"; 126 + string path = data_home + decoder->getName() + ".jpg";
58 saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]); // 验证 CUDAToRGB 127 saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]); // 验证 CUDAToRGB
59 } 128 }
60 } else if (decoder->getName() == "dec2") 129 } else if (decoder->getName() == "dec2")
@@ -64,7 +133,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ @@ -64,7 +133,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
64 133
65 if (gpuFrame->format == AV_PIX_FMT_CUDA) 134 if (gpuFrame->format == AV_PIX_FMT_CUDA)
66 { 135 {
67 - cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl; 136 + // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl;
68 cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str())); 137 cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
69 cudaError_t cudaStatus; 138 cudaError_t cudaStatus;
70 if(pHwRgb[1] == nullptr){ 139 if(pHwRgb[1] == nullptr){
@@ -79,7 +148,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ @@ -79,7 +148,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
79 return; 148 return;
80 } 149 }
81 150
82 - string path = "/mnt/f/fiss/data/" + decoder->getName() + "/" + to_string(sum) + ".jpg"; 151 + string path = data_home + decoder->getName() + ".jpg";
83 saveJpeg(path.c_str(), pHwRgb[1], gpuFrame->width, gpuFrame->height, stream[1]); // 验证 CUDAToRGB 152 saveJpeg(path.c_str(), pHwRgb[1], gpuFrame->width, gpuFrame->height, stream[1]); // 验证 CUDAToRGB
84 } 153 }
85 } 154 }
@@ -126,12 +195,12 @@ void postDecoded0(const void * userPtr, AVFrame * gpuFrame){ @@ -126,12 +195,12 @@ void postDecoded0(const void * userPtr, AVFrame * gpuFrame){
126 // long time_using = end_time - start_time; 195 // long time_using = end_time - start_time;
127 // double time_per_frame = double(time_using)/count_std ; 196 // double time_per_frame = double(time_using)/count_std ;
128 // cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl; 197 // cout << count_std << "帧用时:" << time_using << "ms 每帧用时:" << time_per_frame << "ms" << endl;
129 - cout << "keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;  
130 - cout << gpuFrame->pts << endl; 198 + cout << decoder->getName() << " keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
  199 + // cout << gpuFrame->pts << endl;
131 200
132 count_flag = false; 201 count_flag = false;
133 } 202 }
134 - cout << "帧数:" << sum << endl; 203 + // cout << "帧数:" << sum << endl;
135 204
136 if (gpuFrame->format == AV_PIX_FMT_CUDA) 205 if (gpuFrame->format == AV_PIX_FMT_CUDA)
137 { 206 {
@@ -149,7 +218,7 @@ void postDecoded0(const void * userPtr, AVFrame * gpuFrame){ @@ -149,7 +218,7 @@ void postDecoded0(const void * userPtr, AVFrame * gpuFrame){
149 return; 218 return;
150 } 219 }
151 220
152 - string path = "/mnt/f/fiss/data/" + to_string(sum) + ".jpg"; 221 + string path = data_home + decoder->getName() + ".jpg";
153 saveJpeg(path.c_str(), pHwData, gpuFrame->width, gpuFrame->height, nullptr); // 验证 CUDAToRGB 222 saveJpeg(path.c_str(), pHwData, gpuFrame->width, gpuFrame->height, nullptr); // 验证 CUDAToRGB
154 } 223 }
155 } 224 }
@@ -166,8 +235,9 @@ void decode_finished_cbk(const void* userPtr){ @@ -166,8 +235,9 @@ void decode_finished_cbk(const void* userPtr){
166 // string test_uri = "rtsp://176.10.0.2:8554/stream"; 235 // string test_uri = "rtsp://176.10.0.2:8554/stream";
167 // string test_uri = "/mnt/f/fiss/test_data/h265.mp4"; 236 // string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
168 string test_uri = "rtsp://176.10.0.4:8554/stream"; 237 string test_uri = "rtsp://176.10.0.4:8554/stream";
  238 +char* gpuid = "0";
169 239
170 -void createDecode(int index){ 240 +void createDecode(int index, const char* gpu_id){
171 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance(); 241 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
172 MgrDecConfig config; 242 MgrDecConfig config;
173 config.name = "dec" + to_string(index); 243 config.name = "dec" + to_string(index);
@@ -176,14 +246,15 @@ void createDecode(int index){ @@ -176,14 +246,15 @@ void createDecode(int index){
176 config.cfg.decode_finished_cbk = decode_finished_cbk; 246 config.cfg.decode_finished_cbk = decode_finished_cbk;
177 config.cfg.force_tcp = true; 247 config.cfg.force_tcp = true;
178 248
179 - if (index % 2 == 0)  
180 - {  
181 - config.cfg.gpuid = "0";  
182 - }  
183 - else  
184 - {  
185 - config.cfg.gpuid = "0";  
186 - } 249 + config.cfg.gpuid = gpu_id;
  250 + // if (index % 2 == 0)
  251 + // {
  252 + // config.cfg.gpuid = gpu_id;
  253 + // }
  254 + // else
  255 + // {
  256 + // config.cfg.gpuid = "0";
  257 + // }
187 258
188 FFNvDecoder* decoder = pDecManager->createDecoder(config); 259 FFNvDecoder* decoder = pDecManager->createDecoder(config);
189 if (!decoder) 260 if (!decoder)
@@ -194,42 +265,6 @@ void createDecode(int index){ @@ -194,42 +265,6 @@ void createDecode(int index){
194 pDecManager->startDecodeByName(config.name); 265 pDecManager->startDecodeByName(config.name);
195 } 266 }
196 267
197 -#define checkCudaErrors(S) do {CUresult status; \  
198 - status = S; \  
199 - if (status != CUDA_SUCCESS ) std::cout << __LINE__ <<" checkCudaErrors - status = " << status << std::endl; \  
200 - } while (false)  
201 -  
202 -int CheckCUDAProperty( int devId )  
203 -{  
204 - cuInit(0);  
205 -  
206 - CUdevice dev = devId;  
207 - size_t memSize = 0;  
208 - char devName[256] = {0};  
209 - int major = 0, minor = 0;  
210 - CUresult rlt = CUDA_SUCCESS;  
211 -  
212 - rlt = cuDeviceGetAttribute(&major, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR, dev);  
213 - checkCudaErrors( rlt );  
214 -  
215 - rlt = cuDeviceGetAttribute(&minor, CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR, dev);  
216 - checkCudaErrors( rlt );  
217 -  
218 - rlt = cuDeviceGetName( devName, sizeof( devName ), dev );  
219 - checkCudaErrors( rlt );  
220 -  
221 - printf( "Using GPU Device %d: %s has SM %d.%d compute capability\n",  
222 - dev, devName, major, minor );  
223 -  
224 - rlt = cuDeviceTotalMem( &memSize, dev );  
225 - checkCudaErrors( rlt );  
226 -  
227 - printf( "Total amount of global memory: %4.4f MB\n",  
228 - (float)memSize / ( 1024 * 1024 ) );  
229 -  
230 - return 0;  
231 -}  
232 -  
233 void logFF(void *, int level, const char *fmt, va_list ap) 268 void logFF(void *, int level, const char *fmt, va_list ap)
234 { 269 {
235 vfprintf(stdout, fmt, ap); 270 vfprintf(stdout, fmt, ap);
@@ -239,18 +274,19 @@ void logFF(void *, int level, const char *fmt, va_list ap) @@ -239,18 +274,19 @@ void logFF(void *, int level, const char *fmt, va_list ap)
239 int main(int argc, char* argv[]){ 274 int main(int argc, char* argv[]){
240 275
241 test_uri = argv[1]; 276 test_uri = argv[1];
  277 + gpuid = argv[2];
242 cout << test_uri << endl; 278 cout << test_uri << endl;
243 279
244 // av_log_set_callback(&logFF); 280 // av_log_set_callback(&logFF);
245 281
246 - CheckCUDAProperty(0); 282 + CheckCUDAProperty(atoi(gpuid));
247 283
248 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance(); 284 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
249 285
250 - // int count = 99; 286 + // int count = 4;
251 // for (size_t i = 0; i < count ; i++) 287 // for (size_t i = 0; i < count ; i++)
252 // { 288 // {
253 - // createDecode(i); 289 + // createDecode(i, gpuid);
254 // } 290 // }
255 291
256 MgrDecConfig config; 292 MgrDecConfig config;
@@ -259,7 +295,7 @@ int main(int argc, char* argv[]){ @@ -259,7 +295,7 @@ int main(int argc, char* argv[]){
259 config.cfg.post_decoded_cbk = postDecoded0; 295 config.cfg.post_decoded_cbk = postDecoded0;
260 config.cfg.decode_finished_cbk = decode_finished_cbk; 296 config.cfg.decode_finished_cbk = decode_finished_cbk;
261 config.cfg.force_tcp = true; 297 config.cfg.force_tcp = true;
262 - config.cfg.gpuid = "0"; 298 + config.cfg.gpuid = gpuid;
263 FFNvDecoder* dec2 = pDecManager->createDecoder(config); 299 FFNvDecoder* dec2 = pDecManager->createDecoder(config);
264 if (!dec2) 300 if (!dec2)
265 { 301 {
@@ -277,12 +313,14 @@ int main(int argc, char* argv[]){ @@ -277,12 +313,14 @@ int main(int argc, char* argv[]){
277 pthread_create(&m_decode_thread,0, 313 pthread_create(&m_decode_thread,0,
278 [](void* arg) 314 [](void* arg)
279 { 315 {
  316 + // cudaSetDevice(atoi(gpuid));
280 while (true) 317 while (true)
281 { 318 {
282 std::this_thread::sleep_for(std::chrono::milliseconds(5000)); 319 std::this_thread::sleep_for(std::chrono::milliseconds(5000));
283 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance(); 320 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
284 int count = pDecManager->count(); 321 int count = pDecManager->count();
285 - cout << "当前运行路数: " << pDecManager->count() << endl; 322 + cout << "当前时间戳:" << get_cur_time() << " 当前运行路数:" << pDecManager->count() << endl;
  323 + // gpu_helper(atoi(gpuid));
286 if (count <= 0) 324 if (count <= 0)
287 { 325 {
288 break; 326 break;