Commit 6eb42f5599598f69d1e8c8402370aec11c6b46cb
1 parent
193bf0d8
优化jpeg日志;修复抠图坐标越界问题
Showing
2 changed files
with
76 additions
and
10 deletions
src/util/JpegUtil.cpp
@@ -64,7 +64,7 @@ int32_t JpegUtil::jpege_save(char* pcData , uint32_t dataLen, string out_file_na | @@ -64,7 +64,7 @@ int32_t JpegUtil::jpege_save(char* pcData , uint32_t dataLen, string out_file_na | ||
64 | FILE* fd = nullptr; | 64 | FILE* fd = nullptr; |
65 | fd = fopen(out_file_name.c_str(), "wb"); | 65 | fd = fopen(out_file_name.c_str(), "wb"); |
66 | if (fd == nullptr) { | 66 | if (fd == nullptr) { |
67 | - LOG_ERROR("open output file err"); | 67 | + LOG_ERROR("open output file error"); |
68 | return 1; | 68 | return 1; |
69 | } | 69 | } |
70 | 70 | ||
@@ -85,11 +85,13 @@ bool JpegUtil::jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_nam | @@ -85,11 +85,13 @@ bool JpegUtil::jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_nam | ||
85 | uint32_t outBufferSize= 0; | 85 | uint32_t outBufferSize= 0; |
86 | int ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize); | 86 | int ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize); |
87 | if (ret != ACL_SUCCESS) { | 87 | if (ret != ACL_SUCCESS) { |
88 | + LOG_ERROR("acldvppJpegPredictEncSize failed!"); | ||
88 | return false; | 89 | return false; |
89 | } | 90 | } |
90 | void *encodeOutBufferDev_ = nullptr; | 91 | void *encodeOutBufferDev_ = nullptr; |
91 | ret = acldvppMalloc(&encodeOutBufferDev_, outBufferSize); | 92 | ret = acldvppMalloc(&encodeOutBufferDev_, outBufferSize); |
92 | if (ret != ACL_SUCCESS) { | 93 | if (ret != ACL_SUCCESS) { |
94 | + LOG_ERROR("acldvppMalloc failed!"); | ||
93 | return false; | 95 | return false; |
94 | } | 96 | } |
95 | 97 | ||
@@ -98,29 +100,37 @@ bool JpegUtil::jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_nam | @@ -98,29 +100,37 @@ bool JpegUtil::jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_nam | ||
98 | // 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 | 100 | // 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成 |
99 | aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_, &outBufferSize, jpegeConfig_, stream_); | 101 | aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_, &outBufferSize, jpegeConfig_, stream_); |
100 | if (ret != ACL_SUCCESS) { | 102 | if (ret != ACL_SUCCESS) { |
103 | + LOG_ERROR("acldvppJpegEncodeAsync failed!"); | ||
101 | break; | 104 | break; |
102 | } | 105 | } |
103 | aclRet = aclrtSynchronizeStream(stream_); | 106 | aclRet = aclrtSynchronizeStream(stream_); |
104 | if (ret != ACL_SUCCESS) { | 107 | if (ret != ACL_SUCCESS) { |
108 | + LOG_ERROR("aclrtSynchronizeStream failed!"); | ||
105 | break; | 109 | break; |
106 | } | 110 | } |
107 | 111 | ||
108 | // 申请Host内存outputHostBuffer | 112 | // 申请Host内存outputHostBuffer |
109 | void* outputHostBuffer = malloc(outBufferSize); | 113 | void* outputHostBuffer = malloc(outBufferSize); |
114 | + if(outputHostBuffer == nullptr) { | ||
115 | + LOG_ERROR("malloc failed!"); | ||
116 | + break; | ||
117 | + } | ||
110 | 118 | ||
111 | // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host | 119 | // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host |
112 | aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize, encodeOutBufferDev_, outBufferSize, ACL_MEMCPY_DEVICE_TO_HOST); | 120 | aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize, encodeOutBufferDev_, outBufferSize, ACL_MEMCPY_DEVICE_TO_HOST); |
113 | if (ret != ACL_SUCCESS) { | 121 | if (ret != ACL_SUCCESS) { |
114 | free(outputHostBuffer); | 122 | free(outputHostBuffer); |
115 | outputHostBuffer = nullptr; | 123 | outputHostBuffer = nullptr; |
124 | + LOG_ERROR("aclrtMemcpy failed!"); | ||
116 | break; | 125 | break; |
117 | } | 126 | } |
118 | 127 | ||
119 | // 数据使用完成后,释放内存 | 128 | // 数据使用完成后,释放内存 |
120 | ret = jpege_save((char*)outputHostBuffer, outBufferSize, out_file_name); | 129 | ret = jpege_save((char*)outputHostBuffer, outBufferSize, out_file_name); |
130 | + free(outputHostBuffer); | ||
131 | + outputHostBuffer = nullptr; | ||
121 | if(ret != 0) { | 132 | if(ret != 0) { |
122 | - free(outputHostBuffer); | ||
123 | - outputHostBuffer = nullptr; | 133 | + LOG_ERROR("jpege_save failed!"); |
124 | break; | 134 | break; |
125 | } | 135 | } |
126 | 136 |
src/util/vpc_util.cpp
@@ -18,6 +18,14 @@ | @@ -18,6 +18,14 @@ | ||
18 | #include "../decoder/interface/DeviceMemory.hpp" | 18 | #include "../decoder/interface/DeviceMemory.hpp" |
19 | #include "../common/logger.hpp" | 19 | #include "../common/logger.hpp" |
20 | 20 | ||
21 | +static uint32_t AlignSize(uint32_t origSize, uint32_t alignment){ | ||
22 | + if (alignment == 0) { | ||
23 | + return 0; | ||
24 | + } | ||
25 | + uint32_t alignmentH = alignment - 1; | ||
26 | + return (origSize + alignmentH) / alignment * alignment; | ||
27 | +} | ||
28 | + | ||
21 | void VPCUtil::release() | 29 | void VPCUtil::release() |
22 | { | 30 | { |
23 | aclError ret; | 31 | aclError ret; |
@@ -43,9 +51,39 @@ void VPCUtil::release() | @@ -43,9 +51,39 @@ void VPCUtil::release() | ||
43 | LOG_INFO("end to reset device is %d", deviceId_); | 51 | LOG_INFO("end to reset device is %d", deviceId_); |
44 | } | 52 | } |
45 | 53 | ||
54 | +static void adjustCoordinate(uint32_t& left, uint32_t& right, uint32_t& top, uint32_t& bottom, const uint32_t& width, const uint32_t& height) { | ||
55 | + uint32_t cropWidth = right - left; | ||
56 | + uint32_t cropHeight = bottom - top; | ||
57 | + | ||
58 | + if(cropWidth < 16) { | ||
59 | + cropWidth += 16; //小于16的似乎抠不了图 | ||
60 | + right += 16; | ||
61 | + } | ||
62 | + | ||
63 | + if (left < 0) { | ||
64 | + left = 0; | ||
65 | + right = cropWidth; | ||
66 | + } | ||
67 | + | ||
68 | + if (right >= width){ | ||
69 | + right = width -1; | ||
70 | + left = right - cropWidth; | ||
71 | + } | ||
72 | + | ||
73 | + if (top < 0) { | ||
74 | + top = 0; | ||
75 | + bottom = cropHeight; | ||
76 | + } | ||
77 | + | ||
78 | + if (bottom >= height){ | ||
79 | + bottom = height -1; | ||
80 | + top = bottom - cropHeight; | ||
81 | + } | ||
82 | +} | ||
83 | + | ||
46 | vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { | 84 | vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { |
47 | 85 | ||
48 | - vpc_img_info img_info ; | 86 | + vpc_img_info img_info; |
49 | 87 | ||
50 | // uint32_t cropSizeWidth = (obj.right - obj.left) / 16 * 16; | 88 | // uint32_t cropSizeWidth = (obj.right - obj.left) / 16 * 16; |
51 | // uint32_t cropSizeHeight = (obj.bottom - obj.top) / 2 * 2; | 89 | // uint32_t cropSizeHeight = (obj.bottom - obj.top) / 2 * 2; |
@@ -59,7 +97,21 @@ vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { | @@ -59,7 +97,21 @@ vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { | ||
59 | uint32_t cropTopOffset = (obj.top + 1) / 2 * 2; // must even | 97 | uint32_t cropTopOffset = (obj.top + 1) / 2 * 2; // must even |
60 | uint32_t cropBottomOffset = cropTopOffset + cropSizeHeight - oddNum; // must odd | 98 | uint32_t cropBottomOffset = cropTopOffset + cropSizeHeight - oddNum; // must odd |
61 | 99 | ||
100 | + adjustCoordinate(cropLeftOffset, cropRightOffset, cropTopOffset, cropBottomOffset, devMem->getWidth(), devMem->getHeight()); | ||
101 | + cropSizeWidth = cropRightOffset - cropLeftOffset + oddNum; // 宽高要比实际的高才行,否则会抠图失败 | ||
102 | + cropSizeHeight = cropBottomOffset - cropTopOffset + oddNum; | ||
103 | + LOG_DEBUG("{} ,{} ,{} ,{} ", cropLeftOffset, cropRightOffset, cropTopOffset, cropBottomOffset); | ||
104 | + | ||
62 | if(cropRightOffset <= cropLeftOffset || cropBottomOffset <= cropTopOffset){ | 105 | if(cropRightOffset <= cropLeftOffset || cropBottomOffset <= cropTopOffset){ |
106 | + LOG_ERROR("{} <= {} || {} <= {} ", cropRightOffset, cropLeftOffset, cropBottomOffset, cropTopOffset); | ||
107 | + return img_info; | ||
108 | + } | ||
109 | + | ||
110 | + aclError ret; | ||
111 | + aclrtSetDevice(deviceId_); | ||
112 | + ret = aclrtSetCurrentContext(context_); | ||
113 | + if (ret != ACL_SUCCESS) { | ||
114 | + LOG_ERROR("aclrtSetCurrentContext failed"); | ||
63 | return img_info; | 115 | return img_info; |
64 | } | 116 | } |
65 | 117 | ||
@@ -94,7 +146,7 @@ vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { | @@ -94,7 +146,7 @@ vpc_img_info VPCUtil::crop(DeviceMemory *devMem, video_object_info obj) { | ||
94 | bool bRet = false; | 146 | bool bRet = false; |
95 | do | 147 | do |
96 | { | 148 | { |
97 | - aclError ret = acldvppVpcCropAsync(dvppChannelDesc_, vpcInputDesc_, vpcOutputDesc_, cropArea_, stream_); | 149 | + ret = acldvppVpcCropAsync(dvppChannelDesc_, vpcInputDesc_, vpcOutputDesc_, cropArea_, stream_); |
98 | if (ret != ACL_SUCCESS) { | 150 | if (ret != ACL_SUCCESS) { |
99 | LOG_ERROR("acldvppVpcCropAsync failed, task_id : {}", devMem->getId()); | 151 | LOG_ERROR("acldvppVpcCropAsync failed, task_id : {}", devMem->getId()); |
100 | break; | 152 | break; |
@@ -148,7 +200,6 @@ int VPCUtil::init(int32_t devId){ | @@ -148,7 +200,6 @@ int VPCUtil::init(int32_t devId){ | ||
148 | // channel 准备 | 200 | // channel 准备 |
149 | dvppChannelDesc_ = acldvppCreateChannelDesc(); | 201 | dvppChannelDesc_ = acldvppCreateChannelDesc(); |
150 | ret = acldvppCreateChannel(dvppChannelDesc_); | 202 | ret = acldvppCreateChannel(dvppChannelDesc_); |
151 | - | ||
152 | } | 203 | } |
153 | 204 | ||
154 | vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_object_info> objs){ | 205 | vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_object_info> objs){ |
@@ -192,10 +243,10 @@ vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_obje | @@ -192,10 +243,10 @@ vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_obje | ||
192 | for (uint32_t i = 0; i < outputBatchSize_; i++) { | 243 | for (uint32_t i = 0; i < outputBatchSize_; i++) { |
193 | video_object_info obj = objs[i]; | 244 | video_object_info obj = objs[i]; |
194 | 245 | ||
195 | - uint32_t cropSizeWidth = (obj.right - obj.left) / 16 * 16; | ||
196 | - uint32_t cropSizeHeight = (obj.bottom - obj.top) / 2 * 2; | ||
197 | - // uint32_t cropSizeWidth = (obj.right - obj.left + 15) / 16 * 16; //debug by zsh | ||
198 | - // uint32_t cropSizeHeight = (obj.bottom - obj.top + 1) / 2 * 2; | 246 | + // uint32_t cropSizeWidth = (obj.right - obj.left) / 16 * 16; |
247 | + // uint32_t cropSizeHeight = (obj.bottom - obj.top) / 2 * 2; | ||
248 | + uint32_t cropSizeWidth = (obj.right - obj.left + 15) / 16 * 16; //debug by zsh | ||
249 | + uint32_t cropSizeHeight = (obj.bottom - obj.top + 1) / 2 * 2; | ||
199 | 250 | ||
200 | uint32_t oddNum = 1; | 251 | uint32_t oddNum = 1; |
201 | uint32_t cropLeftOffset = (obj.left + 1) / 2 * 2; // must even | 252 | uint32_t cropLeftOffset = (obj.left + 1) / 2 * 2; // must even |
@@ -203,6 +254,11 @@ vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_obje | @@ -203,6 +254,11 @@ vector<vpc_img_info> VPCUtil::crop_batch(DeviceMemory *devMem, vector<video_obje | ||
203 | uint32_t cropTopOffset = (obj.top + 1) / 2 * 2; // must even | 254 | uint32_t cropTopOffset = (obj.top + 1) / 2 * 2; // must even |
204 | uint32_t cropBottomOffset = cropTopOffset + cropSizeHeight - oddNum; // must odd | 255 | uint32_t cropBottomOffset = cropTopOffset + cropSizeHeight - oddNum; // must odd |
205 | 256 | ||
257 | + adjustCoordinate(cropLeftOffset, cropRightOffset, cropTopOffset, cropBottomOffset, devMem->getWidth(), devMem->getHeight()); | ||
258 | + cropSizeWidth = cropRightOffset - cropLeftOffset + oddNum; | ||
259 | + cropSizeHeight = cropBottomOffset - cropTopOffset + oddNum; | ||
260 | + LOG_DEBUG("{} ,{} ,{} ,{} ", cropLeftOffset, cropRightOffset, cropTopOffset, cropBottomOffset); | ||
261 | + | ||
206 | if(cropRightOffset <= cropLeftOffset || cropBottomOffset <= cropTopOffset){ | 262 | if(cropRightOffset <= cropLeftOffset || cropBottomOffset <= cropTopOffset){ |
207 | LOG_ERROR("{} <= {} || {} <= {} ", cropRightOffset, cropLeftOffset, cropBottomOffset, cropTopOffset); | 263 | LOG_ERROR("{} <= {} || {} <= {} ", cropRightOffset, cropLeftOffset, cropBottomOffset, cropTopOffset); |
208 | // 释放之前成功的部分 再退出 | 264 | // 释放之前成功的部分 再退出 |