diff --git a/.vscode/launch.json b/.vscode/launch.json index 51b59bd..7c7f5cc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,25 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/bin/lib/test", - "args": ["rtsp://176.10.0.4:8554/stream","0"], + "args": ["rtsp://122.97.218.170:8604/openUrl/V5nXRHa?params=eyJwcm90b2NhbCI6InJ0c3AiLCJjbGllbnRUeXBlIjoib3Blbl9hcGkiLCJleHByaWVUaW1lIjotMSwicHJvdG9jb2wiOiJydHNwIiwiZXhwaXJlVGltZSI6MzAwLCJlbmFibGVNR0MiOnRydWUsImV4cGFuZCI6InN0YW5kYXJkPXJ0c3Amc3RyZWFtZm9ybT1ydHAiLCJhIjoiMTBjZjM4N2JjY2Y5NDg3YzhjNWYzNjE2M2ViMWUyNTJ8MXwwfDEiLCJ0IjoxfQ==","3"], + "stopAtEntry": false, + "cwd": "${workspaceFolder}/bin/lib", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + },{ + "name": "ffmpeg", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/bin/lib/ffmpeg_g", + "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"], "stopAtEntry": false, "cwd": "${workspaceFolder}/bin/lib", "environment": [], diff --git a/src/Makefile b/src/Makefile index 7b7d066..a7335cb 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,17 +1,16 @@ - XX = g++ -NVCC = nvcc + +CUDA_ROOT = /usr/local/cuda-11.1 +NVCC = $(CUDA_ROOT)/bin/nvcc PROJECT_ROOT= /mnt/data/cmhu/FFNvDecoder DEPEND_DIR = $(PROJECT_ROOT)/bin SRC_ROOT = $(PROJECT_ROOT)/src -CUDA_ROOT = /usr/local/cuda-11.1 TARGET= $(DEPEND_DIR)/lib/test - INCLUDE= -I $(DEPEND_DIR)/include \ -I $(CUDA_ROOT)/include \ -I $(SRC_ROOT)/common/inc \ @@ -19,7 +18,8 @@ INCLUDE= -I $(DEPEND_DIR)/include \ -I $(SRC_ROOT)\ LIBSPATH= -L $(DEPEND_DIR)/lib -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice \ - -L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid -lcurand -lcublas -lnvjpeg \ + -L $(CUDA_ROOT)/lib64 -lcuda -lcudart -lnvcuvid \ + -L $(CUDA_ROOT)/lib64/stubs -lcurand -lcublas -lnvjpeg \ CFLAGS= -g -fPIC -O0 $(INCLUDE) -pthread -lrt -lz -std=c++11 -fvisibility=hidden -Wl,-Bsymbolic -ldl # -DUNICODE -D_UNICODE @@ -47,6 +47,4 @@ $(TARGET):$(OBJS) $(CU_OBJS) $(NVCC) $(NFLAGS) -o $@ $< clean: - rm -f *.o $(TARGET) - - + rm -f *.o $(TARGET) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index c8b39b3..fcbf920 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -17,10 +17,79 @@ int sum2 = 0; cudaStream_t stream[2]; +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; +} + /** * 注意: gpuFrame 在解码器设置的显卡上,后续操作要十分注意这一点,尤其是多线程情况 * */ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ + FFNvDecoder* decoder = (FFNvDecoder*)userPtr; if (decoder!= nullptr) { @@ -39,7 +108,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ if (gpuFrame->format == AV_PIX_FMT_CUDA) { - cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl; + // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl; cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str())); cudaError_t cudaStatus; if(pHwRgb[0] == nullptr){ @@ -54,7 +123,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ return; } - string path = "/mnt/f/fiss/data/" + decoder->getName() + "/" + to_string(sum) + ".jpg"; + string path = data_home + decoder->getName() + ".jpg"; saveJpeg(path.c_str(), pHwRgb[0], gpuFrame->width, gpuFrame->height, stream[0]); // 验证 CUDAToRGB } } else if (decoder->getName() == "dec2") @@ -64,7 +133,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ if (gpuFrame->format == AV_PIX_FMT_CUDA) { - cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl; + // cout << "gpuid = " << atoi(decoder->m_cfg.gpuid.c_str()) << endl; cudaSetDevice(atoi(decoder->m_cfg.gpuid.c_str())); cudaError_t cudaStatus; if(pHwRgb[1] == nullptr){ @@ -79,7 +148,7 @@ void postDecoded(const void * userPtr, AVFrame * gpuFrame){ return; } - string path = "/mnt/f/fiss/data/" + decoder->getName() + "/" + to_string(sum) + ".jpg"; + string path = data_home + decoder->getName() + ".jpg"; saveJpeg(path.c_str(), pHwRgb[1], gpuFrame->width, gpuFrame->height, stream[1]); // 验证 CUDAToRGB } } @@ -126,12 +195,12 @@ void postDecoded0(const void * userPtr, AVFrame * gpuFrame){ // 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; - cout << "keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl; - cout << gpuFrame->pts << endl; + cout << decoder->getName() << " keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl; + // cout << gpuFrame->pts << endl; count_flag = false; } - cout << "帧数:" << sum << endl; + // cout << "帧数:" << sum << endl; if (gpuFrame->format == AV_PIX_FMT_CUDA) { @@ -149,7 +218,7 @@ void postDecoded0(const void * userPtr, AVFrame * gpuFrame){ return; } - string path = "/mnt/f/fiss/data/" + to_string(sum) + ".jpg"; + string path = data_home + decoder->getName() + ".jpg"; saveJpeg(path.c_str(), pHwData, gpuFrame->width, gpuFrame->height, nullptr); // 验证 CUDAToRGB } } @@ -166,8 +235,9 @@ void decode_finished_cbk(const void* userPtr){ // string test_uri = "rtsp://176.10.0.2:8554/stream"; // string test_uri = "/mnt/f/fiss/test_data/h265.mp4"; string test_uri = "rtsp://176.10.0.4:8554/stream"; +char* gpuid = "0"; -void createDecode(int index){ +void createDecode(int index, const char* gpu_id){ FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance(); MgrDecConfig config; config.name = "dec" + to_string(index); @@ -176,14 +246,15 @@ void createDecode(int index){ config.cfg.decode_finished_cbk = decode_finished_cbk; config.cfg.force_tcp = true; - if (index % 2 == 0) - { - config.cfg.gpuid = "0"; - } - else - { - config.cfg.gpuid = "0"; - } + config.cfg.gpuid = gpu_id; + // if (index % 2 == 0) + // { + // config.cfg.gpuid = gpu_id; + // } + // else + // { + // config.cfg.gpuid = "0"; + // } FFNvDecoder* decoder = pDecManager->createDecoder(config); if (!decoder) @@ -194,42 +265,6 @@ void createDecode(int index){ pDecManager->startDecodeByName(config.name); } -#define checkCudaErrors(S) do {CUresult status; \ - status = S; \ - if (status != CUDA_SUCCESS ) std::cout << __LINE__ <<" checkCudaErrors - status = " << status << std::endl; \ - } while (false) - -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; -} - void logFF(void *, int level, const char *fmt, va_list ap) { vfprintf(stdout, fmt, ap); @@ -239,18 +274,19 @@ void logFF(void *, int level, const char *fmt, va_list ap) int main(int argc, char* argv[]){ test_uri = argv[1]; + gpuid = argv[2]; cout << test_uri << endl; // av_log_set_callback(&logFF); - CheckCUDAProperty(0); + CheckCUDAProperty(atoi(gpuid)); FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance(); - // int count = 99; + // int count = 4; // for (size_t i = 0; i < count ; i++) // { - // createDecode(i); + // createDecode(i, gpuid); // } MgrDecConfig config; @@ -259,7 +295,7 @@ int main(int argc, char* argv[]){ config.cfg.post_decoded_cbk = postDecoded0; config.cfg.decode_finished_cbk = decode_finished_cbk; config.cfg.force_tcp = true; - config.cfg.gpuid = "0"; + config.cfg.gpuid = gpuid; FFNvDecoder* dec2 = pDecManager->createDecoder(config); if (!dec2) { @@ -277,12 +313,14 @@ int main(int argc, char* argv[]){ pthread_create(&m_decode_thread,0, [](void* arg) { + // cudaSetDevice(atoi(gpuid)); while (true) { std::this_thread::sleep_for(std::chrono::milliseconds(5000)); FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance(); int count = pDecManager->count(); - cout << "当前运行路数: " << pDecManager->count() << endl; + cout << "当前时间戳:" << get_cur_time() << " 当前运行路数:" << pDecManager->count() << endl; + // gpu_helper(atoi(gpuid)); if (count <= 0) { break;