M_chenyang

M_chenyang

1个粉丝

14

问答

0

专栏

0

资料

M_chenyang  发布于  2018-12-11 10:12:12
采纳率 0%
14个问答
2794

IVE的DMA数据拷贝问题

 
格式为YUV420SP:
HI_S32  HISI_COMM_IVE_Copy(HI_U64 srcPhyAddr, HI_U64 dstPhyAddr, HI_U32 width, HI_U32 height, HI_U32 stride, HI_BOOL bInstant)
{
    HI_S32 s32Ret;
    IVE_HANDLE hIveHandle;
    IVE_SRC_DATA_S stSrcData;
    IVE_DST_DATA_S stDstData;
    IVE_DMA_CTRL_S stCtrl = {IVE_DMA_MODE_DIRECT_COPY,0};
    HI_BOOL bFinish = HI_FALSE;
    HI_BOOL bBlock = HI_TRUE;

    //fill src
    stSrcData.u64PhyAddr = srcPhyAddr;
    stSrcData.u32Width   = width;
    stSrcData.u32Height  = height;
    stSrcData.u32Stride  = stride;

    //fill dst
    stDstData.u64PhyAddr = dstPhyAddr;
    stDstData.u32Width   = stSrcData.u32Width;
    stDstData.u32Height  = stSrcData.u32Height;
    stDstData.u32Stride  = stSrcData.u32Stride;
   
    s32Ret = HI_MPI_IVE_DMA(&hIveHandle, &stSrcData, &stDstData, &stCtrl, bInstant);
    if (HI_SUCCESS != s32Ret)
    {
        printf("Error(%#x),HI_MPI_IVE_DMA s[%#x] d[%#x] failed!\n", s32Ret, srcPhyAddr, dstPhyAddr);
        return s32Ret;
    }
   
    if (HI_TRUE == bInstant)
    {
        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);
        }
        
        if (HI_SUCCESS != s32Ret)
        {
            printf("Error(%#x),HI_MPI_IVE_Query failed!\n", s32Ret);
            return s32Ret;
        }
    }
   
    return HI_SUCCESS;
}

调用一次HISI_COMM_IVE_Copy接口只拷贝了Y平面,UV平面不知道要怎么拷贝,width,height,stride是怎么传的?
我来回答
回答1个
时间排序
认可量排序

qn1533290982

0个粉丝

1

问答

0

专栏

0

资料

qn1533290982 2020-03-11 14:04:59
认可0
//yuv420 的y数据和uv数据需要搬移两次
        //copy Y data
        bInstant = HI_TRUE;
        stSrc.pu8VirAddr = (HI_U8*)p_src_stFrameInfo->stVFrame.pVirAddr[0];
        stSrc.u32PhyAddr = p_src_stFrameInfo->stVFrame.u32PhyAddr[0] + p_src_rect->s32X + p_src_rect->s32Y * VO_W;
        stSrc.u16Stride = (HI_U16)p_src_stFrameInfo->stVFrame.u32Stride[0];
        stSrc.u16Width = (HI_U16)p_src_rect->u32Width;
        stSrc.u16Height = (HI_U16)p_src_rect->u32Height;   

        stDst.pu8VirAddr = stVFrame1.stVFrame.pVirAddr[0];  //DMA只需要关心物理地址,用户态地址可以不用
        stDst.u32PhyAddr = stVFrame1.stVFrame.u32PhyAddr[0] + p_dst_rect->s32X + p_dst_rect->s32Y * VO_W;
        stDst.u16Stride = stVFrame1.stVFrame.u32Stride[0];
        stDst.u16Width = (HI_U16)p_dst_rect->u32Width;
        stDst.u16Height = (HI_U16)p_dst_rect->u32Height;

        s32Ret = HI_MPI_SYS_MmzFlushCache(0, NULL, 0);
        SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret, "HI_MPI_SYS_MmzFlushCache fail,Error(%#x)\n",s32Ret);

        s32Ret = HI_MPI_IVE_DMA(&IveHandle,&stSrc,&stDst,&stDmaCtrl,bInstant);
        SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret, "HI_MPI_IVE_DMA fail,Error(%#x)\n",s32Ret);
       
        //copy UV data
        stSrc.pu8VirAddr = (HI_U8*)p_src_stFrameInfo->stVFrame.pVirAddr[1];
        stSrc.u32PhyAddr = p_src_stFrameInfo->stVFrame.u32PhyAddr[1] + p_src_rect->s32X + p_src_rect->s32Y/2 * VO_W;
        stSrc.u16Stride = (HI_U16)p_src_stFrameInfo->stVFrame.u32Stride[1];
        stSrc.u16Width = (HI_U16)p_src_rect->u32Width;
        stSrc.u16Height = (HI_U16)p_src_rect->u32Height/2;
            
        stDst.pu8VirAddr = stVFrame1.stVFrame.pVirAddr[1];
        stDst.u32PhyAddr = stVFrame1.stVFrame.u32PhyAddr[1] + p_dst_rect->s32X + p_dst_rect->s32Y/2 * VO_W;
        stDst.u16Stride = stVFrame1.stVFrame.u32Stride[1];
        stDst.u16Width = (HI_U16)p_dst_rect->u32Width;
        stDst.u16Height = (HI_U16)p_dst_rect->u32Height/2;  

        s32Ret = HI_MPI_SYS_MmzFlushCache(0, NULL, 0);
        SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret, "HI_MPI_SYS_MmzFlushCache fail,Error(%#x)\n",s32Ret);
       
        s32Ret = HI_MPI_IVE_DMA(&IveHandle,&stSrc,&stDst,&stDmaCtrl,bInstant);
        SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret,s32Ret, "HI_MPI_IVE_DMA fail,Error(%#x)\n",s32Ret);
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区