Commit e109b00191e1296245a93343245d320454d2eb00

Authored by Hu Chunming
1 parent 4613ed54

修正多显卡问题

src/ai_platform/MultiSourceProcess.cpp
... ... @@ -9,7 +9,6 @@
9 9  
10 10 #include "../decoder/interface/DecoderManager.h"
11 11 #include "../decoder/interface/utiltools.hpp"
12   -#include "../util/vpc_util.h"
13 12 #include "../util/crop_process.h"
14 13 #include "../helpers/time_helper.hpp"
15 14 #include "../helpers/os_helper.hpp"
... ... @@ -17,6 +16,7 @@
17 16 #include "../reprocessing_module/save_snapshot_reprocessing.h"
18 17  
19 18 #include "macro_definition.h"
  19 +#include "SourceSingleton.hpp"
20 20  
21 21 #define VEHICLE_MULTI_BOXES
22 22  
... ... @@ -59,12 +59,10 @@ void decode_finished_cbk(const void * userPtr){
59 59 }
60 60  
61 61 CMultiSourceProcess::CMultiSourceProcess(){
62   - aclInit(nullptr);
63 62 }
64 63  
65 64 CMultiSourceProcess::~CMultiSourceProcess(){
66   - dvpp_crop_release();
67   - aclFinalize();
  65 + vpc_util.vpc_crop_release();
68 66 }
69 67  
70 68 int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){
... ... @@ -72,6 +70,8 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){
72 70 set_default_logger(LogLevel(vptParam.log_level), "multi_source_process", vptParam.log_path, vptParam.log_mem, vptParam.log_mem);
73 71 LOG_INFO("编译时间:{} {}", __DATE__, __TIME__);
74 72  
  73 + SourceSingleton::getInstance();
  74 +
75 75 skip_frame_ = 5;
76 76 m_batch_size = 16;
77 77  
... ... @@ -93,7 +93,7 @@ int CMultiSourceProcess::InitAlgorthim(tsl_aiplatform_param vptParam){
93 93 m_snapshot_reprocessing = snapshot_reprocessing::getInstance();
94 94 m_save_snapshot_reprocessing = new save_snapshot_reprocessing(m_devId);
95 95  
96   - dvpp_crop_init(m_devId);
  96 + vpc_util.vpc_crop_init(m_devId);
97 97  
98 98 m_pAlgorthimThread = new thread([](void* arg) {
99 99 CMultiSourceProcess* process = (CMultiSourceProcess*)arg ;
... ... @@ -483,13 +483,13 @@ int CMultiSourceProcess::algorithm_vehicle_relult(vector<DeviceMemory*> vec_devM
483 483  
484 484 ImgSaveInfo saveInfo;
485 485 saveInfo.file_path = fpath_origin;
486   - saveInfo.img_info = dvpp_devMem2vpcImg(result.memPtr);
  486 + saveInfo.img_info = vpc_util.vpc_devMem2vpcImg(result.memPtr);
487 487 m_save_snapshot_reprocessing->reprocessing_process_wo_locus_async(saveInfo);
488 488  
489   - vector<vpc_img_info> vec_obj_info_list = dvpp_crop_batch(result.memPtr, result.objs);
  489 + vector<vpc_img_info> vec_obj_info_list = vpc_util.vpc_crop_batch(result.memPtr, result.objs);
490 490 if(vec_obj_info_list.size() != result.objs.size()){
491 491 LOG_ERROR("vpc_crop size error !");
492   - dvpp_imgList_release(vec_obj_info_list);
  492 + vpc_util.vpc_imgList_release(vec_obj_info_list);
493 493 continue;
494 494 }
495 495  
... ...
src/ai_platform/MultiSourceProcess.h
... ... @@ -5,6 +5,7 @@
5 5 #include "../ai_engine_module/VPTProcess.h"
6 6 #include "../reprocessing_module/snapshot_reprocessing.h"
7 7 #include "../reprocessing_module/save_snapshot_reprocessing.h"
  8 +#include "../util/vpc_util.h"
8 9  
9 10 #include <map>
10 11 #include <mutex>
... ... @@ -78,6 +79,8 @@ private:
78 79 set<OBJ_KEY> m_total_snapshot_info_multi_object;
79 80 mutex m_total_mutex;
80 81  
  82 + VPCUtil vpc_util;
  83 +
81 84 #ifdef POST_USE_RABBITMQ
82 85 mq::Manager *mq_manager_{nullptr};
83 86 #endif
... ...
src/ai_platform/SourceSingleton.hpp 0 → 100644
  1 +#include "acl/acl.h"
  2 +#include "acl/ops/acl_dvpp.h"
  3 +
  4 +class SourceSingleton {
  5 +public:
  6 + /**************************************************
  7 + * 接口:getInstance
  8 + * 功能:获取解码器管理者实例
  9 + * 参数:无
  10 + * 返回:成功返回 解码器管理者实例, 失败返回 nullptr
  11 + * 备注:调用其他接口前,需要先调用该接口获取管理者实例
  12 + **************************************************/
  13 + static SourceSingleton* getInstance(){
  14 + static SourceSingleton* singleton = nullptr;
  15 + if (singleton == nullptr){
  16 + singleton = new SourceSingleton();
  17 + }
  18 + return singleton;
  19 + }
  20 +
  21 + SourceSingleton(){
  22 + aclInit(nullptr);
  23 + }
  24 +
  25 + ~SourceSingleton(){
  26 + aclFinalize();
  27 + }
  28 +};
0 29 \ No newline at end of file
... ...
src/demo/demo.cpp
... ... @@ -499,20 +499,7 @@ string createTask(void *handle, std::vector&lt;algorithm_type_t&gt; algor_vec, int gi)
499 499 return task_id_str;
500 500 }
501 501  
502   -int main(int argc, char *argv[]) {
503   - printf("new test\n");
504   -
505   - if (argc < 4) {
506   - fprintf(stderr, "./xxx 0 2 10 1 ## [start_ai_id, end_ai_id) repeat_num gpu_id\n");
507   - return -1;
508   - }
509   -
510   - //! load params.
511   - int start_id = atoi(argv[1]);
512   - int end_id = atoi(argv[2]);
513   - int repeat_num = atoi(argv[3]);
514   - int gpuID = atoi(argv[4]);
515   -
  502 +void test_gpu(int gpuID){
516 503 tsl_aiplatform_param vptParam;
517 504 vptParam.gpuid = gpuID;
518 505 vptParam.trt_serialize_file = "";
... ... @@ -529,8 +516,7 @@ int main(int argc, char *argv[]) {
529 516 int flag = tsl_aiplatform_init(&handle, vptParam);
530 517 if (0 != flag) {
531 518 printf("Init Failed! Error Code: %d\n", flag);
532   - system("pause");
533   - return 0;
  519 + return;
534 520 } else {
535 521 printf("Init Success\n");
536 522 }
... ... @@ -538,14 +524,36 @@ int main(int argc, char *argv[]) {
538 524 std::vector<algorithm_type_t> algor_vec = {algorithm_type_t::FACE_SNAPSHOT, algorithm_type_t::HUMAN_SNAPSHOT,algorithm_type_t::ROAD_WORK_DET,
539 525 algorithm_type_t::VEHICLE_SNAPSHOT, algorithm_type_t::NONMOTOR_VEHICLE_SNAPSHOT, algorithm_type_t::VIDEO_TIMING_SNAPSHOT};
540 526  
541   - string task_id = createTask(handle, algor_vec, 0);
  527 + string task_id = createTask(handle, algor_vec, 0 + gpuID * 10);
  528 + string task_id1 = createTask(handle, algor_vec, 1 + gpuID * 10);
  529 + string task_id2 = createTask(handle, algor_vec, 2 + gpuID * 10);
542 530  
543   - while (getchar() != 'q');
544 531  
545   - finish_task(handle, (char*)task_id.data(), 0);
  532 + // finish_task(handle, (char*)task_id.data(), 0);
  533 +
  534 + // tsl_aiplatform_release(&handle);
  535 +}
  536 +
  537 +int main(int argc, char *argv[]) {
  538 + printf("new test\n");
  539 +
  540 + if (argc < 4) {
  541 + fprintf(stderr, "./xxx 0 2 10 1 ## [start_ai_id, end_ai_id) repeat_num gpu_id\n");
  542 + return -1;
  543 + }
  544 +
  545 + //! load params.
  546 + int start_id = atoi(argv[1]);
  547 + int end_id = atoi(argv[2]);
  548 + int repeat_num = atoi(argv[3]);
  549 + int gpuID = atoi(argv[4]);
  550 +
  551 + test_gpu(0);
  552 + test_gpu(1);
  553 +
  554 + while (getchar() != 'q');
546 555  
547   - tsl_aiplatform_release(&handle);
548   - printf("Done.\n");
  556 + printf("Done.\n");
549 557  
550 558 return 0;
551 559 }
552 560 \ No newline at end of file
... ...
src/reprocessing_module/save_snapshot_reprocessing.cpp
... ... @@ -5,8 +5,6 @@
5 5 #include <opencv2/imgproc/types_c.h>
6 6 #include <algorithm>
7 7 #include "../common/logger.hpp"
8   -#include "../util/JpegUtil.h"
9   -#include "../util/vpc_util.h"
10 8  
11 9 const bool DRAW_ON_IMG = false;
12 10  
... ... @@ -28,14 +26,14 @@ save_snapshot_reprocessing::save_snapshot_reprocessing(int devId) {
28 26 m_save_img_thread = std::thread(save_img_thread_process, this);
29 27  
30 28 m_devId = devId;
31   - DVPP_UTIL::dvpp_jpeg_init(m_devId);
  29 + jpegUtil.jpeg_init(m_devId);
32 30 }
33 31  
34 32 save_snapshot_reprocessing::~save_snapshot_reprocessing(){
35 33 // 结束线程
36 34 bFinish = true;
37 35 m_save_img_thread.join();
38   - DVPP_UTIL::dvpp_jpeg_release();
  36 + jpegUtil.jpeg_release();
39 37 }
40 38  
41 39 // 释放资源
... ... @@ -48,7 +46,7 @@ void save_snapshot_reprocessing::save_snapshot_reprocessing_release() {
48 46 waitforsave_img_queue.pop();
49 47  
50 48 if(!cur_image.file_path.empty()){
51   - dvpp_img_release(cur_image.img_info);
  49 + vpc_util.vpc_img_release(cur_image.img_info);
52 50 }
53 51 }
54 52  
... ... @@ -96,9 +94,9 @@ void save_snapshot_reprocessing::save_img_process() {
96 94 l.unlock();
97 95  
98 96 if(!cur_image.file_path.empty()){
99   - DVPP_UTIL::dvpp_jpeg_encode(cur_image.img_info.pic_desc, cur_image.file_path);
  97 + jpegUtil.jpeg_encode(cur_image.img_info.pic_desc, cur_image.file_path);
100 98 }
101   - dvpp_img_release(cur_image.img_info);
  99 + vpc_util.vpc_img_release(cur_image.img_info);
102 100  
103 101 #ifdef POST_USE_RABBITMQ
104 102 if (callback_ != nullptr && cur_image.json_str.length() > 0) {
... ...
src/reprocessing_module/save_snapshot_reprocessing.h
... ... @@ -16,6 +16,7 @@
16 16  
17 17 #include "../ai_platform/det_obj_header.h"
18 18 #include "../util/vpc_util.h"
  19 +#include "../util/JpegUtil.h"
19 20  
20 21 #ifdef POST_USE_RABBITMQ
21 22 #include "post_reprocessing.hpp"
... ... @@ -57,6 +58,9 @@ private:
57 58 bool bFinish = false;
58 59 int m_devId;
59 60  
  61 + JpegUtil jpegUtil;
  62 + VPCUtil vpc_util;
  63 +
60 64 #ifdef POST_USE_RABBITMQ
61 65 callback_t callback_;
62 66 std::shared_ptr<mq::post_rabbitmq_reprocessing> rbmq_handler_;
... ...
src/reprocessing_module/snapshot_reprocessing.cpp
... ... @@ -150,7 +150,7 @@ void snapshot_reprocessing::filter_vehicle(vector&lt;DeviceMemory*&gt; vec_devMem, vec
150 150 int task_idx = 0;
151 151  
152 152 for (auto memPtr : vec_devMem){
153   - string taskid = memPtr ->getId();
  153 + string taskid = memPtr->getId();
154 154  
155 155 int effective_count = 0;
156 156 int effective_idx = 0;
... ...
src/util/JpegUtil.cpp
... ... @@ -5,110 +5,102 @@
5 5  
6 6 using namespace std;
7 7  
8   -namespace DVPP_UTIL {
9 8  
10   - int32_t deviceId_;
11   - aclrtContext context_;
12   - aclrtStream stream_;
13   - acldvppChannelDesc *dvppChannelDesc_;
  9 +int JpegUtil::jpeg_init(int32_t devId){
  10 + deviceId_ = devId;
14 11  
15   - int dvpp_jpeg_init(int32_t devId){
16   - deviceId_ = devId;
  12 + aclError ret;
  13 + /* 2.Run the management resource application, including Device, Context, Stream */
  14 + aclrtSetDevice(deviceId_);
  15 + aclrtCreateContext(&context_, deviceId_);
  16 + aclrtCreateStream(&stream_);
17 17  
18   - aclError ret;
19   - /* 2.Run the management resource application, including Device, Context, Stream */
20   - aclrtSetDevice(deviceId_);
21   - aclrtCreateContext(&context_, deviceId_);
22   - aclrtCreateStream(&stream_);
  18 + // channel 准备
  19 + dvppChannelDesc_ = acldvppCreateChannelDesc();
  20 + ret = acldvppCreateChannel(dvppChannelDesc_);
  21 +}
23 22  
24   - // channel 准备
25   - dvppChannelDesc_ = acldvppCreateChannelDesc();
26   - ret = acldvppCreateChannel(dvppChannelDesc_);
27   - }
  23 +void JpegUtil::jpeg_release(){
  24 + aclError ret;
  25 + ret = aclrtSetDevice(deviceId_);
  26 + aclrtSetCurrentContext(context_);
28 27  
29   - void dvpp_jpeg_release(){
30   - aclError ret;
31   - ret = aclrtSetDevice(deviceId_);
32   - aclrtSetCurrentContext(context_);
33   -
34   - ret = acldvppDestroyChannel(dvppChannelDesc_);
35   - ret = acldvppDestroyChannelDesc(dvppChannelDesc_);
36   - dvppChannelDesc_ = nullptr;
37   -
38   - if (stream_ != nullptr) {
39   - ret = aclrtDestroyStream(stream_);
40   - if (ret != ACL_SUCCESS) {
41   - printf("destroy stream failed");
42   - }
43   - stream_ = nullptr;
44   - }
45   - printf("end to destroy stream");
46   -
47   - if (context_ != nullptr) {
48   - ret = aclrtDestroyContext(context_);
49   - if (ret != ACL_SUCCESS) {
50   - printf("destroy context failed");
51   - }
52   - context_ = nullptr;
53   - }
54   - printf("end to destroy context");
  28 + ret = acldvppDestroyChannel(dvppChannelDesc_);
  29 + ret = acldvppDestroyChannelDesc(dvppChannelDesc_);
  30 + dvppChannelDesc_ = nullptr;
55 31  
56   - ret = aclrtResetDevice(deviceId_);
  32 + if (stream_ != nullptr) {
  33 + ret = aclrtDestroyStream(stream_);
57 34 if (ret != ACL_SUCCESS) {
58   - printf("reset device failed");
  35 + printf("destroy stream failed");
59 36 }
60   - printf("end to reset device is %d", deviceId_);
  37 + stream_ = nullptr;
61 38 }
  39 + printf("end to destroy stream");
62 40  
63   - int32_t dvpp_jpege_save(char* pcData , uint32_t dataLen, string out_file_name)
64   - {
65   - FILE* fd = nullptr;
66   - fd = fopen(out_file_name.c_str(), "wb");
67   - if (fd == nullptr) {
68   - printf("open output file err\n");
69   - return 1;
  41 + if (context_ != nullptr) {
  42 + ret = aclrtDestroyContext(context_);
  43 + if (ret != ACL_SUCCESS) {
  44 + printf("destroy context failed");
70 45 }
71   -
72   - fwrite(pcData, dataLen, 1, fd);
73   - fflush(fd);
74   -
75   - fclose(fd);
76   - return 0;
  46 + context_ = nullptr;
77 47 }
  48 + printf("end to destroy context");
78 49  
79   - void dvpp_jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_name){
80   -
81   - aclError aclRet ;
82   - aclRet = aclrtSetDevice(deviceId_);
83   - aclrtSetCurrentContext(context_);
84   -
85   - // 7. 创建图片编码配置数据,设置编码质量
86   - // 编码质量范围[0, 100],其中level 0编码质量与level 100差不多,而在[1, 100]内数值越小输出图片质量越差。
87   - acldvppJpegeConfig *jpegeConfig_ = acldvppCreateJpegeConfig();
88   - acldvppSetJpegeConfigLevel(jpegeConfig_, 100);
89   -
90   - // 8. 申请输出内存,申请Device内存encodeOutBufferDev_,存放编码后的输出数据
91   - uint32_t outBufferSize= 0;
92   - int ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize);
93   - void *encodeOutBufferDev_ = nullptr;
94   - ret = acldvppMalloc(&encodeOutBufferDev_, outBufferSize);
95   -
96   - // 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成
97   - aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_, &outBufferSize, jpegeConfig_, stream_);
98   - aclRet = aclrtSynchronizeStream(stream_);
99   -
100   - // 该模式下,由于处理结果在Device侧,因此需要调用内存复制接口传输结果数据后,再释放Device侧内存
101   - // 申请Host内存outputHostBuffer
102   - void* outputHostBuffer = malloc(outBufferSize);
103   - // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host
104   - aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize, encodeOutBufferDev_, outBufferSize, ACL_MEMCPY_DEVICE_TO_HOST);
105   - // 释放掉输入输出的device内存
106   - (void)acldvppFree(encodeOutBufferDev_);
107   - encodeOutBufferDev_ = nullptr;
108   - // 数据使用完成后,释放内存
109   - dvpp_jpege_save((char*)outputHostBuffer, outBufferSize, out_file_name);
110   - free(outputHostBuffer);
111   - outputHostBuffer = nullptr;
  50 + ret = aclrtResetDevice(deviceId_);
  51 + if (ret != ACL_SUCCESS) {
  52 + printf("reset device failed");
  53 + }
  54 + printf("end to reset device is %d", deviceId_);
  55 +}
  56 +
  57 +int32_t JpegUtil::jpege_save(char* pcData , uint32_t dataLen, string out_file_name)
  58 +{
  59 + FILE* fd = nullptr;
  60 + fd = fopen(out_file_name.c_str(), "wb");
  61 + if (fd == nullptr) {
  62 + printf("open output file err\n");
  63 + return 1;
112 64 }
113 65  
  66 + fwrite(pcData, dataLen, 1, fd);
  67 + fflush(fd);
  68 +
  69 + fclose(fd);
  70 + return 0;
  71 +}
  72 +
  73 +void JpegUtil::jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_name){
  74 +
  75 + aclError aclRet ;
  76 + aclRet = aclrtSetDevice(deviceId_);
  77 + aclrtSetCurrentContext(context_);
  78 +
  79 + // 7. 创建图片编码配置数据,设置编码质量
  80 + // 编码质量范围[0, 100],其中level 0编码质量与level 100差不多,而在[1, 100]内数值越小输出图片质量越差。
  81 + acldvppJpegeConfig *jpegeConfig_ = acldvppCreateJpegeConfig();
  82 + acldvppSetJpegeConfigLevel(jpegeConfig_, 100);
  83 +
  84 + // 8. 申请输出内存,申请Device内存encodeOutBufferDev_,存放编码后的输出数据
  85 + uint32_t outBufferSize= 0;
  86 + int ret = acldvppJpegPredictEncSize(encodeInputDesc_, jpegeConfig_, &outBufferSize);
  87 + void *encodeOutBufferDev_ = nullptr;
  88 + ret = acldvppMalloc(&encodeOutBufferDev_, outBufferSize);
  89 +
  90 + // 9. 执行异步编码,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成
  91 + aclRet = acldvppJpegEncodeAsync(dvppChannelDesc_, encodeInputDesc_, encodeOutBufferDev_, &outBufferSize, jpegeConfig_, stream_);
  92 + aclRet = aclrtSynchronizeStream(stream_);
  93 +
  94 + // 该模式下,由于处理结果在Device侧,因此需要调用内存复制接口传输结果数据后,再释放Device侧内存
  95 + // 申请Host内存outputHostBuffer
  96 + void* outputHostBuffer = malloc(outBufferSize);
  97 + // 通过aclrtMemcpy接口将Device的处理结果数据传输到Host
  98 + aclRet = aclrtMemcpy(outputHostBuffer, outBufferSize, encodeOutBufferDev_, outBufferSize, ACL_MEMCPY_DEVICE_TO_HOST);
  99 + // 释放掉输入输出的device内存
  100 + (void)acldvppFree(encodeOutBufferDev_);
  101 + encodeOutBufferDev_ = nullptr;
  102 + // 数据使用完成后,释放内存
  103 + jpege_save((char*)outputHostBuffer, outBufferSize, out_file_name);
  104 + free(outputHostBuffer);
  105 + outputHostBuffer = nullptr;
114 106 }
115 107 \ No newline at end of file
... ...
src/util/JpegUtil.h
... ... @@ -9,13 +9,22 @@
9 9  
10 10 using namespace std;
11 11  
12   -namespace DVPP_UTIL {
  12 +class JpegUtil {
  13 +public:
  14 + int jpeg_init(int32_t deviceId_);
13 15  
14   - int dvpp_jpeg_init(int32_t deviceId_);
  16 + void jpeg_release();
15 17  
16   - void dvpp_jpeg_release();
  18 + void jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_name);
17 19  
18   - void dvpp_jpeg_encode(acldvppPicDesc *encodeInputDesc_, string out_file_name);
19   -}
  20 +private:
  21 + int32_t jpege_save(char* pcData , uint32_t dataLen, string out_file_name);
  22 +
  23 +private:
  24 + int32_t deviceId_;
  25 + aclrtContext context_;
  26 + aclrtStream stream_;
  27 + acldvppChannelDesc *dvppChannelDesc_;
  28 +};
20 29  
21 30 #endif // __JPEG_UTIL_H__
22 31 \ No newline at end of file
... ...
src/util/vpc_util.cpp
... ... @@ -21,54 +21,9 @@
21 21 #define WARN_LOG(fmt, args...) fprintf(stdout, "[WARN] " fmt "\n", ##args)
22 22 #define ERROR_LOG(fmt, args...) fprintf(stderr, "[ERROR] " fmt "\n", ##args)
23 23  
24   -typedef enum Result {
25   - SUCCESS = 0,
26   - FAILED = 1
27   -} Result;
28   -
29   -typedef struct PicDesc {
30   - std::string picName;
31   - int width;
32   - int height;
33   -}PicDesc;
34   -
35   -typedef struct CropPicDesc {
36   - std::string picName;
37   - int left;
38   - int top;
39   - int width;
40   - int height;
41   -}CropPicDesc;
42   -
43   -int32_t deviceId_;
44   -aclrtContext context_;
45   -aclrtStream stream_;
46   -
47   -aclvdecChannelDesc *vdecChannelDesc_;
48   -acldvppStreamDesc *streamInputDesc_;
49   -acldvppPicDesc *picOutputDesc_;
50   -acldvppChannelDesc *dvppChannelDesc_;
51   -uint32_t inBufferSize;
52   -uint32_t inputWidth;
53   -uint32_t inputHeight;
54   -aclrtRunMode runMode;
55   -
56   -PicDesc inPicDesc;
57   -CropPicDesc outPicDesc;
58   -
59   -
60   -
61   -uint32_t AlignmentHelper(uint32_t origSize, uint32_t alignment)
62   -{
63   - if (alignment == 0) {
64   - return 0;
65   - }
66   - uint32_t alignmentH = alignment - 1;
67   - return (origSize + alignmentH) / alignment * alignment;
68   -}
69 24  
70 25  
71   -void dvpp_crop_release()
  26 +void VPCUtil::vpc_crop_release()
72 27 {
73 28 aclError ret;
74 29 // ret = aclrtSetDevice(deviceId_);
... ... @@ -103,33 +58,12 @@ void dvpp_crop_release()
103 58 }
104 59  
105 60  
106   -int dvpp_crop(acldvppPicDesc *input_pic_desc)
  61 +int VPCUtil::vpc_crop(acldvppPicDesc *input_pic_desc, video_object_info obj)
107 62 {
108   - /* 1.ACL initialization */
109   - // aclInit(nullptr);
110   -
111   - /* 2.Run the management resource application, including Device, Context, Stream */
112   - aclrtSetDevice(deviceId_);
113   - aclrtCreateContext(&context_, deviceId_);
114   - aclrtCreateStream(&stream_);
115   - aclrtGetRunMode(&runMode);
116   -
117   - /* 3.Initialization parameters: width and height of the original image, crop width and height.
118   - * Initialize folder: Output folder */
119   -
120   - outPicDesc={"output.jpg", 100, 100, 300, 300};
121   -
122   - const int orimodelInputWidth = outPicDesc.width; // cur model shape is 224 * 224
123   - const int orimodelInputHeight = outPicDesc.height;
124   - const int modelInputLeft = outPicDesc.left; // cur model shape is 224 * 224
125   - const int modelInputTop = outPicDesc.top;
126   -
127   - /* 4. Channel description information when creating image data processing channels,
128   - * dvppChannelDesc_ is acldvppChannelDesc type */
129   - dvppChannelDesc_ = acldvppCreateChannelDesc();
130   -
131   - /* 5. Create the image data processing channel. */
132   - acldvppCreateChannel(dvppChannelDesc_);
  63 + const int orimodelInputWidth = obj.right - obj.left; // cur model shape is 224 * 224
  64 + const int orimodelInputHeight = obj.bottom - obj.top;
  65 + const int modelInputLeft = obj.left; // cur model shape is 224 * 224
  66 + const int modelInputTop = obj.top;
133 67  
134 68 // GetPicDevBuffer4JpegD
135 69 int modelInputWidth = (orimodelInputWidth + 15) / 16 * 16;
... ... @@ -161,8 +95,6 @@ int dvpp_crop(acldvppPicDesc *input_pic_desc)
161 95  
162 96 ret = aclrtSynchronizeStream(stream_);
163 97  
164   - DVPP_UTIL::dvpp_jpeg_encode(vpcOutputDesc_, "output.jpg");
165   -
166 98 /* DestroycropResource */
167 99 (void)acldvppDestroyRoiConfig(cropArea_);
168 100 cropArea_ = nullptr;
... ... @@ -174,10 +106,10 @@ int dvpp_crop(acldvppPicDesc *input_pic_desc)
174 106 vpcOutBufferDev_ = nullptr;
175 107 }
176 108  
177   - return SUCCESS;
  109 + return 0;
178 110 }
179 111  
180   -int dvpp_crop_init(int32_t devId){
  112 +int VPCUtil::vpc_crop_init(int32_t devId){
181 113 deviceId_ = devId;
182 114  
183 115 aclError ret;
... ... @@ -185,7 +117,6 @@ int dvpp_crop_init(int32_t devId){
185 117 aclrtSetDevice(deviceId_);
186 118 aclrtCreateContext(&context_, deviceId_);
187 119 aclrtCreateStream(&stream_);
188   - aclrtGetRunMode(&runMode);
189 120  
190 121 // channel 准备
191 122 dvppChannelDesc_ = acldvppCreateChannelDesc();
... ... @@ -193,7 +124,7 @@ int dvpp_crop_init(int32_t devId){
193 124  
194 125 }
195 126  
196   -void check_coordinate(uint32_t& cropLeftOffset, uint32_t& cropRightOffset, uint32_t& cropTopOffset, uint32_t& cropBottomOffset, uint32_t width, uint32_t height){
  127 +static void check_coordinate(uint32_t& cropLeftOffset, uint32_t& cropRightOffset, uint32_t& cropTopOffset, uint32_t& cropBottomOffset, uint32_t width, uint32_t height){
197 128 if (cropLeftOffset < 0){
198 129 cropLeftOffset = 0;
199 130 }
... ... @@ -209,7 +140,7 @@ void check_coordinate(uint32_t&amp; cropLeftOffset, uint32_t&amp; cropRightOffset, uint3
209 140  
210 141 }
211 142  
212   -vector<vpc_img_info> dvpp_crop_batch(DeviceMemory *devMem, vector<video_object_info> objs){
  143 +vector<vpc_img_info> VPCUtil::vpc_crop_batch(DeviceMemory *devMem, vector<video_object_info> objs){
213 144  
214 145 vector<vpc_img_info> vec_img_info;
215 146  
... ... @@ -324,7 +255,7 @@ vector&lt;vpc_img_info&gt; dvpp_crop_batch(DeviceMemory *devMem, vector&lt;video_object_i
324 255 // vpcOutputDesc = acldvppGetPicDesc(outputBatchPicDesc_, i);
325 256 // string file_name = "output";
326 257 // file_name = file_name + to_string(i) + ".jpg";
327   - // dvpp_jpeg_encode(vpcOutputDesc, file_name);
  258 + // vpc_jpeg_encode(vpcOutputDesc, file_name);
328 259 }
329 260  
330 261 aclrtSetCurrentContext(context_);
... ... @@ -365,7 +296,7 @@ vector&lt;vpc_img_info&gt; dvpp_crop_batch(DeviceMemory *devMem, vector&lt;video_object_i
365 296 return vec_img_info;
366 297 }
367 298  
368   -vpc_img_info dvpp_devMem2vpcImg(DeviceMemory *devMem){
  299 +vpc_img_info VPCUtil::vpc_devMem2vpcImg(DeviceMemory *devMem){
369 300 vpc_img_info img_info ;
370 301  
371 302 int nBufferSize = devMem->getSize();
... ... @@ -398,7 +329,7 @@ vpc_img_info dvpp_devMem2vpcImg(DeviceMemory *devMem){
398 329 return img_info;
399 330 }
400 331  
401   -void dvpp_img_release(vpc_img_info img_info){
  332 +void VPCUtil::vpc_img_release(vpc_img_info img_info){
402 333 if(img_info.pic_desc != nullptr){
403 334 void *outputDataDev = acldvppGetPicDescData(img_info.pic_desc);
404 335 acldvppFree(outputDataDev);
... ... @@ -406,9 +337,9 @@ void dvpp_img_release(vpc_img_info img_info){
406 337 }
407 338 }
408 339  
409   -void dvpp_imgList_release(vector<vpc_img_info>& imgList){
  340 +void VPCUtil::vpc_imgList_release(vector<vpc_img_info>& imgList){
410 341 for(int i=0; i < imgList.size(); i++){
411   - dvpp_img_release(imgList[i]);
  342 + vpc_img_release(imgList[i]);
412 343 }
413 344 imgList.clear();
414 345 }
415 346 \ No newline at end of file
... ...
src/util/vpc_util.h
... ... @@ -22,17 +22,31 @@ struct vpc_img_info{
22 22  
23 23 class DeviceMemory;
24 24  
25   -int dvpp_crop(acldvppPicDesc *input_pic_desc);
  25 +class VPCUtil {
26 26  
27   -int dvpp_crop_init(int32_t devId);
  27 +public:
  28 + int vpc_crop(acldvppPicDesc *input_pic_desc, video_object_info obj);
28 29  
29   -vector<vpc_img_info> dvpp_crop_batch(DeviceMemory *devMem, vector<video_object_info> objs);
  30 + int vpc_crop_init(int32_t devId);
30 31  
31   -void dvpp_img_release(vpc_img_info );
32   -void dvpp_imgList_release(vector<vpc_img_info>& );
  32 + vector<vpc_img_info> vpc_crop_batch(DeviceMemory *devMem, vector<video_object_info> objs);
  33 +
  34 + void vpc_img_release(vpc_img_info );
  35 +
  36 + void vpc_imgList_release(vector<vpc_img_info>& );
  37 +
  38 + void vpc_crop_release();
  39 +
  40 + vpc_img_info vpc_devMem2vpcImg(DeviceMemory *devMem);
  41 +
  42 +private:
  43 + int32_t deviceId_;
  44 + aclrtContext context_;
  45 + aclrtStream stream_;
  46 +
  47 + acldvppChannelDesc *dvppChannelDesc_;
  48 +};
33 49  
34   -void dvpp_crop_release();
35 50  
36   -vpc_img_info dvpp_devMem2vpcImg(DeviceMemory *devMem);
37 51  
38 52 #endif //___VPC_UTIL_H__
39 53 \ No newline at end of file
... ...