CropUtil.cpp 1.79 KB
#include "CropUtil.h"
#include "logger.hpp"
#include "sy_errorinfo.h"

CropUtil::CropUtil(/* args */)
{
}

CropUtil::~CropUtil()
{
    release();
}

int CropUtil::init(int devId){
    ACL_CALL(aclrtCreateContext(&m_ctx, devId), ACL_SUCCESS, SY_FAILED);
    
    ACL_CALL(aclrtCreateStream(&stream), ACL_SUCCESS, SY_FAILED);
    m_dvpp = new DvppProcessx();
    int ret = m_dvpp->InitResource(stream);
    if (ret != SY_SUCCESS) {
        delete m_dvpp;
        m_dvpp = nullptr;
        LOG_ERROR("dvpp init failed!");
        return SY_FAILED;
    }

    return SY_SUCCESS;
}

int CropUtil::release(){
    ACL_CALL(aclrtSetCurrentContext(m_ctx), ACL_SUCCESS, SY_FAILED);

    if (m_dvpp) {
        delete m_dvpp;
        m_dvpp = nullptr;
    }

    if (stream != nullptr) {
        int ret = aclrtDestroyStream(stream);
        if (ret != ACL_SUCCESS) {
            LOG_ERROR("destroy stream failed");
        }
        stream = nullptr;
    }

    aclrtDestroyContext(m_ctx);
}

static void adj_position(ImageData& src, uint32_t& xmin, uint32_t& ymin, uint32_t& xmax, uint32_t& ymax) {
    if (xmin < 0)
    {
        xmin = 0;
    }

    if (ymin < 0)
    {
        ymin = 0;
    }

    if (xmax > src.width)
    {
        xmax = src.width;
    }

    if (ymax > src.height)
    {
        ymax = src.height;
    }
}

ImageData* CropUtil::crop(ImageData& src, uint32_t xmin, uint32_t ymin, uint32_t xmax, uint32_t ymax) {
    int ret = aclrtSetCurrentContext(m_ctx);
    if (ACL_SUCCESS != ret)
    {
        return nullptr;
    }

    adj_position(src, xmin, ymin, xmax, ymax);

    int width = xmax - xmin;
    int height = ymax - ymin;
    uint32_t alignWidth = (width + 127) / 128 * 128;
	uint32_t alignHeight = (height  + 15) / 16 * 16;
    return m_dvpp->Crop_naked(src, xmin, ymin, xmax, ymax, alignWidth, alignHeight);
}