VpcPicConverter.cpp 2.87 KB
#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;
}