Commit e109b00191e1296245a93343245d320454d2eb00
1 parent
4613ed54
修正多显卡问题
Showing
11 changed files
with
211 additions
and
224 deletions
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<algorithm_type_t> 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<DeviceMemory*> 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& cropLeftOffset, uint32_t& 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<vpc_img_info> dvpp_crop_batch(DeviceMemory *devMem, vector<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<vpc_img_info> dvpp_crop_batch(DeviceMemory *devMem, vector<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 | ... | ... |