VpcPicConverter.cpp
3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "VpcPicConverter.h"
#include "depend_headers.h"
#define ALIGN_UP(val, align) (((val) % (align) == 0) ? (val) : (((val) / (align) + 1) * (align)))
bool VpcPicConverter::init(aclrtContext context){
aclrtSetCurrentContext(context);
aclrtCreateStream(&stream_);
// 3. 创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型
dvppChannelDesc_ = acldvppCreateChannelDesc();
// 4. 创建图片数据处理的通道。
int ret = acldvppCreateChannel(dvppChannelDesc_);
if(ret != ACL_ERROR_NONE){
LOG_ERROR("acldvppCreateChannel failed !");
return false;
}
ret = acldvppSetChannelDescMode(dvppChannelDesc_, DVPP_CHNMODE_VPC);
if(ret != ACL_ERROR_NONE){
LOG_ERROR("acldvppSetChannelDescMode failed !");
return false;
}
return true;
}
DvppRgbMemory* VpcPicConverter::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, int out_height, bool key_frame){
// 8. 创建色域转换的输出图片的描述信息,并设置各属性值, 输出的宽和高要求和输入一致
// 如果色域转换的输出图片作为模型推理的输入,则输出图片的宽高要与模型要求的宽高保持一致
// outputDesc_是acldvppPicDesc类型
int out_buf_width = ALIGN_UP(out_width, 16) * 3;
int out_buf_height = ALIGN_UP(out_height, 2);
int out_buf_size = out_buf_width * out_buf_height;
DvppRgbMemory* rgbMem = new DvppRgbMemory(3, out_buf_width, out_buf_height, out_buf_size, "", to_string(m_devId), key_frame);
void *outBufferDev_ = (void*)rgbMem->getMem();
acldvppPicDesc *outputDesc_= acldvppCreatePicDesc();
acldvppSetPicDescData(outputDesc_, outBufferDev_);
acldvppSetPicDescFormat(outputDesc_, PIXEL_FORMAT_BGR_888);
acldvppSetPicDescWidth(outputDesc_, out_width);
acldvppSetPicDescHeight(outputDesc_, out_height);
acldvppSetPicDescWidthStride(outputDesc_, out_buf_width);
acldvppSetPicDescHeightStride(outputDesc_, out_buf_height);
acldvppSetPicDescSize(outputDesc_, out_buf_size);
aclError ret = ACL_ERROR_NONE;
do{
// 9. 执行异步色域转换,再调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成
ret = acldvppVpcConvertColorAsync(dvppChannelDesc_, inputDesc_, outputDesc_, stream_);
if(ret != ACL_ERROR_NONE){
LOG_ERROR("acldvppVpcConvertColorAsync failed - out_width:{} out_height:{} out_buf_width:{} out_buf_height:{} out_buf_size:{}", out_width, out_height, out_buf_width, out_buf_height, out_buf_size);
break;
}
ret = aclrtSynchronizeStream(stream_);
if(ret != ACL_ERROR_NONE){
LOG_ERROR("aclrtSynchronizeStream failed - out_width:{} out_height:{} out_buf_width:{} out_buf_height:{} out_buf_size:{}", out_width, out_height, out_buf_width, out_buf_height, out_buf_size);
break;
}
}while(0);
// 10. 色域转换结束后,释放资源,包括输入/输出图片的描述信息、输入/输出内存
// acldvppDestroyPicDesc(inputDesc_);
acldvppDestroyPicDesc(outputDesc_);
if(ret != ACL_ERROR_NONE){
delete rgbMem;
rgbMem = nullptr;
}
return rgbMem;
}
void VpcPicConverter::release(){
aclrtDestroyStream(stream_);
// aclrtDestroyContext(context_);
}