Wintoki

Wintoki

2个粉丝

3

问答

0

专栏

0

资料

Wintoki  发布于  2024-05-14 22:33:40
采纳率 67%
3个问答
80

在hi3516dv300开发板上把rgb格式的ive图像转为yuv视频帧

悬赏E币 5 个
已结题

如题,论坛里和csdn里已经有不少关于yuv视频帧转rgb图像的方法了,然而并没有能将ive图像反过来转为yuv视频帧的办法。
自己尝试着写了一个api,结果报了个莫名奇妙的错。

代码如下所示:

HI_S32 rgb2yuvFrame(IPC_IMAGE *srcImage, VIDEO_FRAME_INFO_S *dstFrame)
{
    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_RGB2YUV;
    pstSrc.enType = IVE_IMAGE_TYPE_U8C3_PACKAGE;
    pstSrc.u32Width = srcImage->u32Width;
    pstSrc.u32Height = srcImage->u32Height;
    pstSrc.au64PhyAddr[0] = srcImage->u64PhyAddr;
    pstSrc.au64PhyAddr[1] = 0;
    pstSrc.au64PhyAddr[2] = 0;
    pstSrc.au64VirAddr[0] = srcImage->u64VirAddr;
    pstSrc.au64VirAddr[1] = 0;
    pstSrc.au64VirAddr[2] = 0;
    pstSrc.au32Stride[0] = 1280;
    pstSrc.au32Stride[1] = 0;
    pstSrc.au32Stride[2] = 0;

    pstDst.enType = IVE_IMAGE_TYPE_YUV420SP;
    pstDst.u32Width = pstSrc.u32Width;
    pstDst.u32Height = pstSrc.u32Height;

    s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&pstDst.au64PhyAddr[0], (void **)&pstDst.au64VirAddr[0],
                                        "User", HI_NULL, pstDst.u32Height * pstSrc.au32Stride[0] * 3);
    if (HI_SUCCESS != s32Ret)
    {
        HI_MPI_SYS_MmzFree(pstDst.au64PhyAddr[0], (void *)pstDst.au64VirAddr[0]);
        SAMPLE_PRT("HI_MPI_SYS_MmzFree err\n");
        return s32Ret;
    }
    s32Ret = HI_MPI_SYS_MmzFlushCache(pstDst.au64PhyAddr[0], (void *)pstDst.au64VirAddr[0],
                                      pstDst.u32Height * pstSrc.au32Stride[0] * 3);
    if (HI_SUCCESS != s32Ret)
    {
        HI_MPI_SYS_MmzFree(pstDst.au64PhyAddr[0], (void *)pstDst.au64VirAddr[0]);
        SAMPLE_PRT("HI_MPI_SYS_MmzFree err\n");
        return s32Ret;
    }
    memset((void *)pstDst.au64VirAddr[0], 0, pstDst.u32Height * pstSrc.au32Stride[0] * 3);
    HI_BOOL bInstant = HI_TRUE;
    s32Ret = HI_MPI_IVE_CSC(&hIveHandle, &pstSrc, &pstDst, &stCscCtrl, bInstant);
    if (HI_SUCCESS != s32Ret)
    {
        HI_MPI_SYS_MmzFree(pstDst.au64PhyAddr[0], (void *)pstDst.au64VirAddr[0]);
        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);
        }
    }
    dstFrame->stVFrame.u64VirAddr[0] = pstDst.au64VirAddr[0];
    dstFrame->stVFrame.u64VirAddr[1] = pstDst.au64VirAddr[1];
    dstFrame->stVFrame.u64VirAddr[2] = pstDst.au64VirAddr[2];

    dstFrame->stVFrame.u64PhyAddr[0] = pstDst.au64PhyAddr[0];
    dstFrame->stVFrame.u64PhyAddr[1] = pstDst.au64PhyAddr[1];
    dstFrame->stVFrame.u64PhyAddr[2] = pstDst.au64PhyAddr[2];

    dstFrame->stVFrame.u32Stride[0] = pstDst.au32Stride[0];
    dstFrame->stVFrame.u32Stride[1] = pstDst.au32Stride[1];
    dstFrame->stVFrame.u32Stride[2] = pstDst.au32Stride[2];
    return HI_SUCCESS;
}

SDK的版本号是spc020,希望哪位大神能可怜一下我这个学生党吧,急!

我来回答
回答2个
时间排序
认可量排序

UncleRoderick

29个粉丝

14

问答

1

专栏

14

资料

UncleRoderick 2024-05-15 09:13:36 已获得 1.00 E币
认可0
易百纳技术社区该回答已被题主采纳为最佳答案

你的RGB数据是PLANAR还是PACKAGE的?
怎么只给了一个通道的地址赋值?

Wintoki
Wintoki   回复   UncleRoderick  2024-05-15 20:50:32
0

PACKAGE

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区