Commit a1c0194c32d446cd68a73914ed9961ff2375d516
1 parent
1d41673e
FFNvDecoder 初步功能版
Showing
17 changed files
with
302 additions
and
277 deletions
.vscode/launch.json
... | ... | @@ -20,6 +20,24 @@ |
20 | 20 | } |
21 | 21 | ] |
22 | 22 | },{ |
23 | + "name": "test_ffnvdecoder", | |
24 | + "type": "cppdbg", | |
25 | + "request": "launch", | |
26 | + "program": "${workspaceFolder}/Linux_3rdparty/video_structure_sdk_20220512/test", | |
27 | + "args": ["/home/cmhu/data/video/Street.uvf","6","0","./db/mvpt.bin"], | |
28 | + "stopAtEntry": false, | |
29 | + "cwd": "${workspaceFolder}/Linux_3rdparty/video_structure_sdk_20220512", | |
30 | + "environment": [], | |
31 | + "externalConsole": false, | |
32 | + "MIMode": "gdb", | |
33 | + "setupCommands": [ | |
34 | + { | |
35 | + "description": "Enable pretty-printing for gdb", | |
36 | + "text": "-enable-pretty-printing", | |
37 | + "ignoreFailures": true | |
38 | + } | |
39 | + ] | |
40 | + },{ | |
23 | 41 | "name": "test_face", |
24 | 42 | "type": "cppdbg", |
25 | 43 | "request": "launch", | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/linux/VPT/Makefile
... | ... | @@ -2,6 +2,7 @@ CC = gcc |
2 | 2 | XX = g++ |
3 | 3 | AR = ar |
4 | 4 | |
5 | +CUDA = /usr/local/cuda | |
5 | 6 | NVCC = /usr/local/cuda/bin/nvcc |
6 | 7 | |
7 | 8 | MNT_HOME = /home/cmhu/Project_VideoStructure |
... | ... | @@ -11,6 +12,7 @@ DEPEND_DIR = $(MNT_HOME)/Linux_3rdparty |
11 | 12 | SDK_ROOT = $(MNT_HOME)/SDK |
12 | 13 | |
13 | 14 | SRC_ROOT = $(PROJECT_ROOT)/src/VPT |
15 | +FFNVDECODER_ROOT = $(PROJECT_ROOT)/src/FFNvDecoder | |
14 | 16 | |
15 | 17 | UTOOLS_SSD_ROOT = $(DEPEND_DIR)/utools_trt_v1.4.0 |
16 | 18 | HIDE_MODEL_CAFFE2 = $(PROJECT_ROOT)/model/hidemodel_caffe_1108 |
... | ... | @@ -19,6 +21,7 @@ AUTHORITY_DIR = $(DEPEND_DIR)/authority_linux_20200114 |
19 | 21 | TRT_ROOT = $(DEPEND_DIR)/TensorRT-8.6.1.6 |
20 | 22 | OPENCV_ROOT = $(DEPEND_DIR)/opencv-4.5.4/release |
21 | 23 | FFMPEG_ROOT = $(DEPEND_DIR)/ffmpeg-5.0.1/release |
24 | +SPDLOG_ROOT = $(DEPEND_DIR)/spdlog-1.9.2/release | |
22 | 25 | |
23 | 26 | TARGET = $(DEPEND_DIR)/video_structure_sdk_20220512/libmvpt.so |
24 | 27 | |
... | ... | @@ -34,16 +37,18 @@ INCLUDE= -I $(DEPEND_DIR)/include/boost_linux_x86_64/include \ |
34 | 37 | -I $(DEPEND_DIR)/include/cairo \ |
35 | 38 | -I $(SRC_ROOT)/sort \ |
36 | 39 | -I $(SRC_ROOT)/snapshot_analysis \ |
37 | - -I $(SRC_ROOT)/../DxDecoder \ | |
38 | - -I /usr/local/cuda/include \ | |
39 | 40 | -I $(HIDE_MODEL_CAFFE2) \ |
40 | 41 | -I $(HIDE_MODEL_TRT) \ |
41 | 42 | -I $(AUTHORITY_DIR) \ |
42 | 43 | -I $(FFMPEG_ROOT)/include \ |
43 | 44 | -I $(SDK_ROOT)/face_detect2/face_detect \ |
45 | + -I $(SPDLOG_ROOT)/include \ | |
46 | + -I $(FFNVDECODER_ROOT) \ | |
47 | + -I $(FFNVDECODER_ROOT)/common/inc \ | |
48 | + -I $(FFNVDECODER_ROOT)/common/UtilNPP \ | |
49 | + -I $(CUDA)/include \ | |
44 | 50 | |
45 | -LIBSPATH= -L ../DxDecoder -l:libDxDecoder.a \ | |
46 | - -L/usr/local/cuda/lib64 -lcuda -lcudart -lcurand -lcublas \ | |
51 | +LIBSPATH=-L/usr/local/cuda/lib64 -lcuda -lcudart -lcurand -lcublas \ | |
47 | 52 | -L/usr/lib/x86_64-linux-gnu -lnvcuvid \ |
48 | 53 | -L$(DEPEND_DIR)/video_structure_sdk_20220512 -lSfxDecoder -lSfxStreamHandler -lvpd2 \ |
49 | 54 | -L$(DEPEND_DIR)/video_structure_sdk_20220512 -lface_detect -lvehicle_brand_cls -lvr_vehicle_type_10cls -lvr5905cls -lvehicle_recognize -lvehicle_color -lhuman_parsing -lhuman_car_parsing -lnon_vehicle_fea_trt -lvehicle_rear_recognition -lvf_int8 -lvp2_yolo\ |
... | ... | @@ -53,9 +58,10 @@ LIBSPATH= -L ../DxDecoder -l:libDxDecoder.a \ |
53 | 58 | -L $(OPENCV_ROOT)/lib -lopencv_video -lopencv_highgui -lopencv_imgproc -lopencv_core -lopencv_imgcodecs\ |
54 | 59 | -L$(AUTHORITY_DIR) -l:libauthority.a \ |
55 | 60 | -L $(DEPEND_DIR)/include/boost_linux_x86_64/lib -l:libboost_system.a -l:libboost_thread.a \ |
61 | + -L $(SPDLOG_ROOT)/lib -l:libspdlog.a \ | |
56 | 62 | |
57 | 63 | |
58 | -CFLAGS_LIB=-g -O0 -Wall -Wno-deprecated $(DEFS) -lz -fPIC -fvisibility=hidden -Wl,-Bsymbolic | |
64 | +CFLAGS_LIB=-g -O0 -Wall -Wno-deprecated $(DEFS) -lz -ldl -lpthread -fPIC -fvisibility=hidden -Wl,-Bsymbolic | |
59 | 65 | CFLAGS = $(CFLAGS_LIB) $(INCLUDE) -std=c++11 -DUSE_CUDNN |
60 | 66 | # -DUNICODE -D_UNICODE |
61 | 67 | NFLAGS_LIB=-g -c $(DEFS) -shared -Xcompiler -fPIC -Xcompiler -fvisibility=hidden |
... | ... | @@ -69,10 +75,13 @@ SRCS:=$(wildcard $(SRC_ROOT)/*.cpp) \ |
69 | 75 | $(wildcard $(HIDE_MODEL_CAFFE2)/*.cpp) \ |
70 | 76 | $(wildcard $(HIDE_MODEL_TRT)/*.cpp) \ |
71 | 77 | $(wildcard $(SRC_ROOT)/snapshot_analysis/*.cpp) \ |
72 | - | |
78 | + $(wildcard $(FFNVDECODER_ROOT)/*.cpp) | |
79 | + | |
73 | 80 | OBJS = $(patsubst %.cpp, %.o, $(notdir $(SRCS))) |
74 | 81 | |
75 | -CU_SOURCES = $(wildcard ${SRC_ROOT}/snapshot_analysis/*.cu) | |
82 | +CU_SOURCES = $(wildcard ${SRC_ROOT}/snapshot_analysis/*.cu) \ | |
83 | + $(wildcard ${FFNVDECODER_ROOT}/*.cu) | |
84 | + | |
76 | 85 | CU_OBJS = $(patsubst %.cu, %.o, $(notdir $(CU_SOURCES))) |
77 | 86 | |
78 | 87 | all:$(TARGET) |
... | ... | @@ -97,6 +106,13 @@ $(TARGET):$(OBJS) $(CU_OBJS) |
97 | 106 | %.o:$(SRC_ROOT)/snapshot_analysis/%.cu |
98 | 107 | @echo "#######################CU_OBJS:$@###############" |
99 | 108 | $(NVCC) $(NFLAGS) -o $@ $< |
109 | + | |
110 | +%.o:$(FFNVDECODER_ROOT)/%.cpp | |
111 | + $(XX) $(CFLAGS) -c $< | |
112 | + | |
113 | +%.o:$(FFNVDECODER_ROOT)/%.cu | |
114 | + @echo "#######################CU_OBJS:$@###############" | |
115 | + $(NVCC) $(NFLAGS) -o $@ $< | |
100 | 116 | |
101 | 117 | .PHONY:clean |
102 | 118 | clean: | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/linux/VPT/Makefile.FFNvDecoder renamed to vehicle_structure_platform.git0708-3080-trt-face/linux/VPT/Makefile.qx
... | ... | @@ -2,7 +2,6 @@ CC = gcc |
2 | 2 | XX = g++ |
3 | 3 | AR = ar |
4 | 4 | |
5 | -CUDA = /usr/local/cuda | |
6 | 5 | NVCC = /usr/local/cuda/bin/nvcc |
7 | 6 | |
8 | 7 | MNT_HOME = /home/cmhu/Project_VideoStructure |
... | ... | @@ -12,7 +11,6 @@ DEPEND_DIR = $(MNT_HOME)/Linux_3rdparty |
12 | 11 | SDK_ROOT = $(MNT_HOME)/SDK |
13 | 12 | |
14 | 13 | SRC_ROOT = $(PROJECT_ROOT)/src/VPT |
15 | -FFNVDECODER_ROOT = $(PROJECT_ROOT)/src/FFNvDecoder | |
16 | 14 | |
17 | 15 | UTOOLS_SSD_ROOT = $(DEPEND_DIR)/utools_trt_v1.4.0 |
18 | 16 | HIDE_MODEL_CAFFE2 = $(PROJECT_ROOT)/model/hidemodel_caffe_1108 |
... | ... | @@ -21,7 +19,6 @@ AUTHORITY_DIR = $(DEPEND_DIR)/authority_linux_20200114 |
21 | 19 | TRT_ROOT = $(DEPEND_DIR)/TensorRT-8.6.1.6 |
22 | 20 | OPENCV_ROOT = $(DEPEND_DIR)/opencv-4.5.4/release |
23 | 21 | FFMPEG_ROOT = $(DEPEND_DIR)/ffmpeg-5.0.1/release |
24 | -SPDLOG_ROOT = $(DEPEND_DIR)/spdlog-1.9.2/release | |
25 | 22 | |
26 | 23 | TARGET = $(DEPEND_DIR)/video_structure_sdk_20220512/libmvpt.so |
27 | 24 | |
... | ... | @@ -37,18 +34,16 @@ INCLUDE= -I $(DEPEND_DIR)/include/boost_linux_x86_64/include \ |
37 | 34 | -I $(DEPEND_DIR)/include/cairo \ |
38 | 35 | -I $(SRC_ROOT)/sort \ |
39 | 36 | -I $(SRC_ROOT)/snapshot_analysis \ |
37 | + -I $(SRC_ROOT)/../DxDecoder \ | |
38 | + -I /usr/local/cuda/include \ | |
40 | 39 | -I $(HIDE_MODEL_CAFFE2) \ |
41 | 40 | -I $(HIDE_MODEL_TRT) \ |
42 | 41 | -I $(AUTHORITY_DIR) \ |
43 | 42 | -I $(FFMPEG_ROOT)/include \ |
44 | 43 | -I $(SDK_ROOT)/face_detect2/face_detect \ |
45 | - -I $(SPDLOG_ROOT)/include \ | |
46 | - -I $(FFNVDECODER_ROOT) \ | |
47 | - -I $(FFNVDECODER_ROOT)/common/inc \ | |
48 | - -I $(FFNVDECODER_ROOT)/common/UtilNPP \ | |
49 | - -I $(CUDA)/include \ | |
50 | 44 | |
51 | -LIBSPATH=-L/usr/local/cuda/lib64 -lcuda -lcudart -lcurand -lcublas \ | |
45 | +LIBSPATH= -L ../DxDecoder -l:libDxDecoder.a \ | |
46 | + -L/usr/local/cuda/lib64 -lcuda -lcudart -lcurand -lcublas \ | |
52 | 47 | -L/usr/lib/x86_64-linux-gnu -lnvcuvid \ |
53 | 48 | -L$(DEPEND_DIR)/video_structure_sdk_20220512 -lSfxDecoder -lSfxStreamHandler -lvpd2 \ |
54 | 49 | -L$(DEPEND_DIR)/video_structure_sdk_20220512 -lface_detect -lvehicle_brand_cls -lvr_vehicle_type_10cls -lvr5905cls -lvehicle_recognize -lvehicle_color -lhuman_parsing -lhuman_car_parsing -lnon_vehicle_fea_trt -lvehicle_rear_recognition -lvf_int8 -lvp2_yolo\ |
... | ... | @@ -58,10 +53,9 @@ LIBSPATH=-L/usr/local/cuda/lib64 -lcuda -lcudart -lcurand -lcublas \ |
58 | 53 | -L $(OPENCV_ROOT)/lib -lopencv_video -lopencv_highgui -lopencv_imgproc -lopencv_core -lopencv_imgcodecs\ |
59 | 54 | -L$(AUTHORITY_DIR) -l:libauthority.a \ |
60 | 55 | -L $(DEPEND_DIR)/include/boost_linux_x86_64/lib -l:libboost_system.a -l:libboost_thread.a \ |
61 | - -L $(SPDLOG_ROOT)/lib -l:libspdlog.a \ | |
62 | 56 | |
63 | 57 | |
64 | -CFLAGS_LIB=-g -O0 -Wall -Wno-deprecated $(DEFS) -lz -ldl -lpthread -fPIC -fvisibility=hidden -Wl,-Bsymbolic | |
58 | +CFLAGS_LIB=-g -O0 -Wall -Wno-deprecated $(DEFS) -lz -fPIC -fvisibility=hidden -Wl,-Bsymbolic | |
65 | 59 | CFLAGS = $(CFLAGS_LIB) $(INCLUDE) -std=c++11 -DUSE_CUDNN |
66 | 60 | # -DUNICODE -D_UNICODE |
67 | 61 | NFLAGS_LIB=-g -c $(DEFS) -shared -Xcompiler -fPIC -Xcompiler -fvisibility=hidden |
... | ... | @@ -75,13 +69,10 @@ SRCS:=$(wildcard $(SRC_ROOT)/*.cpp) \ |
75 | 69 | $(wildcard $(HIDE_MODEL_CAFFE2)/*.cpp) \ |
76 | 70 | $(wildcard $(HIDE_MODEL_TRT)/*.cpp) \ |
77 | 71 | $(wildcard $(SRC_ROOT)/snapshot_analysis/*.cpp) \ |
78 | - $(wildcard $(FFNVDECODER_ROOT)/*.cpp) | |
79 | - | |
72 | + | |
80 | 73 | OBJS = $(patsubst %.cpp, %.o, $(notdir $(SRCS))) |
81 | 74 | |
82 | -CU_SOURCES = $(wildcard ${SRC_ROOT}/snapshot_analysis/*.cu) \ | |
83 | - $(wildcard ${FFNVDECODER_ROOT}/*.cu) | |
84 | - | |
75 | +CU_SOURCES = $(wildcard ${SRC_ROOT}/snapshot_analysis/*.cu) | |
85 | 76 | CU_OBJS = $(patsubst %.cu, %.o, $(notdir $(CU_SOURCES))) |
86 | 77 | |
87 | 78 | all:$(TARGET) |
... | ... | @@ -106,13 +97,6 @@ $(TARGET):$(OBJS) $(CU_OBJS) |
106 | 97 | %.o:$(SRC_ROOT)/snapshot_analysis/%.cu |
107 | 98 | @echo "#######################CU_OBJS:$@###############" |
108 | 99 | $(NVCC) $(NFLAGS) -o $@ $< |
109 | - | |
110 | -%.o:$(FFNVDECODER_ROOT)/%.cpp | |
111 | - $(XX) $(CFLAGS) -c $< | |
112 | - | |
113 | -%.o:$(FFNVDECODER_ROOT)/%.cu | |
114 | - @echo "#######################CU_OBJS:$@###############" | |
115 | - $(NVCC) $(NFLAGS) -o $@ $< | |
116 | 100 | |
117 | 101 | .PHONY:clean |
118 | 102 | clean: | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/FFNvDecoder/AbstractDecoder.cpp
vehicle_structure_platform.git0708-3080-trt-face/src/FFNvDecoder/AbstractDecoder.h
... | ... | @@ -57,6 +57,7 @@ struct FFDecConfig{ |
57 | 57 | string gpuid; // gpu id |
58 | 58 | bool force_tcp{true}; // 是否指定使用tcp连接 |
59 | 59 | int skip_frame{1}; // 跳帧数 |
60 | + bool keyframe_decode_mod; // 关键帧模式解码 | |
60 | 61 | |
61 | 62 | int port; // gb28181接收数据的端口号 |
62 | 63 | DECODE_REQUEST_STREAM_CALLBACK request_stream_cbk; // gb28181请求流 |
... | ... | @@ -129,7 +130,7 @@ public: |
129 | 130 | |
130 | 131 | FFDecConfig m_cfg; |
131 | 132 | |
132 | - queue<AVFrame*> mFrameQueue; | |
133 | + queue<GPUFrame*> mFrameQueue; | |
133 | 134 | mutex m_queue_mutex; |
134 | 135 | mutex m_snapshot_mutex; |
135 | 136 | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/FFNvDecoder/DxDecoderWrap.cpp
... | ... | @@ -21,7 +21,8 @@ void decode_finished_cbk(const void * userPtr){ |
21 | 21 | DxDecoderWrap::DxDecoderWrap( const DxConfig * cfg ) |
22 | 22 | { |
23 | 23 | m_bClose = false; |
24 | - m_pDec = NULL; | |
24 | + m_pDec = nullptr; | |
25 | + m_pHwData = nullptr; | |
25 | 26 | |
26 | 27 | m_cfg.post_decoded_cbk = decoded_cbk; |
27 | 28 | m_cfg.decode_finished_cbk = decode_finished_cbk; |
... | ... | @@ -29,6 +30,11 @@ DxDecoderWrap::DxDecoderWrap( const DxConfig * cfg ) |
29 | 30 | m_cfg.gpuid = std::to_string(cfg->devId); |
30 | 31 | |
31 | 32 | m_name = cfg->name; |
33 | + m_decMode = cfg->decMode; | |
34 | + | |
35 | + CUdevice cuDevice; | |
36 | + cuDeviceGet(&cuDevice, cfg->devId); | |
37 | + cuCtxCreate(&m_cuda_cxt, 0, cuDevice); | |
32 | 38 | |
33 | 39 | return; |
34 | 40 | } |
... | ... | @@ -60,6 +66,10 @@ int DxDecoderWrap::DxOpenDecoder( const char * uri, unsigned int skip ) |
60 | 66 | m_pDec->setName(m_name) ; |
61 | 67 | m_pDec->m_postDecArg = this; |
62 | 68 | m_pDec->m_finishedDecArg = this; |
69 | + if(1 == m_decMode) { | |
70 | + m_pDec->setDecKeyframe(true); | |
71 | + } | |
72 | + m_pDec->start(); | |
63 | 73 | LOG_INFO("[{}][{}]- 解码器初始化成功", m_name.c_str(), uri); |
64 | 74 | return 0; |
65 | 75 | } |
... | ... | @@ -77,16 +87,29 @@ int DxDecoderWrap::DxOpenDecoder( const char * uri, unsigned int skip ) |
77 | 87 | int DxDecoderWrap::DxCloseDecoder() |
78 | 88 | { |
79 | 89 | m_bClose = true; |
90 | + | |
80 | 91 | if(m_pDec) { |
81 | 92 | m_pDec->close(); |
82 | 93 | delete m_pDec; |
83 | 94 | m_pDec = nullptr; |
84 | 95 | } |
85 | 96 | |
86 | - if(pHwData != nullptr){ | |
87 | - cudaFree(pHwData); | |
97 | + m_queue_frames_mutex.lock(); | |
98 | + while (m_queue_frames.size() > 0) { | |
99 | + GPUFrame * decodedFrame = m_queue_frames.front(); | |
100 | + m_queue_frames.pop(); | |
101 | + delete decodedFrame; | |
102 | + decodedFrame = nullptr; | |
103 | + } | |
104 | + m_queue_frames_mutex.unlock(); | |
105 | + | |
106 | + if(m_pHwData != nullptr){ | |
107 | + cudaFree(m_pHwData); | |
88 | 108 | } |
89 | 109 | |
110 | + cuCtxPopCurrent(nullptr); | |
111 | + cuCtxDestroy(m_cuda_cxt); | |
112 | + | |
90 | 113 | return 0; |
91 | 114 | } |
92 | 115 | |
... | ... | @@ -112,8 +135,8 @@ int DxDecoderWrap::DxGetResolution( int * width, int * height ) |
112 | 135 | return -1; |
113 | 136 | } |
114 | 137 | |
115 | -int DxDecoderWrap::DxGetFrameCount(){ | |
116 | - | |
138 | +int DxDecoderWrap::DxGetFrameCount() | |
139 | +{ | |
117 | 140 | if(m_pDec != nullptr){ |
118 | 141 | return m_pDec->GetFrameCount(); |
119 | 142 | } |
... | ... | @@ -150,9 +173,13 @@ bool DxDecoderWrap::DxDecoderIsRun() const |
150 | 173 | } |
151 | 174 | |
152 | 175 | |
153 | -bool DxDecoderWrap::DxFrameIsEmpty() const | |
176 | +bool DxDecoderWrap::DxFrameIsEmpty() | |
154 | 177 | { |
155 | - return 0 == m_frames.counts; | |
178 | + m_queue_frames_mutex.lock(); | |
179 | + int count = m_queue_frames.size(); | |
180 | + m_queue_frames_mutex.unlock(); | |
181 | + | |
182 | + return 0 == count; | |
156 | 183 | } |
157 | 184 | |
158 | 185 | |
... | ... | @@ -164,6 +191,11 @@ int DxDecoderWrap::DxLockFrame( DxGPUFrame * frame ) |
164 | 191 | } |
165 | 192 | |
166 | 193 | m_queue_frames_mutex.lock(); |
194 | + if(m_queue_frames.size() <= 0) { | |
195 | + m_queue_frames_mutex.unlock(); | |
196 | + return -1; | |
197 | + } | |
198 | + | |
167 | 199 | GPUFrame * decodedFrame = m_queue_frames.front(); |
168 | 200 | m_queue_frames.pop(); |
169 | 201 | m_queue_frames_mutex.unlock(); |
... | ... | @@ -171,17 +203,18 @@ int DxDecoderWrap::DxLockFrame( DxGPUFrame * frame ) |
171 | 203 | AVFrame* gpuFrame = decodedFrame->gpuFrame; |
172 | 204 | |
173 | 205 | cudaSetDevice(atoi(m_cfg.gpuid.c_str())); |
206 | + cuCtxPushCurrent(m_cuda_cxt); | |
174 | 207 | cudaError_t cudaStatus; |
175 | 208 | size_t rgbSize = 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char); |
176 | - if(pHwData == nullptr){ | |
177 | - cudaStatus = cudaMalloc((void **)&pHwData, rgbSize); | |
209 | + if(m_pHwData == nullptr){ | |
210 | + cudaStatus = cudaMalloc((void **)&m_pHwData, rgbSize); | |
178 | 211 | if (cudaStatus != cudaSuccess) { |
179 | 212 | LOG_ERROR("[{}]- cudaMalloc failed !!!", m_name.c_str()); |
180 | 213 | return -1; |
181 | 214 | } |
182 | 215 | } |
183 | 216 | cuda_common::setColorSpace( ITU_709, 0 ); |
184 | - cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwData, gpuFrame->width, gpuFrame->height); | |
217 | + cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], m_pHwData, gpuFrame->width, gpuFrame->height); | |
185 | 218 | cudaDeviceSynchronize(); |
186 | 219 | if (cudaStatus != cudaSuccess) { |
187 | 220 | LOG_ERROR("[{}]- CUDAToBGR failed !!!", m_name.c_str()); |
... | ... | @@ -191,7 +224,7 @@ int DxDecoderWrap::DxLockFrame( DxGPUFrame * frame ) |
191 | 224 | frame->width = gpuFrame->width; |
192 | 225 | frame->height = gpuFrame->height; |
193 | 226 | frame->size = rgbSize; |
194 | - frame->frame = pHwData; | |
227 | + frame->frame = m_pHwData; | |
195 | 228 | frame->timestamp = decodedFrame->ts; |
196 | 229 | |
197 | 230 | delete decodedFrame; |
... | ... | @@ -200,12 +233,14 @@ int DxDecoderWrap::DxLockFrame( DxGPUFrame * frame ) |
200 | 233 | return 0; |
201 | 234 | } |
202 | 235 | |
203 | -void DxDecoderWrap::post_decode_thread(GPUFrame * gpuFrame) { | |
236 | +void DxDecoderWrap::post_decode_thread(GPUFrame * decodedFrame) { | |
204 | 237 | while(!m_bClose) { |
205 | 238 | m_queue_frames_mutex.lock(); |
206 | 239 | if(m_queue_frames.size() < 3) { |
207 | - m_queue_frames.push(gpuFrame); | |
240 | + // 入队 | |
241 | + m_queue_frames.push(decodedFrame); | |
208 | 242 | m_queue_frames_mutex.unlock(); |
243 | + break; | |
209 | 244 | } else { |
210 | 245 | m_queue_frames_mutex.unlock(); |
211 | 246 | std::this_thread::sleep_for(std::chrono::milliseconds(10)); |
... | ... | @@ -214,5 +249,5 @@ void DxDecoderWrap::post_decode_thread(GPUFrame * gpuFrame) { |
214 | 249 | } |
215 | 250 | |
216 | 251 | void DxDecoderWrap::decode_finished_thread() { |
217 | - | |
252 | + m_bClose = true; | |
218 | 253 | } |
219 | 254 | \ No newline at end of file | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/FFNvDecoder/DxDecoderWrap.h
... | ... | @@ -16,7 +16,7 @@ |
16 | 16 | typedef struct DxConfig |
17 | 17 | { |
18 | 18 | int devId; // 设备(GPU)ID |
19 | - int decMode; // 解码模式 | |
19 | + int decMode; // 解码模式: 0 全解码; 1 关键帧解码 | |
20 | 20 | int colorFmt; // 颜色空间 |
21 | 21 | bool forceTcp; // 对于实时流,是否强制为TCP取流 |
22 | 22 | std::string name; |
... | ... | @@ -58,7 +58,7 @@ public: |
58 | 58 | |
59 | 59 | int DxGetResolution( int * width, int * height ); |
60 | 60 | |
61 | - bool DxFrameIsEmpty() const; | |
61 | + bool DxFrameIsEmpty(); | |
62 | 62 | int DxLockFrame( DxGPUFrame * frame ); |
63 | 63 | |
64 | 64 | int PauseDecoder(); |
... | ... | @@ -72,8 +72,6 @@ public: |
72 | 72 | private: |
73 | 73 | bool m_bClose; |
74 | 74 | |
75 | - DxGPUFrames m_frames; | |
76 | - | |
77 | 75 | FFDecConfig m_cfg; |
78 | 76 | string m_name; |
79 | 77 | FFNvDecoder* m_pDec; |
... | ... | @@ -81,7 +79,10 @@ private: |
81 | 79 | std::queue<GPUFrame *> m_queue_frames; |
82 | 80 | std::mutex m_queue_frames_mutex; |
83 | 81 | |
84 | - unsigned char *pHwData {nullptr}; | |
82 | + unsigned char *m_pHwData {nullptr}; | |
83 | + CUcontext m_cuda_cxt; | |
84 | + | |
85 | + int m_decMode{0}; | |
85 | 86 | }; |
86 | 87 | |
87 | 88 | #endif |
88 | 89 | \ No newline at end of file | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/FFNvDecoder/FFNvDecoder.cpp
... | ... | @@ -59,14 +59,14 @@ bool FFNvDecoder::init(FFDecConfig& cfg) |
59 | 59 | { |
60 | 60 | m_cfg = cfg; |
61 | 61 | |
62 | - // todo : fstream判断错误 | |
63 | - fstream infile(cfg.uri); | |
64 | - if (infile.is_open()){ | |
62 | + FILE* fp; | |
63 | + fp=fopen(cfg.uri.c_str(),"rb"); | |
64 | + if(fp!=nullptr) { | |
65 | 65 | m_bReal = false; |
66 | - infile.close(); | |
67 | - }else { | |
66 | + } else { | |
68 | 67 | m_bReal = true; |
69 | 68 | } |
69 | + fclose(fp); | |
70 | 70 | |
71 | 71 | post_decoded_cbk = cfg.post_decoded_cbk; |
72 | 72 | decode_finished_cbk = cfg.decode_finished_cbk; |
... | ... | @@ -119,6 +119,7 @@ bool FFNvDecoder::init(const char* uri, const char* gpuid, bool force_tcp) |
119 | 119 | return false; |
120 | 120 | |
121 | 121 | m_fps = av_q2d(stream ->avg_frame_rate); |
122 | + m_nb_frames = stream->nb_frames; | |
122 | 123 | |
123 | 124 | avctx->opaque = this; |
124 | 125 | // 设置解码器管理器的像素格式回调函数 |
... | ... | @@ -197,6 +198,7 @@ void FFNvDecoder::decode_thread() |
197 | 198 | |
198 | 199 | // long start_time = get_cur_time(); |
199 | 200 | |
201 | + unsigned long long index = 0; | |
200 | 202 | while (m_bRunning) |
201 | 203 | { |
202 | 204 | if (!m_bReal) |
... | ... | @@ -220,15 +222,10 @@ void FFNvDecoder::decode_thread() |
220 | 222 | if (result == AVERROR_EOF || result < 0) |
221 | 223 | { |
222 | 224 | av_packet_unref(pkt); |
223 | - LOG_ERROR("Failed to read frame!"); | |
225 | + LOG_INFO("Failed to read frame!"); | |
224 | 226 | break; |
225 | 227 | } |
226 | 228 | |
227 | - if (m_dec_keyframe && !(pkt->flags & AV_PKT_FLAG_KEY)) { | |
228 | - av_packet_unref(pkt); | |
229 | - continue; | |
230 | - } | |
231 | - | |
232 | 229 | if (m_bReal) |
233 | 230 | { |
234 | 231 | if (m_bPause) |
... | ... | @@ -240,6 +237,14 @@ void FFNvDecoder::decode_thread() |
240 | 237 | } |
241 | 238 | |
242 | 239 | if (stream_index == pkt->stream_index){ |
240 | + | |
241 | + index++; | |
242 | + | |
243 | + if (m_dec_keyframe && !(pkt->flags & AV_PKT_FLAG_KEY)) { | |
244 | + av_packet_unref(pkt); | |
245 | + continue; | |
246 | + } | |
247 | + | |
243 | 248 | result = avcodec_send_packet(avctx, pkt); |
244 | 249 | if (result < 0){ |
245 | 250 | av_packet_unref(pkt); |
... | ... | @@ -260,7 +265,10 @@ void FFNvDecoder::decode_thread() |
260 | 265 | if(gpuFrame != nullptr){ |
261 | 266 | m_queue_mutex.lock(); |
262 | 267 | if(mFrameQueue.size() <= 10){ |
263 | - mFrameQueue.push(gpuFrame); | |
268 | + GPUFrame* frame = new GPUFrame(); | |
269 | + frame->ts = index; | |
270 | + frame->gpuFrame = gpuFrame; | |
271 | + mFrameQueue.push(frame); | |
264 | 272 | }else{ |
265 | 273 | av_frame_free(&gpuFrame); |
266 | 274 | } |
... | ... | @@ -286,8 +294,9 @@ void FFNvDecoder::decode_thread() |
286 | 294 | |
287 | 295 | // 清空队列 |
288 | 296 | while(mFrameQueue.size() > 0){ |
289 | - AVFrame * gpuFrame = mFrameQueue.front(); | |
290 | - av_frame_free(&gpuFrame); | |
297 | + GPUFrame * frame = mFrameQueue.front(); | |
298 | + delete frame; | |
299 | + frame = nullptr; | |
291 | 300 | mFrameQueue.pop(); |
292 | 301 | } |
293 | 302 | |
... | ... | @@ -323,18 +332,15 @@ void FFNvDecoder::post_decode_thread(){ |
323 | 332 | std::lock_guard<std::mutex> l(m_snapshot_mutex); |
324 | 333 | // 取队头数据 |
325 | 334 | m_queue_mutex.lock(); |
326 | - AVFrame * gpuFrame = mFrameQueue.front(); | |
335 | + GPUFrame* frame = mFrameQueue.front(); | |
327 | 336 | mFrameQueue.pop(); |
328 | 337 | m_queue_mutex.unlock(); |
329 | 338 | // 跳帧 |
330 | 339 | if (skip_frame == 1 || index % skip_frame == 0){ |
331 | - GPUFrame* frame = new GPUFrame(); | |
332 | - frame->ts = index; | |
333 | - frame->gpuFrame = gpuFrame; | |
334 | 340 | post_decoded_cbk(m_postDecArg, frame); |
335 | 341 | } |
336 | 342 | |
337 | - av_frame_free(&gpuFrame); | |
343 | + // av_frame_free(&gpuFrame); | |
338 | 344 | |
339 | 345 | index++; |
340 | 346 | } |
... | ... | @@ -403,6 +409,5 @@ float FFNvDecoder::fps(){ |
403 | 409 | } |
404 | 410 | |
405 | 411 | unsigned long long FFNvDecoder::GetFrameCount() { |
406 | - // todo | |
407 | - return 1; | |
412 | + return m_nb_frames; | |
408 | 413 | } |
409 | 414 | \ No newline at end of file | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/FFNvDecoder/FFNvDecoder.h
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/ImageSaveCache.h
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp
... | ... | @@ -394,7 +394,6 @@ void CMutliSourceVideoProcess::FinishTask(const int taskID) |
394 | 394 | tasks[i].taskObjCallbackFunc = nullptr; |
395 | 395 | tasks[i].taskRealTimeCallbackFunc = nullptr; |
396 | 396 | |
397 | - | |
398 | 397 | m_snaphot_helper.finish_task_ss_analysis(taskID, m_hp_analysis_config, m_hcp_analysis_config, m_vehicle_analysis_config, m_hf_recg_config, m_hcf_recg_config, m_vcf_recg_config); //�Ƿ�����������ʶ��); |
399 | 398 | |
400 | 399 | if (tasks[i].folderName) |
... | ... | @@ -488,11 +487,15 @@ void CMutliSourceVideoProcess::FinishViewTask() |
488 | 487 | printf("-----------------------finish view task-----------------------\n"); |
489 | 488 | } |
490 | 489 | |
491 | - | |
492 | -//bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* resultFolderLittle, const char* resultFolder, const char* resultFolderface, bool on_image_display, sy_rect minBoxsize[DETECTTYPE], VIDEO_OBJECT_SNAPSHOT_CALLBACK objCallbackFunc/* = NULL*/, VIDEO_REALTIME_CALLBACK realTimeCallbackFunc/* = NULL*/) | |
493 | -bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* resultFolderLittle, const char* resultFolder, const char* resultFolderface, bool on_image_display, int jpeg_quality, sy_rect minBoxsize[DETECTTYPE], VIDEO_OBJECT_SNAPSHOT_CALLBACK objCallbackFunc/* = NULL*/, VIDEO_REALTIME_CALLBACK realTimeCallbackFunc/* = NULL*/) //debug by zsh | |
490 | +bool CMutliSourceVideoProcess::AddTask(task_param tparam) //debug by zsh | |
494 | 491 | { |
495 | - //checkGpuMem(); | |
492 | + const char* videoFileName = tparam.video_filename; | |
493 | + const char* resultFolderLittle = tparam.result_folder_little; | |
494 | + const char* resultFolder = tparam.result_folder; | |
495 | + const char* resultFolderface = tparam.result_folder_face; | |
496 | + VIDEO_OBJECT_SNAPSHOT_CALLBACK objCallbackFunc = tparam.obj_snapshot_callback_func; | |
497 | + VIDEO_REALTIME_CALLBACK realTimeCallbackFunc = tparam.rt_view_callback_func; | |
498 | + | |
496 | 499 | std::lock_guard<std::mutex> l(_tx_add_task); |
497 | 500 | using std::placeholders::_1; |
498 | 501 | // printf("begin real add task\n"); |
... | ... | @@ -503,31 +506,16 @@ bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* re |
503 | 506 | VPTResult.resize(capacity); |
504 | 507 | } |
505 | 508 | |
506 | - string sVideoFileName = videoFileName; | |
507 | - | |
508 | - string target = "file://"; | |
509 | - int pos = sVideoFileName.find(target); | |
510 | - if (pos == 0) { | |
511 | - int n = target.size(); | |
512 | - sVideoFileName = sVideoFileName.erase(pos, n); | |
513 | - } | |
514 | - pos = sVideoFileName.find_first_of('?'); | |
515 | - if (pos != string::npos) { | |
516 | - sVideoFileName = sVideoFileName.substr(0, pos); | |
517 | - } | |
518 | - | |
519 | 509 | Task new_task = {}; |
520 | 510 | new_task.taskID = TotalTask; |
521 | 511 | new_task.taskFileSource = videoFileName; |
522 | - memcpy(new_task.task_min_boxsize, minBoxsize, sizeof(sy_rect)* DETECTTYPE); | |
523 | - | |
512 | + memcpy(new_task.task_min_boxsize, tparam.minBoxsize, sizeof(sy_rect)* DETECTTYPE); | |
524 | 513 | |
525 | 514 | DxConfig cfg = { 0 }; |
526 | 515 | cfg.devId = mgpuid; |
527 | - cfg.decMode = 0; | |
528 | - cfg.colorFmt = 0; | |
529 | 516 | cfg.forceTcp = false; |
530 | - cfg.type = DX_DECODER_TYPE_SFXLAB; | |
517 | + cfg.decMode = tparam.decMode; | |
518 | + cfg.name = std::to_string(new_task.taskID); | |
531 | 519 | new_task.taskTcuvid = new DxDecoderWrap(&cfg); |
532 | 520 | if (NULL == new_task.taskTcuvid) |
533 | 521 | { |
... | ... | @@ -631,8 +619,8 @@ bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* re |
631 | 619 | new_task_info.snapshot_folder = new_task.folderNameLittle; |
632 | 620 | new_task_info.snapshot_folder_face = new_task.folderNameFace; |
633 | 621 | new_task_info.task_total_framecount = new_task.taskTotalFrameCount; |
634 | - new_task_info._on_image_display = on_image_display; | |
635 | - new_task_info.jpeg_quality_ = jpeg_quality; //debug by zsh | |
622 | + new_task_info._on_image_display = tparam.on_image_display; | |
623 | + new_task_info.jpeg_quality_ = tparam.jpeg_quality; //debug by zsh | |
636 | 624 | new_task_info.obj_callback = new_task.taskObjCallbackFunc; |
637 | 625 | m_snaphot_helper.add_task_info(new_task.taskID, new_task_info); |
638 | 626 | |
... | ... | @@ -640,20 +628,8 @@ bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* re |
640 | 628 | TaskinPlay++; |
641 | 629 | tasks.push_back(new_task); |
642 | 630 | |
643 | - // printf("finish push tasks\n"); | |
644 | - | |
645 | - //return 1; | |
646 | - //std::cout<<__LINE__<<"of"<<__FILE__<<"debug\n"; | |
647 | - if (!ProcessFlag) | |
648 | - { | |
649 | - /*for (int num = 0; num < 5; ++num) | |
650 | - {*/ | |
651 | - //create_thread()��һ���������������Դ���thead���������̣߳�ͬʱ�����ڲ���list | |
652 | - // group.create_thread(boost::bind(&runchild , num)) ; | |
653 | - //saveSnapshotsThreadGroup.create_thread(boost::bind(SnapshotThreadProcess, this, 0)); | |
654 | - //} | |
631 | + if (!ProcessFlag) { | |
655 | 632 | ProcessThread = boost::thread(ThreadProcess, this); |
656 | - //std::cout << "begin algorithm" << std::endl; | |
657 | 633 | ProcessFlag = true; |
658 | 634 | } |
659 | 635 | |
... | ... | @@ -668,8 +644,7 @@ int CMutliSourceVideoProcess::AddOperator(task_param tparam) |
668 | 644 | |
669 | 645 | if (!ProcessFlag) |
670 | 646 | { |
671 | - //AddTask(tparam.video_filename, tparam.result_folder_little, tparam.result_folder, tparam.result_folder_face, tparam.on_image_display, tparam.minBoxsize, tparam.obj_snapshot_callback_func, tparam.rt_view_callback_func); | |
672 | - AddTask(tparam.video_filename, tparam.result_folder_little, tparam.result_folder, tparam.result_folder_face, tparam.on_image_display, tparam.jpeg_quality, tparam.minBoxsize, tparam.obj_snapshot_callback_func, tparam.rt_view_callback_func); //debug by zsh | |
647 | + AddTask(tparam); | |
673 | 648 | boost::thread::sleep(boost::get_system_time() + boost::posix_time::microseconds(500)); |
674 | 649 | } |
675 | 650 | else |
... | ... | @@ -680,12 +655,14 @@ int CMutliSourceVideoProcess::AddOperator(task_param tparam) |
680 | 655 | Operator newOper; |
681 | 656 | newOper.changeTaskID = 0; |
682 | 657 | newOper.changeTaskOperator = ADDTASK; |
683 | - newOper.videoFileName = tparam.video_filename; | |
684 | - newOper.resultFolderLittleName = tparam.result_folder_little; | |
685 | - newOper.result_folder_face = tparam.result_folder_face; | |
686 | - newOper.resultFolderName = tparam.result_folder; | |
658 | + | |
659 | + strcpy(newOper.videoFileName, tparam.video_filename); | |
660 | + strcpy(newOper.resultFolderLittleName, tparam.result_folder_little); | |
661 | + strcpy(newOper.resultFolderName, tparam.result_folder); | |
662 | + strcpy(newOper.result_folder_face, tparam.result_folder_face); | |
687 | 663 | newOper.on_image_display = tparam.on_image_display; |
688 | - newOper.jpeg_quality = tparam.jpeg_quality; //debug by zsh | |
664 | + newOper.jpeg_quality = tparam.jpeg_quality; | |
665 | + newOper.decMode = tparam.decMode; | |
689 | 666 | newOper.taskObjCallbackFunc = tparam.obj_snapshot_callback_func; |
690 | 667 | newOper.taskRealTimeCallbackFunc = tparam.rt_view_callback_func; |
691 | 668 | memcpy(newOper.minBoxsize, tparam.minBoxsize, sizeof(sy_rect)* DETECTTYPE); |
... | ... | @@ -741,7 +718,6 @@ void CMutliSourceVideoProcess::AddOperator(int taskID, int taskOper) |
741 | 718 | Operator newOper = {}; |
742 | 719 | newOper.changeTaskID = taskID; |
743 | 720 | newOper.changeTaskOperator = TaskOperator(taskOper); |
744 | - newOper.videoFileName = NULL; | |
745 | 721 | //TaskOperatorQ.push(newOper); |
746 | 722 | TaskOperatorQ.push_back(newOper); |
747 | 723 | } |
... | ... | @@ -757,8 +733,20 @@ void CMutliSourceVideoProcess::OperatorTask() |
757 | 733 | switch (newOperator.changeTaskOperator) |
758 | 734 | { |
759 | 735 | case ADDTASK: |
760 | - //AddTask(newOperator.videoFileName, newOperator.resultFolderLittleName, newOperator.resultFolderName, newOperator.result_folder_face, newOperator.on_image_display, newOperator.minBoxsize, newOperator.taskObjCallbackFunc, newOperator.taskRealTimeCallbackFunc); | |
761 | - AddTask(newOperator.videoFileName, newOperator.resultFolderLittleName, newOperator.resultFolderName, newOperator.result_folder_face, newOperator.on_image_display, newOperator.jpeg_quality, newOperator.minBoxsize, newOperator.taskObjCallbackFunc, newOperator.taskRealTimeCallbackFunc); //debug by zsh | |
736 | + { | |
737 | + task_param tparam; | |
738 | + strcpy(tparam.video_filename, newOperator.videoFileName); | |
739 | + strcpy(tparam.result_folder_little, newOperator.resultFolderLittleName); | |
740 | + strcpy(tparam.result_folder, newOperator.resultFolderName); | |
741 | + strcpy(tparam.result_folder_face, newOperator.result_folder_face); | |
742 | + tparam.on_image_display = newOperator.on_image_display; | |
743 | + tparam.jpeg_quality = newOperator.jpeg_quality; | |
744 | + memcpy(tparam.minBoxsize, newOperator.minBoxsize, sizeof(sy_rect)* DETECTTYPE); | |
745 | + tparam.obj_snapshot_callback_func = newOperator.taskObjCallbackFunc; | |
746 | + tparam.rt_view_callback_func = newOperator.taskRealTimeCallbackFunc; | |
747 | + tparam.decMode = newOperator.decMode; | |
748 | + AddTask(tparam); | |
749 | + } | |
762 | 750 | break; |
763 | 751 | case PAUSETASK: |
764 | 752 | PauseTask(newOperator.changeTaskID); |
... | ... | @@ -1031,44 +1019,9 @@ DWORD ThreadProcess(LPVOID param) |
1031 | 1019 | { |
1032 | 1020 | if (k.find(i) == k.end() && pThreadParam->tasks[i].taskState == PLAY && pThreadParam->tasks[i].taskTcuvid->DxDecoderIsRun()) |
1033 | 1021 | { |
1034 | - if (pThreadParam->tasks[i].taskTcuvid->DxLockFrame(&frame) == 0) | |
1035 | - { | |
1036 | - if (!pThreadParam->tasks[i].task_algorithm_data.frame && frame.width > 0 && frame.height > 0) | |
1037 | - { | |
1038 | - cudaError_t cudaStatus = cudaMalloc((void**)&pThreadParam->tasks[i].task_algorithm_data.frame, 3 * frame.size * frame.height * sizeof(unsigned char)); | |
1039 | - if (cudaStatus != cudaSuccess) { | |
1040 | - fprintf(stderr, "here cudaMalloc m_pRGBData[0] failed! error: %s\n", cudaGetErrorString(cudaStatus)); | |
1041 | - break; | |
1042 | - } | |
1043 | - | |
1044 | - pThreadParam->tasks[i].task_algorithm_data.height = frame.height; | |
1045 | - pThreadParam->tasks[i].task_algorithm_data.width = frame.width; | |
1046 | - pThreadParam->tasks[i].task_algorithm_data.size = frame.size; | |
1047 | - | |
1048 | - pThreadParam->tasks[i].frameImage = cv::Mat::zeros(frame.height, frame.width, CV_8UC3); | |
1049 | - pThreadParam->tasks[i].taskDataToRT = (float*)malloc(3 * frame.height * frame.width * sizeof(unsigned char)); | |
1050 | - AddTaskTracker(pThreadParam->VPT_Handle, pThreadParam->tasks[i].taskID, 1, 1); | |
1051 | - } | |
1052 | - | |
1053 | - //copy decode data | |
1054 | - if (pThreadParam->tasks[i].task_algorithm_data.frame) | |
1055 | - { | |
1056 | - int height = frame.height; | |
1057 | - int width = frame.width; | |
1058 | - | |
1059 | - Nv12ToColor24<BGR24>( (unsigned char *)frame.frame, width, (unsigned char *)pThreadParam->tasks[i].task_algorithm_data.frame, 3 * width, width, height, 0 ); | |
1060 | - | |
1061 | - pThreadParam->tasks[i].task_algorithm_data.timestamp = frame.timestamp; | |
1062 | - | |
1063 | - k.insert(i); | |
1064 | - pThreadParam->TaskinPlayID.insert(pThreadParam->tasks[i].taskID); | |
1065 | - } | |
1066 | - else | |
1067 | - { | |
1068 | - std::cout << "NOT ALLOC: pThreadParam->tasks[i].taskDataToBackup.frame" << pThreadParam->tasks[i].task_algorithm_data.frame << std::endl; | |
1069 | - } | |
1070 | - | |
1071 | - pThreadParam->tasks[i].taskTcuvid->DxUnlockFrame(); | |
1022 | + if(pThreadParam->tasks[i].taskTcuvid->DxLockFrame(&pThreadParam->tasks[i].task_algorithm_data) == 0) { | |
1023 | + k.insert(i); | |
1024 | + pThreadParam->TaskinPlayID.insert(pThreadParam->tasks[i].taskID); | |
1072 | 1025 | } |
1073 | 1026 | } |
1074 | 1027 | else if (k.find(i) == k.end() && pThreadParam->tasks[i].taskState == PLAY && !pThreadParam->tasks[i].taskTcuvid->DxDecoderIsRun()) |
... | ... | @@ -1756,7 +1709,7 @@ DWORD ThreadProcess(LPVOID param) |
1756 | 1709 | vector<int>().swap(deleteObjectID[i]); |
1757 | 1710 | vector<vector<int>>().swap(deleteObjectID); |
1758 | 1711 | |
1759 | - // pThreadParam->m_snaphot_helper.object_attri_analysis(); | |
1712 | + pThreadParam->m_snaphot_helper.object_attri_analysis(); | |
1760 | 1713 | |
1761 | 1714 | #ifdef LOG_INFO2 |
1762 | 1715 | long long second_analysis_time2 = get_cur_time_ms(); |
... | ... | @@ -1788,7 +1741,7 @@ DWORD ThreadProcess(LPVOID param) |
1788 | 1741 | } |
1789 | 1742 | long long costTime1 = get_cur_time_ms() - begintime1; |
1790 | 1743 | std::cout << "==================== Process Thread is Finished: " << std::endl; |
1791 | - printf("total frame cost time = %lld us, process times: %d \n", costTime1, process_times); | |
1744 | + printf("total frame cost time = %lld us, process times: %d total_count: %d \n", costTime1, process_times, total_count); | |
1792 | 1745 | |
1793 | 1746 | pThreadParam->m_snaphot_helper.snapShotInfo.clear(); |
1794 | 1747 | pThreadParam->ProcessFlag = false; | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp.FFNvDecoder renamed to vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.cpp.qx
... | ... | @@ -524,8 +524,10 @@ bool CMutliSourceVideoProcess::AddTask(const char* videoFileName, const char* re |
524 | 524 | |
525 | 525 | DxConfig cfg = { 0 }; |
526 | 526 | cfg.devId = mgpuid; |
527 | + cfg.decMode = 0; | |
528 | + cfg.colorFmt = 0; | |
527 | 529 | cfg.forceTcp = false; |
528 | - cfg.name = std::to_string(new_task.taskID); | |
530 | + cfg.type = DX_DECODER_TYPE_SFXLAB; | |
529 | 531 | new_task.taskTcuvid = new DxDecoderWrap(&cfg); |
530 | 532 | if (NULL == new_task.taskTcuvid) |
531 | 533 | { |
... | ... | @@ -1029,49 +1031,45 @@ DWORD ThreadProcess(LPVOID param) |
1029 | 1031 | { |
1030 | 1032 | if (k.find(i) == k.end() && pThreadParam->tasks[i].taskState == PLAY && pThreadParam->tasks[i].taskTcuvid->DxDecoderIsRun()) |
1031 | 1033 | { |
1032 | - if(pThreadParam->tasks[i].taskTcuvid->DxLockFrame(&pThreadParam->tasks[i].task_algorithm_data) == 0) { | |
1033 | - k.insert(i); | |
1034 | - pThreadParam->TaskinPlayID.insert(pThreadParam->tasks[i].taskID); | |
1034 | + if (pThreadParam->tasks[i].taskTcuvid->DxLockFrame(&frame) == 0) | |
1035 | + { | |
1036 | + if (!pThreadParam->tasks[i].task_algorithm_data.frame && frame.width > 0 && frame.height > 0) | |
1037 | + { | |
1038 | + cudaError_t cudaStatus = cudaMalloc((void**)&pThreadParam->tasks[i].task_algorithm_data.frame, 3 * frame.size * frame.height * sizeof(unsigned char)); | |
1039 | + if (cudaStatus != cudaSuccess) { | |
1040 | + fprintf(stderr, "here cudaMalloc m_pRGBData[0] failed! error: %s\n", cudaGetErrorString(cudaStatus)); | |
1041 | + break; | |
1042 | + } | |
1043 | + | |
1044 | + pThreadParam->tasks[i].task_algorithm_data.height = frame.height; | |
1045 | + pThreadParam->tasks[i].task_algorithm_data.width = frame.width; | |
1046 | + pThreadParam->tasks[i].task_algorithm_data.size = frame.size; | |
1047 | + | |
1048 | + pThreadParam->tasks[i].frameImage = cv::Mat::zeros(frame.height, frame.width, CV_8UC3); | |
1049 | + pThreadParam->tasks[i].taskDataToRT = (float*)malloc(3 * frame.height * frame.width * sizeof(unsigned char)); | |
1050 | + AddTaskTracker(pThreadParam->VPT_Handle, pThreadParam->tasks[i].taskID, 1, 1); | |
1051 | + } | |
1052 | + | |
1053 | + //copy decode data | |
1054 | + if (pThreadParam->tasks[i].task_algorithm_data.frame) | |
1055 | + { | |
1056 | + int height = frame.height; | |
1057 | + int width = frame.width; | |
1058 | + | |
1059 | + Nv12ToColor24<BGR24>( (unsigned char *)frame.frame, width, (unsigned char *)pThreadParam->tasks[i].task_algorithm_data.frame, 3 * width, width, height, 0 ); | |
1060 | + | |
1061 | + pThreadParam->tasks[i].task_algorithm_data.timestamp = frame.timestamp; | |
1062 | + | |
1063 | + k.insert(i); | |
1064 | + pThreadParam->TaskinPlayID.insert(pThreadParam->tasks[i].taskID); | |
1065 | + } | |
1066 | + else | |
1067 | + { | |
1068 | + std::cout << "NOT ALLOC: pThreadParam->tasks[i].taskDataToBackup.frame" << pThreadParam->tasks[i].task_algorithm_data.frame << std::endl; | |
1069 | + } | |
1070 | + | |
1071 | + pThreadParam->tasks[i].taskTcuvid->DxUnlockFrame(); | |
1035 | 1072 | } |
1036 | - // if (pThreadParam->tasks[i].taskTcuvid->DxLockFrame(&frame) == 0) | |
1037 | - // { | |
1038 | - // if (!pThreadParam->tasks[i].task_algorithm_data.frame && frame.width > 0 && frame.height > 0) | |
1039 | - // { | |
1040 | - // cudaError_t cudaStatus = cudaMalloc((void**)&pThreadParam->tasks[i].task_algorithm_data.frame, 3 * frame.size * frame.height * sizeof(unsigned char)); | |
1041 | - // if (cudaStatus != cudaSuccess) { | |
1042 | - // fprintf(stderr, "here cudaMalloc m_pRGBData[0] failed! error: %s\n", cudaGetErrorString(cudaStatus)); | |
1043 | - // break; | |
1044 | - // } | |
1045 | - | |
1046 | - // pThreadParam->tasks[i].task_algorithm_data.height = frame.height; | |
1047 | - // pThreadParam->tasks[i].task_algorithm_data.width = frame.width; | |
1048 | - // pThreadParam->tasks[i].task_algorithm_data.size = frame.size; | |
1049 | - | |
1050 | - // pThreadParam->tasks[i].frameImage = cv::Mat::zeros(frame.height, frame.width, CV_8UC3); | |
1051 | - // pThreadParam->tasks[i].taskDataToRT = (float*)malloc(3 * frame.height * frame.width * sizeof(unsigned char)); | |
1052 | - // AddTaskTracker(pThreadParam->VPT_Handle, pThreadParam->tasks[i].taskID, 1, 1); | |
1053 | - // } | |
1054 | - | |
1055 | - // //copy decode data | |
1056 | - // if (pThreadParam->tasks[i].task_algorithm_data.frame) | |
1057 | - // { | |
1058 | - // int height = frame.height; | |
1059 | - // int width = frame.width; | |
1060 | - | |
1061 | - // Nv12ToColor24<BGR24>( (unsigned char *)frame.frame, width, (unsigned char *)pThreadParam->tasks[i].task_algorithm_data.frame, 3 * width, width, height, 0 ); | |
1062 | - | |
1063 | - // pThreadParam->tasks[i].task_algorithm_data.timestamp = frame.timestamp; | |
1064 | - | |
1065 | - // k.insert(i); | |
1066 | - // pThreadParam->TaskinPlayID.insert(pThreadParam->tasks[i].taskID); | |
1067 | - // } | |
1068 | - // else | |
1069 | - // { | |
1070 | - // std::cout << "NOT ALLOC: pThreadParam->tasks[i].taskDataToBackup.frame" << pThreadParam->tasks[i].task_algorithm_data.frame << std::endl; | |
1071 | - // } | |
1072 | - | |
1073 | - // pThreadParam->tasks[i].taskTcuvid->DxUnlockFrame(); | |
1074 | - // } | |
1075 | 1073 | } |
1076 | 1074 | else if (k.find(i) == k.end() && pThreadParam->tasks[i].taskState == PLAY && !pThreadParam->tasks[i].taskTcuvid->DxDecoderIsRun()) |
1077 | 1075 | { | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/MutliSourceVideoProcess.h
... | ... | @@ -5,7 +5,7 @@ |
5 | 5 | #include <stdlib.h> |
6 | 6 | #include <iostream> |
7 | 7 | |
8 | -#include "../DxDecoder/DxDecoderWrap.h" | |
8 | +#include "../FFNvDecoder/DxDecoderWrap.h" | |
9 | 9 | #include "nvml.h" |
10 | 10 | #include "time.h" |
11 | 11 | #include "opencv2/opencv.hpp" |
... | ... | @@ -15,7 +15,7 @@ |
15 | 15 | #include <set> |
16 | 16 | #include <boost/thread/thread.hpp> |
17 | 17 | #include "common.h" |
18 | -#include "../DxDecoder/ImageSaveGPU.h" | |
18 | +#include "../FFNvDecoder/ImageSaveGPU.h" | |
19 | 19 | |
20 | 20 | #include "mvpt_process_assist.h" |
21 | 21 | #include <boost/thread/thread_pool.hpp> |
... | ... | @@ -173,12 +173,13 @@ enum TaskOperator |
173 | 173 | |
174 | 174 | struct Operator{ |
175 | 175 | int changeTaskID; |
176 | - const char* videoFileName; | |
177 | - const char* resultFolderLittleName; | |
178 | - const char* resultFolderName; | |
179 | - const char* result_folder_face; | |
176 | + char videoFileName[256]; | |
177 | + char resultFolderLittleName[256]; | |
178 | + char resultFolderName[256]; | |
179 | + char result_folder_face[256]; | |
180 | 180 | bool on_image_display; |
181 | - int jpeg_quality; //ͼƬ���������IJ���0-100 --debug by zsh | |
181 | + int jpeg_quality; | |
182 | + int decMode; | |
182 | 183 | |
183 | 184 | TaskOperator changeTaskOperator; |
184 | 185 | VIDEO_OBJECT_SNAPSHOT_CALLBACK taskObjCallbackFunc; |
... | ... | @@ -220,8 +221,7 @@ public: |
220 | 221 | void AddOperator(int taskID, int taskOper); |
221 | 222 | int AddOperator(task_param tparam); |
222 | 223 | void callTaskObjInfoCallbackFunc(int objCount, VPT_ObjInfo *obj, int taskFrameCount, int taskId); |
223 | - //bool AddTask(const char* videoFileName, const char* resultFolderLittle, const char* resultFolder, const char* resultFolderface, bool on_image_display, sy_rect minBoxsize[DETECTTYPE], VIDEO_OBJECT_SNAPSHOT_CALLBACK objCallbackFunc = NULL, VIDEO_REALTIME_CALLBACK realTimeCallbackFunc = NULL); | |
224 | - bool AddTask(const char* videoFileName, const char* resultFolderLittle, const char* resultFolder, const char* resultFolderface, bool on_image_display, int jpeg_quality, sy_rect minBoxsize[DETECTTYPE], VIDEO_OBJECT_SNAPSHOT_CALLBACK objCallbackFunc = NULL, VIDEO_REALTIME_CALLBACK realTimeCallbackFunc = NULL); //debug by zsh | |
224 | + bool AddTask(task_param tparam); | |
225 | 225 | void PauseTask(const int taskID); |
226 | 226 | void RestartTask(const int taskID); |
227 | 227 | void FinishTask(const int taskID); | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/header.h
... | ... | @@ -224,18 +224,19 @@ typedef void(*VIDEO_FINISH_CALLBACK)(void * handle, const int task_id); |
224 | 224 | #define __TASK_PARAM__ |
225 | 225 | typedef struct task_param |
226 | 226 | { |
227 | - const char* video_filename; | |
228 | - const char* result_folder_little; | |
229 | - const char* result_folder; | |
230 | - const char* result_folder_face; | |
227 | + char video_filename[256]; | |
228 | + char result_folder_little[256]; | |
229 | + char result_folder[256]; | |
230 | + char result_folder_face[256]; | |
231 | 231 | bool on_image_display; //是否绘制结果框到保存大图 |
232 | 232 | int jpeg_quality; //图片保存质量的参数0-100 --debug by zsh |
233 | + int decMode; // 解码模式: 0 全解码; 1 关键帧解码 | |
233 | 234 | sy_rect minBoxsize[DETECTTYPE]; //自定义的minBoxsize大小 |
234 | 235 | VIDEO_OBJECT_SNAPSHOT_CALLBACK obj_snapshot_callback_func; |
235 | 236 | VIDEO_REALTIME_CALLBACK rt_view_callback_func; |
236 | 237 | |
237 | 238 | //task_param() : video_filename(0), result_folder_little(0), result_folder(0), result_folder_face(0) {} |
238 | - task_param() : video_filename(0), result_folder_little(0), result_folder(0), result_folder_face(0), jpeg_quality(30) {} //debug by zsh | |
239 | + task_param() : jpeg_quality(30) {} //debug by zsh | |
239 | 240 | }task_param; |
240 | 241 | #endif |
241 | 242 | ... | ... |
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/snapshot_analysis/SnapShotFrameCache.h
vehicle_structure_platform.git0708-3080-trt-face/src/VPT/snapshot_analysis/snapshot_helper.h
vehicle_structure_platform.git0708-3080-trt-face/src/test/main.cpp
... | ... | @@ -667,9 +667,45 @@ void videoFinishCallback(void * handle, const int taskID) |
667 | 667 | // } |
668 | 668 | } |
669 | 669 | |
670 | - | |
670 | +//操作句柄 | |
671 | +void *handle; | |
671 | 672 | static int total_index = 0; |
672 | 673 | |
674 | +void create_task(const char * videoFileName, int total_index) { | |
675 | + //指定检测目标视频抽帧图片(保存时显存占用很大) | |
676 | + char resultFolder[256]; | |
677 | + sprintf(resultFolder, "snapshots/res_0308/%d", total_index); | |
678 | + //指定检测目标快照抠图保存路径 | |
679 | + char resultFolderLittle[256]; | |
680 | + sprintf(resultFolderLittle, "snapshots/resLittle_0308/%d", total_index); | |
681 | + | |
682 | + char resultFolderLittleface[256]; | |
683 | + sprintf(resultFolderLittleface, "snapshots/resLittle_face/%d", total_index); | |
684 | + | |
685 | + task_param tparam; | |
686 | + strcpy(tparam.result_folder, resultFolder); | |
687 | + strcpy(tparam.result_folder_little, resultFolderLittle); | |
688 | + strcpy(tparam.result_folder_face, resultFolderLittleface); | |
689 | + strcpy(tparam.video_filename, videoFileName); | |
690 | + tparam.on_image_display = false; | |
691 | + tparam.jpeg_quality = 30; //debug by zsh | |
692 | + tparam.decMode = 1; // 关键帧解码 | |
693 | + | |
694 | + //tparam.video_filename = argv[total_index%4]; | |
695 | + memcpy(tparam.minBoxsize, m_boxsize, sizeof(sy_rect)* DETECTTYPE); | |
696 | + tparam.rt_view_callback_func = videoRTViewCallback; | |
697 | + tparam.obj_snapshot_callback_func = videoObjSnapshotCallback; | |
698 | + | |
699 | + for (int tmp = 0; tmp < 10; tmp ++) { | |
700 | + string tmp_path = "results/" + vpt_types[tmp]; | |
701 | + CreateResultFolder((char*)tmp_path.c_str(), ""); | |
702 | + } | |
703 | + | |
704 | + int newTaskID = add_task(handle, tparam); | |
705 | + cout << "==============================开始任务ID: " << newTaskID << " ============================" << endl; | |
706 | + cur_task_status_.insert(make_pair(newTaskID, FALSE)); | |
707 | +} | |
708 | + | |
673 | 709 | int main(int argc, char* argv[]) |
674 | 710 | { |
675 | 711 | if (argc<4) |
... | ... | @@ -680,26 +716,24 @@ int main(int argc, char* argv[]) |
680 | 716 | const char * videoFileName = argv[1]; |
681 | 717 | addTaskCount = atoi(argv[2]); |
682 | 718 | int gpuID = atoi(argv[3]); |
683 | - //操作句柄 | |
684 | - void *handle; | |
685 | 719 | |
686 | 720 | //初始化参数设置 |
687 | 721 | mvpt_param vptParam; |
688 | - vptParam.hp_analysis_config = SY_CONFIG_CLOSE; | |
689 | - vptParam.hcp_analysis_config = SY_CONFIG_CLOSE; | |
690 | - vptParam.vehicle_analysis_config = SY_CONFIG_CLOSE; | |
691 | - vptParam.hf_recg_config = SY_CONFIG_CLOSE; | |
692 | - vptParam.hcf_recg_config = SY_CONFIG_CLOSE; | |
693 | - vptParam.vcf_recg_config = SY_CONFIG_CLOSE; | |
694 | - vptParam.face_det_config = SY_CONFIG_CLOSE; | |
695 | - | |
696 | - // vptParam.hp_analysis_config = SY_CONFIG_OPEN; | |
697 | - // vptParam.hcp_analysis_config = SY_CONFIG_OPEN; | |
722 | + // vptParam.hp_analysis_config = SY_CONFIG_CLOSE; | |
723 | + // vptParam.hcp_analysis_config = SY_CONFIG_CLOSE; | |
724 | + // vptParam.vehicle_analysis_config = SY_CONFIG_CLOSE; | |
725 | + // vptParam.hf_recg_config = SY_CONFIG_CLOSE; | |
726 | + // vptParam.hcf_recg_config = SY_CONFIG_CLOSE; | |
727 | + // vptParam.vcf_recg_config = SY_CONFIG_CLOSE; | |
728 | + // vptParam.face_det_config = SY_CONFIG_CLOSE; | |
729 | + | |
730 | + vptParam.hp_analysis_config = SY_CONFIG_OPEN; | |
731 | + vptParam.hcp_analysis_config = SY_CONFIG_OPEN; | |
698 | 732 | vptParam.vehicle_analysis_config = SY_CONFIG_OPEN; |
699 | - // vptParam.hf_recg_config = SY_CONFIG_OPEN; | |
700 | - // vptParam.hcf_recg_config = SY_CONFIG_OPEN; | |
701 | - // vptParam.vcf_recg_config = SY_CONFIG_OPEN; | |
702 | - // vptParam.face_det_config = SY_CONFIG_OPEN; | |
733 | + vptParam.hf_recg_config = SY_CONFIG_OPEN; | |
734 | + vptParam.hcf_recg_config = SY_CONFIG_OPEN; | |
735 | + vptParam.vcf_recg_config = SY_CONFIG_OPEN; | |
736 | + vptParam.face_det_config = SY_CONFIG_OPEN; | |
703 | 737 | |
704 | 738 | vptParam.vrdbpath = argv[4]; |
705 | 739 | //vptParam.vrdbpath = "../../db/mvpt.bin"; |
... | ... | @@ -730,46 +764,23 @@ int main(int argc, char* argv[]) |
730 | 764 | continue; |
731 | 765 | } |
732 | 766 | |
767 | + // create_task("/home/cmhu/data/video/duan1.avi", total_index); | |
768 | + | |
769 | + // usleep(40000); | |
770 | + | |
771 | + // create_task("/home/cmhu/data/video/Street.uvf", total_index); | |
772 | + | |
733 | 773 | for (int i = 0; i < addTaskCount; i++) { |
734 | 774 | |
735 | - //指定检测目标视频抽帧图片(保存时显存占用很大) | |
736 | - char resultFolder[260]; | |
737 | - sprintf(resultFolder, "snapshots/res_0308/%d", total_index); | |
738 | - //指定检测目标快照抠图保存路径 | |
739 | - char resultFolderLittle[260]; | |
740 | - sprintf(resultFolderLittle, "snapshots/resLittle_0308/%d", total_index); | |
741 | - | |
742 | - char resultFolderLittleface[260]; | |
743 | - sprintf(resultFolderLittleface, "snapshots/resLittle_face/%d", total_index); | |
744 | - | |
745 | - task_param tparam; | |
746 | - tparam.result_folder = resultFolder; | |
747 | - tparam.result_folder_little = resultFolderLittle; | |
748 | - tparam.result_folder_face = resultFolderLittleface; | |
749 | - tparam.video_filename = videoFileName; | |
750 | - tparam.on_image_display = false; | |
751 | - tparam.jpeg_quality = 30; //debug by zsh | |
752 | - | |
753 | - //tparam.video_filename = argv[total_index%4]; | |
754 | - memcpy(tparam.minBoxsize, m_boxsize, sizeof(sy_rect)* DETECTTYPE); | |
755 | - tparam.rt_view_callback_func = videoRTViewCallback; | |
756 | - tparam.obj_snapshot_callback_func = videoObjSnapshotCallback; | |
757 | - | |
758 | - for (int tmp = 0; tmp < 10; tmp ++) { | |
759 | - string tmp_path = "results/" + vpt_types[tmp]; | |
760 | - CreateResultFolder((char*)tmp_path.c_str(), ""); | |
761 | - } | |
775 | + create_task(videoFileName, total_index); | |
776 | + | |
777 | + total_index++ ; | |
762 | 778 | |
763 | - int newTaskID = add_task(handle, tparam); | |
764 | - cout << "==============================开始任务ID: " << newTaskID << " ============================" << endl; | |
765 | - cur_task_status_.insert(make_pair(newTaskID, FALSE)); | |
766 | 779 | #ifdef _MSC_VER |
767 | 780 | Sleep(2000); |
768 | 781 | #else |
769 | 782 | usleep(40000); |
770 | - #endif | |
771 | - | |
772 | - total_index++ ; | |
783 | + #endif | |
773 | 784 | } |
774 | 785 | } while(0) ; |
775 | 786 | |
... | ... | @@ -843,20 +854,20 @@ int main(int argc, char* argv[]) |
843 | 854 | itor = cur_task_status_.erase(itor); |
844 | 855 | |
845 | 856 | //指定检测目标视频抽帧图片(保存时显存占用很大) |
846 | - char resultFolder[260]; | |
857 | + char resultFolder[256]; | |
847 | 858 | sprintf(resultFolder, "res/%d", total_index); |
848 | 859 | //指定检测目标快照抠图保存路径 |
849 | - char resultFolderLittle[260]; | |
860 | + char resultFolderLittle[256]; | |
850 | 861 | sprintf(resultFolderLittle, "resLittle/%d", total_index); |
851 | 862 | |
852 | - char resultFolderLittleface[260]; | |
863 | + char resultFolderLittleface[256]; | |
853 | 864 | sprintf(resultFolderLittleface, "resLittle_face/%d", total_index++); |
854 | 865 | |
855 | 866 | task_param tparam; |
856 | - tparam.result_folder = resultFolder; | |
857 | - tparam.result_folder_little = resultFolderLittle; | |
858 | - tparam.result_folder_face = resultFolderLittleface; | |
859 | - tparam.video_filename = videoFileName; | |
867 | + strcpy(tparam.result_folder, resultFolder); | |
868 | + strcpy(tparam.result_folder_little, resultFolderLittle); | |
869 | + strcpy(tparam.result_folder_face, resultFolderLittleface); | |
870 | + strcpy(tparam.video_filename, videoFileName); | |
860 | 871 | memcpy(tparam.minBoxsize, m_boxsize, sizeof(sy_rect)* DETECTTYPE); |
861 | 872 | tparam.rt_view_callback_func = videoRTViewCallback; |
862 | 873 | tparam.obj_snapshot_callback_func = videoObjSnapshotCallback; | ... | ... |