Commit a2b7fd92417c709f1243eb482b13c6c0caf925f0

Authored by ming
1 parent 2b980c5a

测试代码优化

.vscode/launch.json
... ... @@ -6,7 +6,25 @@
6 6 "type": "cppdbg",
7 7 "request": "launch",
8 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 28 "stopAtEntry": false,
11 29 "cwd": "${workspaceFolder}/bin/lib",
12 30 "environment": [],
... ...
src/Makefile
1   -
2 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 7 PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder
7 8  
8 9 DEPEND_DIR = $(PROJECT_ROOT)/bin
9 10 SRC_ROOT = $(PROJECT_ROOT)/src
10   -CUDA_ROOT = /usr/local/cuda-11.1
11 11  
12 12 TARGET= $(DEPEND_DIR)/lib/test
13 13  
14   -
15 14 INCLUDE= -I $(DEPEND_DIR)/include \
16 15 -I $(CUDA_ROOT)/include \
17 16 -I $(SRC_ROOT)/common/inc \
... ... @@ -19,7 +18,8 @@ INCLUDE= -I $(DEPEND_DIR)/include \
19 18 -I $(SRC_ROOT)\
20 19  
21 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 24 CFLAGS= -g -fPIC -O0 $(INCLUDE) -pthread -lrt -lz -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl
25 25 # -DUNICODE -D_UNICODE
... ... @@ -47,6 +47,4 @@ $(TARGET):$(OBJS) $(CU_OBJS)
47 47 $(NVCC) $(NFLAGS) -o $@ $<
48 48  
49 49 clean:
50   - rm -f *.o $(TARGET)
51   -
52   -
  50 + rm -f *.o $(TARGET)
53 51 \ No newline at end of file
... ...
src/main.cpp
... ... @@ -17,10 +17,79 @@ int sum2 = 0;
17 17  
18 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 89 * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况
22 90 * */
23 91 void postDecoded(const void * userPtr, AVFrame * gpuFrame){
  92 +
24 93 FFNvDecoder* decoder = (FFNvDecoder*)userPtr;
25 94 if (decoder!= nullptr)
26 95 {
... ... @@ -39,7 +108,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
39 108  
40 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 112 cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
44 113 cudaError_t cudaStatus;
45 114 if(pHwRgb[0] == nullptr){
... ... @@ -54,7 +123,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
54 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 127 saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]); // 验证 CUDAToRGB
59 128 }
60 129 } else if (decoder->getName() == "dec2")
... ... @@ -64,7 +133,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
64 133  
65 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 137 cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str()));
69 138 cudaError_t cudaStatus;
70 139 if(pHwRgb[1] == nullptr){
... ... @@ -79,7 +148,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){
79 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 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 195 // long time_using = end_time - start_time;
127 196 // double time_per_frame = double(time_using)/count_std ;
128 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 201 count_flag = false;
133 202 }
134   - cout << "帧数:" << sum << endl;
  203 + // cout << "帧数:" << sum << endl;
135 204  
136 205 if (gpuFrame->format == AV_PIX_FMT_CUDA)
137 206 {
... ... @@ -149,7 +218,7 @@ void postDecoded0(const void * userPtr, AVFrame * gpuFrame){
149 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 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 235 // string test_uri = "rtsp://176.10.0.2:8554/stream";
167 236 // string test_uri = "/mnt/f/fiss/test_data/h265.mp4";
168 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 241 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
172 242 MgrDecConfig config;
173 243 config.name = "dec" + to_string(index);
... ... @@ -176,14 +246,15 @@ void createDecode(int index){
176 246 config.cfg.decode_finished_cbk = decode_finished_cbk;
177 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 259 FFNvDecoder* decoder = pDecManager->createDecoder(config);
189 260 if (!decoder)
... ... @@ -194,42 +265,6 @@ void createDecode(int index){
194 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 268 void logFF(void *, int level, const char *fmt, va_list ap)
234 269 {
235 270 vfprintf(stdout, fmt, ap);
... ... @@ -239,18 +274,19 @@ void logFF(void *, int level, const char *fmt, va_list ap)
239 274 int main(int argc, char* argv[]){
240 275  
241 276 test_uri = argv[1];
  277 + gpuid = argv[2];
242 278 cout << test_uri << endl;
243 279  
244 280 // av_log_set_callback(&logFF);
245 281  
246   - CheckCUDAProperty(0);
  282 + CheckCUDAProperty(atoi(gpuid));
247 283  
248 284 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
249 285  
250   - // int count = 99;
  286 + // int count = 4;
251 287 // for (size_t i = 0; i < count ; i++)
252 288 // {
253   - // createDecode(i);
  289 + // createDecode(i, gpuid);
254 290 // }
255 291  
256 292 MgrDecConfig config;
... ... @@ -259,7 +295,7 @@ int main(int argc, char* argv[]){
259 295 config.cfg.post_decoded_cbk = postDecoded0;
260 296 config.cfg.decode_finished_cbk = decode_finished_cbk;
261 297 config.cfg.force_tcp = true;
262   - config.cfg.gpuid = "0";
  298 + config.cfg.gpuid = gpuid;
263 299 FFNvDecoder* dec2 = pDecManager->createDecoder(config);
264 300 if (!dec2)
265 301 {
... ... @@ -277,12 +313,14 @@ int main(int argc, char* argv[]){
277 313 pthread_create(&m_decode_thread,0,
278 314 [](void* arg)
279 315 {
  316 + // cudaSetDevice(atoi(gpuid));
280 317 while (true)
281 318 {
282 319 std::this_thread::sleep_for(std::chrono::milliseconds(5000));
283 320 FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
284 321 int count = pDecManager->count();
285   - cout << "当前运行路数: " << pDecManager->count() << endl;
  322 + cout << "当前时间戳:" << get_cur_time() << " 当前运行路数:" << pDecManager->count() << endl;
  323 + // gpu_helper(atoi(gpuid));
286 324 if (count <= 0)
287 325 {
288 326 break;
... ...