海思3521 通过HiIVE进行MAT格式和VIDEO_FRAME_INFO_S转换

海思3521 通过HiIVE进行MAT格式和VIDEO_FRAME_INFO_S转换

网上有关于Hi3516cv500进行转换的方法https://blog.csdn.net/lishi_1991/article/details/107013752


但是3521D由于调用库函数和3516cv版本不同,需要进行如下修改:

HI_S32 YuvFrame2Rgb(VIDEO_FRAME_INFO_S *srcFrame,IPC_IMAGE *dstImage);

HI_S32 Frame2Mat(VIDEO_FRAME_INFO_S *srcFrame,cv::Mat &dstMat)
{
    HI_U32 w = srcFrame->stVFrame.u32Width;
    HI_U32 h = srcFrame->stVFrame.u32Height;
    int bufLen = w*h*3;
    HI_U8 *srcRGB = NULL;
    IPC_IMAGE dstImage;
    if(YuvFrame2Rgb(srcFrame,&dstImage)!=HI_SUCCESS){
       printf("yuvFrame2rgb Err .\n");
        return HI_FAILURE;
    }
    srcRGB = dstImage.u8VirAddr;
    dstMat.create(h, w, CV_8UC3);
    memcpy(dstMat.data, srcRGB, bufLen*sizeof(HI_U8));
    HI_MPI_SYS_MmzFree(dstImage.u32PhyAddr, &(dstImage.u8VirAddr));
    return HI_SUCCESS;
}

HI_S32 YuvFrame2Rgb(VIDEO_FRAME_INFO_S *srcFrame,IPC_IMAGE *dstImage)
{
    IVE_HANDLE hIveHandle;
    IVE_SRC_IMAGE_S pstSrc;
    IVE_DST_IMAGE_S pstDst;
    IVE_CSC_CTRL_S stCscCtrl;
    HI_S32 s32Ret = 0;
    stCscCtrl.enMode = IVE_CSC_MODE_PIC_BT709_YUV2RGB;//IVE_CSC_MODE_VIDEO_BT601_YUV2RGB;
    pstSrc.enType = IVE_IMAGE_TYPE_YUV420SP;
    pstSrc.pu8VirAddr[0]=(HI_U8 *)srcFrame->stVFrame.pVirAddr[0];
    pstSrc.pu8VirAddr[1]=(HI_U8 *)srcFrame->stVFrame.pVirAddr[1];
    pstSrc.pu8VirAddr[2]=(HI_U8 *)srcFrame->stVFrame.pVirAddr[2];

    pstSrc.u32PhyAddr[0]=srcFrame->stVFrame.u32PhyAddr[0];
    pstSrc.u32PhyAddr[1]=srcFrame->stVFrame.u32PhyAddr[1];
    pstSrc.u32PhyAddr[2]=srcFrame->stVFrame.u32PhyAddr[2];

    pstSrc.u16Stride[0]=srcFrame->stVFrame.u32Stride[0];
    pstSrc.u16Stride[1]=srcFrame->stVFrame.u32Stride[1];
    pstSrc.u16Stride[2]=srcFrame->stVFrame.u32Stride[2];

    pstSrc.u16Width = srcFrame->stVFrame.u32Width;
    pstSrc.u16Height = srcFrame->stVFrame.u32Height;

    pstDst.enType = IVE_IMAGE_TYPE_U8C3_PACKAGE;
    pstDst.u16Width   = pstSrc.u16Width;
    pstDst.u16Height  = pstSrc.u16Height;
    pstDst.u16Stride[0]  = pstSrc.u16Stride[0];
    pstDst.u16Stride[1]  = 0;
    pstDst.u16Stride[2]  = 0;
    s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&pstDst.u32PhyAddr[0], (void **)&pstDst.pu8VirAddr[0], "User", HI_NULL, pstDst.u16Height*pstDst.u16Stride[0]*3);
    if(HI_SUCCESS != s32Ret)
    {
        HI_MPI_SYS_MmzFree(pstDst.u32PhyAddr[0], (void *)pstDst.u32PhyAddr[0]);
        printf("HI_MPI_SYS_MmzAlloc_Cached Failed with %d\n",s32Ret);
        return s32Ret;
    }
    memset((void *)pstDst.pu8VirAddr[0], 0, pstDst.u16Height*pstDst.u16Stride[0]);
    s32Ret = HI_MPI_SYS_MmzFlushCache(pstDst.u32PhyAddr[0], (void *)pstDst.pu8VirAddr[0], pstDst.u16Height*pstDst.u16Stride[0]);
    if(HI_SUCCESS != s32Ret)
    {
        HI_MPI_SYS_MmzFree(pstDst.u32PhyAddr[0], (void *)pstDst.u32PhyAddr[0]);
        printf("HI_MPI_SYS_MmzFlushCache Failed with %d\n",s32Ret);
        return s32Ret;
    }
    HI_BOOL bInstant = HI_TRUE;
    s32Ret = HI_MPI_IVE_CSC(&hIveHandle,&pstSrc,&pstDst,&stCscCtrl,bInstant);
    if(HI_SUCCESS != s32Ret)
    {
        HI_MPI_SYS_MmzFree(pstDst.u32PhyAddr[0], (void *)pstDst.pu8VirAddr[0]);
        printf("HI_MPI_SYS_MmzFree Failed with %d\n",s32Ret);
        return s32Ret;
    }
    if (HI_TRUE == bInstant)
    {
        HI_BOOL bFinish = HI_TRUE;
        HI_BOOL bBlock = HI_TRUE;
        s32Ret = HI_MPI_IVE_Query(hIveHandle,&bFinish,bBlock);
        while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret)
        {
            usleep(100);
            s32Ret = HI_MPI_IVE_Query(hIveHandle,&bFinish,bBlock);
        }
    }
    dstImage->u32PhyAddr = pstDst.u32PhyAddr[0];
    dstImage->u8VirAddr = pstDst.pu8VirAddr[0];
    dstImage->u16Width = pstDst.u16Width;
    dstImage->u16Height = pstDst.u16Height;
    return HI_SUCCESS;
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值