#include "VpcPicConverter.h" #include "depend_headers.h" #define ALIGN_UP(val, align) (((val) % (align) == 0) ? (val) : (((val) / (align) + 1) * (align))) VpcPicConverter::VpcPicConverter(){ } VpcPicConverter::~VpcPicConverter(){ if(nullptr == stream_){ aclrtDestroyStream(stream_); } } int VpcPicConverter::init(aclrtContext context, string dec_name){ m_dec_name = dec_name; CHECK_AND_RETURN(aclrtSetCurrentContext(context), "aclrtSetCurrentContext failed"); CHECK_AND_RETURN(aclrtCreateStream(&stream_), "aclrtCreateStream failed! "); dvppChannelDesc_ = acldvppCreateChannelDesc(); int ret = ACL_ERROR_NONE; do { ret = acldvppCreateChannel(dvppChannelDesc_); CHECK_AND_BREAK(ret, "acldvppCreateChannel failed !"); ret = acldvppSetChannelDescMode(dvppChannelDesc_, DVPP_CHNMODE_VPC); CHECK_AND_BREAK(ret, "acldvppSetChannelDescMode failed !"); } while (0); return ret; } DvppRgbMemory* VpcPicConverter::convert2bgr(acldvppPicDesc *inputDesc_, int out_width, int out_height, bool key_frame){ 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); acldvppDestroyPicDesc(outputDesc_); if(ret != ACL_ERROR_NONE){ delete rgbMem; rgbMem = nullptr; } return rgbMem; }