Commit 607d4be179a096e7c105bb1f52c913c2166a1856
1 parent
d2511188
截图代码优化,避免失败情形显存泄漏
Showing
1 changed file
with
90 additions
and
58 deletions
src/util/vpc_util.cpp
... | ... | @@ -88,11 +88,33 @@ vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { |
88 | 88 | acldvppSetPicDescWidthStride(vpcOutputDesc_, cropSizeWidth); |
89 | 89 | acldvppSetPicDescHeightStride(vpcOutputDesc_, cropSizeHeight); |
90 | 90 | acldvppSetPicDescSize(vpcOutputDesc_, vpcOutBufferSize_); |
91 | + | |
91 | 92 | aclrtStream stream_; |
92 | 93 | aclrtCreateStream(&stream_); |
93 | - int ret = acldvppVpcCropAsync(dvppChannelDesc_, vpcInputDesc_, vpcOutputDesc_, cropArea_, stream_); | |
94 | - ret = aclrtSynchronizeStream(stream_); | |
94 | + bool bRet = false; | |
95 | + do | |
96 | + { | |
97 | + aclError ret = acldvppVpcCropAsync(dvppChannelDesc_, vpcInputDesc_, vpcOutputDesc_, cropArea_, stream_); | |
98 | + if (ret != ACL_SUCCESS) { | |
99 | + LOG_ERROR("acldvppVpcCropAsync failed, task_id : {}", devMem->getId()); | |
100 | + break; | |
101 | + } | |
102 | + ret = aclrtSynchronizeStream(stream_); | |
103 | + if (ret != ACL_SUCCESS) { | |
104 | + LOG_ERROR("aclrtSynchronizeStream failed, task_id : {}", devMem->getId()); | |
105 | + break; | |
106 | + } | |
107 | + | |
108 | + img_info.pic_desc = vpcOutputDesc_; | |
109 | + img_info.object_id = obj.object_id; | |
110 | + img_info.task_id = obj.task_id; //该物体属于的任务ID号 | |
111 | + img_info.task_frame_count = obj.task_frame_count; //该物体当前出现的帧号 | |
112 | + img_info.index = obj.index; //该物体所属类别的编号 | |
113 | + img_info.confidence = obj.confidence; //该物体的置信度 | |
95 | 114 | |
115 | + bRet = true; | |
116 | + } while (0); | |
117 | + | |
96 | 118 | if (stream_ != nullptr) { |
97 | 119 | aclrtDestroyStream(stream_); |
98 | 120 | } |
... | ... | @@ -103,20 +125,15 @@ vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { |
103 | 125 | (void)acldvppDestroyRoiConfig(cropArea_); |
104 | 126 | cropArea_ = nullptr; |
105 | 127 | |
106 | - img_info.pic_desc = vpcOutputDesc_; | |
107 | - img_info.object_id = obj.object_id; | |
108 | - img_info.task_id = obj.task_id; //该物体属于的任务ID号 | |
109 | - img_info.task_frame_count = obj.task_frame_count; //该物体当前出现的帧号 | |
110 | - img_info.index = obj.index; //该物体所属类别的编号 | |
111 | - img_info.confidence = obj.confidence; //该物体的置信度 | |
112 | - | |
113 | - // (void)acldvppDestroyPicDesc(vpcOutputDesc_); | |
114 | - // vpcOutputDesc_ = nullptr; | |
128 | + if (!bRet) { | |
129 | + (void)acldvppDestroyPicDesc(vpcOutputDesc_); | |
130 | + vpcOutputDesc_ = nullptr; | |
115 | 131 | |
116 | - // if (vpcOutBufferDev_ != nullptr) { | |
117 | - // (void)acldvppFree(vpcOutBufferDev_); | |
118 | - // vpcOutBufferDev_ = nullptr; | |
119 | - // } | |
132 | + if (vpcOutBufferDev_ != nullptr) { | |
133 | + (void)acldvppFree(vpcOutBufferDev_); | |
134 | + vpcOutBufferDev_ = nullptr; | |
135 | + } | |
136 | + } | |
120 | 137 | |
121 | 138 | return img_info; |
122 | 139 | } |
... | ... | @@ -234,49 +251,62 @@ vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_obje |
234 | 251 | aclrtStream stream_; |
235 | 252 | aclrtCreateStream(&stream_); |
236 | 253 | |
237 | - uint32_t roiNums[] = { outputBatchSize_ }; | |
238 | - ret = acldvppVpcBatchCropAsync(dvppChannelDesc_, vpcInputBatchDesc_, roiNums, 1, outputBatchPicDesc_, cropAreas, stream_); | |
239 | - ret = aclrtSynchronizeStream(stream_); | |
254 | + bool bRet = false; | |
255 | + do { | |
256 | + uint32_t roiNums[] = { outputBatchSize_ }; | |
257 | + ret = acldvppVpcBatchCropAsync(dvppChannelDesc_, vpcInputBatchDesc_, roiNums, 1, outputBatchPicDesc_, cropAreas, stream_); | |
258 | + if (ret != ACL_SUCCESS) { | |
259 | + LOG_ERROR("acldvppVpcBatchCropAsync failed, task_id : {}", devMem->getId()); | |
260 | + break; | |
261 | + } | |
262 | + ret = aclrtSynchronizeStream(stream_); | |
263 | + if (ret != ACL_SUCCESS) { | |
264 | + LOG_ERROR("aclrtSynchronizeStream failed, task_id : {}", devMem->getId()); | |
265 | + break; | |
266 | + } | |
240 | 267 | |
268 | + for (uint32_t i = 0; i < outputBatchSize_; i++) { | |
269 | + video_object_info obj = objs[i]; | |
270 | + | |
271 | + vpcOutputDesc = acldvppGetPicDesc(outputBatchPicDesc_, i); | |
272 | + void *outputDataDev = acldvppGetPicDescData(vpcOutputDesc); | |
273 | + uint32_t outputSize = acldvppGetPicDescSize(vpcOutputDesc); | |
274 | + uint32_t width = acldvppGetPicDescWidth(vpcOutputDesc); | |
275 | + uint32_t width_stride = acldvppGetPicDescWidthStride(vpcOutputDesc); | |
276 | + uint32_t height = acldvppGetPicDescHeight(vpcOutputDesc); | |
277 | + uint32_t height_stride = acldvppGetPicDescHeightStride(vpcOutputDesc); | |
278 | + acldvppPixelFormat fmt = acldvppGetPicDescFormat(vpcOutputDesc); | |
279 | + | |
280 | + acldvppPicDesc *vpcInputDesc_= acldvppCreatePicDesc(); | |
281 | + acldvppSetPicDescData(vpcInputDesc_, vecOutPtr_[i]); | |
282 | + acldvppSetPicDescFormat(vpcInputDesc_, fmt); | |
283 | + acldvppSetPicDescWidth(vpcInputDesc_, width); | |
284 | + acldvppSetPicDescHeight(vpcInputDesc_, height); | |
285 | + acldvppSetPicDescWidthStride(vpcInputDesc_, width_stride); | |
286 | + acldvppSetPicDescHeightStride(vpcInputDesc_, height_stride); | |
287 | + acldvppSetPicDescSize(vpcInputDesc_, outputSize); | |
288 | + | |
289 | + vpc_img_info img_info ; | |
290 | + img_info.pic_desc = vpcInputDesc_; | |
291 | + img_info.object_id = obj.object_id; | |
292 | + img_info.task_id = obj.task_id; //该物体属于的任务ID号 | |
293 | + img_info.task_frame_count = obj.task_frame_count; //该物体当前出现的帧号 | |
294 | + img_info.index = obj.index; //该物体所属类别的编号 | |
295 | + img_info.confidence = obj.confidence; //该物体的置信度 | |
296 | + vec_img_info.push_back(img_info); | |
297 | + // vpcOutputDesc = acldvppGetPicDesc(outputBatchPicDesc_, i); | |
298 | + // string file_name = "output"; | |
299 | + // file_name = file_name + to_string(i) + ".jpg"; | |
300 | + // vpc_jpeg_encode(vpcOutputDesc, file_name); | |
301 | + } | |
302 | + | |
303 | + bRet = true; | |
304 | + } while (0); | |
305 | + | |
241 | 306 | if (stream_ != nullptr) { |
242 | 307 | aclrtDestroyStream(stream_); |
243 | 308 | } |
244 | 309 | |
245 | - for (uint32_t i = 0; i < outputBatchSize_; i++) { | |
246 | - video_object_info obj = objs[i]; | |
247 | - | |
248 | - vpcOutputDesc = acldvppGetPicDesc(outputBatchPicDesc_, i); | |
249 | - void *outputDataDev = acldvppGetPicDescData(vpcOutputDesc); | |
250 | - uint32_t outputSize = acldvppGetPicDescSize(vpcOutputDesc); | |
251 | - uint32_t width = acldvppGetPicDescWidth(vpcOutputDesc); | |
252 | - uint32_t width_stride = acldvppGetPicDescWidthStride(vpcOutputDesc); | |
253 | - uint32_t height = acldvppGetPicDescHeight(vpcOutputDesc); | |
254 | - uint32_t height_stride = acldvppGetPicDescHeightStride(vpcOutputDesc); | |
255 | - acldvppPixelFormat fmt = acldvppGetPicDescFormat(vpcOutputDesc); | |
256 | - | |
257 | - acldvppPicDesc *vpcInputDesc_= acldvppCreatePicDesc(); | |
258 | - acldvppSetPicDescData(vpcInputDesc_, vecOutPtr_[i]); | |
259 | - acldvppSetPicDescFormat(vpcInputDesc_, fmt); | |
260 | - acldvppSetPicDescWidth(vpcInputDesc_, width); | |
261 | - acldvppSetPicDescHeight(vpcInputDesc_, height); | |
262 | - acldvppSetPicDescWidthStride(vpcInputDesc_, width_stride); | |
263 | - acldvppSetPicDescHeightStride(vpcInputDesc_, height_stride); | |
264 | - acldvppSetPicDescSize(vpcInputDesc_, outputSize); | |
265 | - | |
266 | - vpc_img_info img_info ; | |
267 | - img_info.pic_desc = vpcInputDesc_; | |
268 | - img_info.object_id = obj.object_id; | |
269 | - img_info.task_id = obj.task_id; //该物体属于的任务ID号 | |
270 | - img_info.task_frame_count = obj.task_frame_count; //该物体当前出现的帧号 | |
271 | - img_info.index = obj.index; //该物体所属类别的编号 | |
272 | - img_info.confidence = obj.confidence; //该物体的置信度 | |
273 | - vec_img_info.push_back(img_info); | |
274 | - // vpcOutputDesc = acldvppGetPicDesc(outputBatchPicDesc_, i); | |
275 | - // string file_name = "output"; | |
276 | - // file_name = file_name + to_string(i) + ".jpg"; | |
277 | - // vpc_jpeg_encode(vpcOutputDesc, file_name); | |
278 | - } | |
279 | - | |
280 | 310 | aclrtSetCurrentContext(context_); |
281 | 311 | |
282 | 312 | if (vpcInputBatchDesc_ != nullptr) { |
... | ... | @@ -284,11 +314,13 @@ vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_obje |
284 | 314 | vpcInputBatchDesc_ = nullptr; |
285 | 315 | } |
286 | 316 | |
287 | - // for(int i = 0; i < vecOutPtr_.size(); i++){ | |
288 | - // if (vecOutPtr_[i] != nullptr){ | |
289 | - // acldvppFree(vecOutPtr_[i]); | |
290 | - // } | |
291 | - // } | |
317 | + if (!bRet){ | |
318 | + for(int i = 0; i < vecOutPtr_.size(); i++){ | |
319 | + if (vecOutPtr_[i] != nullptr){ | |
320 | + acldvppFree(vecOutPtr_[i]); | |
321 | + } | |
322 | + } | |
323 | + } | |
292 | 324 | |
293 | 325 | if (outputBatchPicDesc_ != nullptr) { |
294 | 326 | (void)acldvppDestroyBatchPicDesc(outputBatchPicDesc_); | ... | ... |