aa421701136

aa421701136

1个粉丝

17

问答

0

专栏

0

资料

aa421701136  发布于  2017-09-07 11:27:39
采纳率 0%
17个问答
4510

Hi3519图像数据格式转换

 
大家好,我想在程序中获取一帧的数据来进行处理,通过HI_MPI_VPSS_GetChnFrame是可以获取到数据的,数据格式是YUV420SP。而这边处理需要使用RGB格式的。在论坛里面,发现可以通过调用函数来进行转换,但是这样的话比较耗CPU的资源。
想问下Hi3519上面,有没有硬件上的功能可以完成YUV420SP-->RGB转换的?
我来回答
回答8个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-09-07 11:34:23
认可0
楼主可以看看IVE

aa421701136

1个粉丝

17

问答

0

专栏

0

资料

aa421701136 2017-09-07 18:16:47
认可0
我在IVE的参考手册中看到有一个函数是完成色彩空间转换任务的:HI_S32 HI_MPI_IVE_CSC(IVE_HANDLE *pIveHandle, IVE_SRC_IMAGE_S *pstSrc,
IVE_DST_IMAGE_S *pstDst, IVE_CSC_CTRL_S *pstCscCtrl, HI_BOOL bInstant);
但是一直没能成功,遇到如下两个问题:
(1)通过HI_S32 HI_MPI_VPSS_GetChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VIDEO_FRAME_INFO_S *pstVideoFrame, HI_S32 s32MilliSec);,不知道得到的pstVideoFrame要如何传给IVE_SRC_IMAGE_S *pstSrc这个参数;
(2)想申请内存空间传递给参数IVE_DST_IMAGE_S *pstDst这个参数,但申请不成功
不知道有没有哪位有Hi3519上,使用HI_MPI_IVE_CSC的例子可以提供参考一下的?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-09-08 09:09:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=63598&ptid=23411]aa421701136 发表于 2017-9-7 18:16[/url]
我在IVE的参考手册中看到有一个函数是完成色彩空间转换任务的:HI_S32 HI_MPI_IVE_CSC(IVE_HANDLE *pIveHan ...[/quote]

IVE_SRC_IMAGE_S stSrc;
IVE_DST_IMAGE_S stDst;
VIDEO_FRAME_INFO_S stVideoFrame;
IVE_CSC_CTRL_S stCscCtrl;

...
HI_S32 HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stVideoFrame, -1);

memset(&stSrc, 0, sizeof(IVE_SRC_IMAGE_S));
stSrc.enType = IVE_IMAGE_TYPE_YUV420SP;
stSrc.u32PhyAddr[0] = stVideoFrame.stVFrame.u32PhyAddr[0];
stSrc.u32PhyAddr[1] = stVideoFrame.stVFrame.u32PhyAddr[1];
stSrc.u32PhyAddr[2] = stVideoFrame.stVFrame.u32PhyAddr[2];
stSrc.u16Stride[0]  = stVideoFrame.stVFrame.u32Stride[0];
stSrc.u16Stride[1]  = stVideoFrame.stVFrame.u32Stride[1];
stSrc.u16Stride[2]  = stVideoFrame.stVFrame.u32Stride[2];
stSrc.u16Width      = stVideoFrame.stVFrame.u32Width;
stSrc.u16Height     = stVideoFrame.stVFrame.u32Height;

// 如果是输出为BGR package格式(B0G0R0B1G1R1...), 那么只要u32PhyAddr[0]/u16Stride[0]
memset(&stDst, 0, sizeof(IVE_DST_IMAGE_S));
stSrc.enType       = IVE_IMAGE_TYPE_U8C3_PACKAGE;
stSrc.u16Width     = stVideoFrame.stVFrame.u32Width;
stSrc.u16Height    = stVideoFrame.stVFrame.u32Height;
stSrc.u16Stride[0] = (((stVideoFrame.stVFrame.u32Width + 15) >> 4) << 4);

s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&stDst.u32PhyAddr[0], (HI_VOID *)&stDst.pu8VirAddr[0], "DstImg",
        HI_NULL, stSrc.u16Stride[0] * stSrc.u16Height * 3);

stCscCtrl.enMode = IVE_CSC_MODE_VIDEO_BT601_YUV2RGB;
HI_MPI_IVE_CSC(pIveHandle, &stSrc, &stDst, &stCscCtrl, bInstant);
...

伪代码, 仅供参考

aa421701136

1个粉丝

17

问答

0

专栏

0

资料

aa421701136 2017-09-08 11:33:15
认可0
static HI_VOID * SAMPLE_IVE_MdProc(HI_VOID * pArgs)
{
    HI_S32 s32Ret;
    VIDEO_FRAME_INFO_S stBaseFrmInfo;
    VPSS_GRP s32VpssGrp = 0;
    HI_S32 s32MilliSec = 20000;
    //创建HI_MPI_IVE_DMA需要的两个地址结构体,分别传值原地址和目的地址
    IVE_IMAGE_S stSrc;
    IVE_IMAGE_S stDst;
    HI_BOOL bInstant = HI_TRUE;
    IVE_HANDLE IveHandle;  
    IVE_CSC_CTRL_S stCscCtrl;   
    stCscCtrl.enMode = IVE_CSC_MODE_PIC_BT601_YUV2RGB;//IVE_CSC_MODE_VIDEO_BT601_YUV2RGB;
    while(1)
    {
        s32Ret = HI_MPI_VPSS_GetChnFrame(s32VpssGrp, VPSS_CHN2, &stBaseFrmInfo, s32MilliSec);               
        if(HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_VPSS_GetChnFrame failed, VPSS_GRP(%d), VPSS_CHN(%d), Error(%#x)!\n",s32VpssGrp, VPSS_CHN2, s32Ret);
            continue;
        }else
        {
            stSrc.enType = IVE_IMAGE_TYPE_YUV420SP;
            stSrc.u32PhyAddr[0]= stBaseFrmInfo.stVFrame.u32PhyAddr[0];//pUserPageAddr;//
            stSrc.u32PhyAddr[1]= stBaseFrmInfo.stVFrame.u32PhyAddr[1];
            stSrc.u32PhyAddr[2]= stBaseFrmInfo.stVFrame.u32PhyAddr[2];
            stSrc.pu8VirAddr[0]= stBaseFrmInfo.stVFrame.pVirAddr[0];  
            stSrc.pu8VirAddr[1]= stBaseFrmInfo.stVFrame.pVirAddr[1];
            stSrc.pu8VirAddr[2]= stBaseFrmInfo.stVFrame.pVirAddr[2];
            stSrc.u16Stride[0] = stBaseFrmInfo.stVFrame.u32Stride[0];
            stSrc.u16Stride[1] = stBaseFrmInfo.stVFrame.u32Stride[1];
            stSrc.u16Stride[2] = stBaseFrmInfo.stVFrame.u32Stride[2];
            stSrc.u16Width = stBaseFrmInfo.stVFrame.u32Width;
            stSrc.u16Height = stBaseFrmInfo.stVFrame.u32Height;

            stDst.enType = IVE_IMAGE_TYPE_U8C3_PACKAGE;
            s32Ret = HI_MPI_IVE_CSC(&IveHandle,&stSrc, &stDst, &stCscCtrl,bInstant);
            if(HI_SUCCESS!=s32Ret)
            {
                        SAMPLE_PRT("\nHI_MPI_IVE_CSC YUV420SP to BGR failed : Error(%#x)!!!!!!\n",s32Ret);
            }
            s32Ret = HI_MPI_VPSS_ReleaseChnFrame(s32VpssGrp,VPSS_CHN2, &stBaseFrmInfo);
            if (HI_SUCCESS != s32Ret)
            {
                SAMPLE_PRT("HI_MPI_VPSS_ReleaseChnFrame fail,Grp(%d) chn(%d),Error(%#x)\n",s32VpssGrp,VPSS_CHN2,s32Ret);       
            }
        }
    }
    return HI_NULL;
}

然后在调用HI_MPI_IVE_CSC函数时,一直提示错误0xa01d8003,是哪个地方参数错误?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-09-08 11:51:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=63666&ptid=23411]aa421701136 发表于 2017-9-8 11:33[/url]
static HI_VOID * SAMPLE_IVE_MdProc(HI_VOID * pArgs)
{
    HI_S32 s32Ret;
[/quote]

stDst 都没有赋值,这个是输入, 大小没有设,内存也没开

aa421701136

1个粉丝

17

问答

0

专栏

0

资料

aa421701136 2017-09-08 15:54:38
认可0
非常感谢你的帮忙。现在已经没有报错了。
static HI_VOID * SAMPLE_IVE_MdProc(HI_VOID * pArgs)
{
    HI_S32 s32Ret;
    VIDEO_FRAME_INFO_S stBaseFrmInfo;
    VPSS_GRP s32VpssGrp = 0;
    HI_S32 s32MilliSec = 20000;

    //创建HI_MPI_IVE_DMA需要的两个地址结构体,分别传值原地址和目的地址
    IVE_IMAGE_S stSrc;
    IVE_IMAGE_S stDst;
    HI_BOOL bInstant = HI_TRUE;
    IVE_HANDLE IveHandle;  
    IVE_CSC_CTRL_S stCscCtrl;   
    stCscCtrl.enMode = IVE_CSC_MODE_VIDEO_BT601_YUV2RGB;//IVE_CSC_MODE_VIDEO_BT601_YUV2RGB;
s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&stDst.u32PhyAddr[0], (HI_VOID *)&stDst.pu8VirAddr[0], "DstImg", HI_NULL, 1920 * 1080 * 3);
if(HI_SUCCESS!=s32Ret)
            printf("HI_MPI_SYS_MmzAlloc_Cached...\n");
    while(1)
    {
        s32Ret = HI_MPI_VPSS_GetChnFrame(s32VpssGrp, VPSS_CHN2, &stBaseFrmInfo, s32MilliSec);               
        if(HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_VPSS_GetChnFrame failed, VPSS_GRP(%d), VPSS_CHN(%d), Error(%#x)!\n",s32VpssGrp, VPSS_CHN2, s32Ret);
            continue;
        }else
        {
            stSrc.enType = IVE_IMAGE_TYPE_YUV420SP;
            stSrc.u32PhyAddr[0]= stBaseFrmInfo.stVFrame.u32PhyAddr[0];//pUserPageAddr;//
            stSrc.u32PhyAddr[1]= stBaseFrmInfo.stVFrame.u32PhyAddr[1];
            stSrc.u32PhyAddr[2]= stBaseFrmInfo.stVFrame.u32PhyAddr[2];
            stSrc.pu8VirAddr[0]= stBaseFrmInfo.stVFrame.pVirAddr[0];  
            stSrc.pu8VirAddr[1]= stBaseFrmInfo.stVFrame.pVirAddr[1];
            stSrc.pu8VirAddr[2]= stBaseFrmInfo.stVFrame.pVirAddr[2];
            stSrc.u16Stride[0] = stBaseFrmInfo.stVFrame.u32Stride[0];
            stSrc.u16Stride[1] = stBaseFrmInfo.stVFrame.u32Stride[1];
            stSrc.u16Stride[2] = stBaseFrmInfo.stVFrame.u32Stride[2];
            stSrc.u16Width = stBaseFrmInfo.stVFrame.u32Width;
            stSrc.u16Height = stBaseFrmInfo.stVFrame.u32Height;

            stDst.enType = IVE_IMAGE_TYPE_U8C3_PACKAGE;
            stDst.u16Width     = stBaseFrmInfo.stVFrame.u32Width;
            stDst.u16Height    = stBaseFrmInfo.stVFrame.u32Height;
            stDst.u16Stride[0] = (((stBaseFrmInfo.stVFrame.u32Width + 15) >> 4) << 4);



            s32Ret = HI_MPI_IVE_CSC(&IveHandle,&stSrc, &stDst, &stCscCtrl,bInstant);
            if(HI_SUCCESS!=s32Ret)
            {
                        SAMPLE_PRT("\nHI_MPI_IVE_CSC YUV420SP to BGR failed : Error(%#x)!!!!!!\n",s32Ret);
            }
            s32Ret = HI_MPI_VPSS_ReleaseChnFrame(s32VpssGrp,VPSS_CHN2, &stBaseFrmInfo);
            if (HI_SUCCESS != s32Ret)
            {
                SAMPLE_PRT("HI_MPI_VPSS_ReleaseChnFrame fail,Grp(%d) chn(%d),Error(%#x)\n",s32VpssGrp,VPSS_CHN2,s32Ret);       
            }
        }
    }
    return HI_NULL;
}

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-09-08 15:57:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=63684&ptid=23411]aa421701136 发表于 2017-9-8 15:54[/url]
非常感谢你的帮忙。现在已经没有报错了。
static HI_VOID * SAMPLE_IVE_MdProc(HI_VOID * pArgs)
{
[/quote]

有点小问题:

HI_MPI_SYS_MmzAlloc分配的内存没有释放

aa421701136

1个粉丝

17

问答

0

专栏

0

资料

aa421701136 2017-09-08 17:17:11
认可0
我只是为了测试一下HI_MPI_IVE_CSC进行彩色空间转换是否成功,没有在意这个细节。我后面要再优化一下,谢谢提醒。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区