jugg

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg  发布于  2019-03-19 14:41:53
采纳率 0%
15个问答
3374

原始帧 通过DMA叠加 会有横条的闪烁

 
参考论坛一位朋友的视频叠加代码
[url=http://bbs.ebaina.com/forum.php?mod=viewthread&tid=56122&highlight=%B5%FE%BC%D3]两路sensor怎么实现图像叠加编码[/url]

原来的代码如下:
[code]

static int AF_ImageOverlay(VIDEO_FRAME_INFO_S *pstSrc1, VIDEO_FRAME_INFO_S *pstSrc2, VIDEO_FRAME_INFO_S *pstDst, unsigned int nOffsetX, unsigned int nOffsetY)
{
        if ((pstSrc1->stVFrame.u32Width < pstSrc2->stVFrame.u32Width) || (pstSrc1->stVFrame.u32Height < pstSrc2->stVFrame.u32Height))
                return -1;
        if ((nOffsetX > (pstSrc1->stVFrame.u32Width - pstSrc2->stVFrame.u32Width)) || (nOffsetY > (pstSrc1->stVFrame.u32Height - pstSrc2->stVFrame.u32Height)))
                return -1;

        IVE_HANDLE hIveHandle;
        IVE_SRC_DATA_S stDataSrc;
        IVE_DST_DATA_S stDataDst;
        IVE_DMA_CTRL_S stCtrl = {IVE_DMA_MODE_DIRECT_COPY, 0};
        HI_BOOL bFinish = HI_FALSE;
        memset(&stDataSrc, 0, sizeof(stDataSrc));
        memset(&stDataDst, 0, sizeof(stDataDst));
        // Src1的Y分量
        stDataSrc.pu8VirAddr = (HI_U8*)pstSrc1->stVFrame.pVirAddr[0];
        stDataSrc.u32PhyAddr = pstSrc1->stVFrame.u32PhyAddr[0];
        stDataSrc.u16Width  = (HI_U16)pstSrc1->stVFrame.u32Width;
        stDataSrc.u16Height  = (HI_U16)pstSrc1->stVFrame.u32Height;
        stDataSrc.u16Stride  = (HI_U16)pstSrc1->stVFrame.u32Stride[0];
        stDataDst.pu8VirAddr = (HI_U8*)pstDst->stVFrame.pVirAddr[0];
        stDataDst.u32PhyAddr = pstDst->stVFrame.u32PhyAddr[0];
        stDataDst.u16Width  = (HI_U16)pstDst->stVFrame.u32Width;
        stDataDst.u16Height  = (HI_U16)pstDst->stVFrame.u32Height;
        stDataDst.u16Stride  = (HI_U16)pstDst->stVFrame.u32Stride[0];
        HI_S32 s32Ret = HI_MPI_IVE_DMA(&hIveHandle, &stDataSrc, &stDataDst, &stCtrl, HI_TRUE);
        if (HI_SUCCESS != s32Ret) {
                AFWARN("HI_MPI_IVE_DMA failed s32Ret[%#x]\n", s32Ret);
        }
       
        do {
                s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, HI_TRUE);
                if (bFinish == HI_FALSE)
                        usleep(100);
        } while (bFinish == HI_FALSE);
        // Src1的UV分量
        unsigned int nOffsetSrc = pstSrc1->stVFrame.u32Stride[0] * pstSrc1->stVFrame.u32Height;
        unsigned int nOffsetDst = pstDst->stVFrame.u32Stride[0] * pstDst->stVFrame.u32Height;
        stDataSrc.pu8VirAddr = (HI_U8*)pstSrc1->stVFrame.pVirAddr[0] + nOffsetSrc;
        stDataSrc.u32PhyAddr = pstSrc1->stVFrame.u32PhyAddr[0] + nOffsetSrc;
        stDataSrc.u16Height  = (HI_U16)pstSrc1->stVFrame.u32Height / 2;
        stDataDst.pu8VirAddr = (HI_U8*)pstDst->stVFrame.pVirAddr[0] + nOffsetDst;
        stDataDst.u32PhyAddr = pstDst->stVFrame.u32PhyAddr[0] + nOffsetDst;
        stDataDst.u16Height  = (HI_U16)pstDst->stVFrame.u32Height / 2;       
        s32Ret = HI_MPI_IVE_DMA(&hIveHandle, &stDataSrc, &stDataDst, &stCtrl, HI_TRUE);
        if (HI_SUCCESS != s32Ret) {
                AFWARN("HI_MPI_IVE_DMA failed s32Ret[%#x]\n", s32Ret);
        }
       
        do {
                s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, HI_TRUE);
                if (bFinish == HI_FALSE)
                        usleep(100);
        } while (bFinish == HI_FALSE);

        // Src2的Y分量
        nOffsetDst = nOffsetY * pstDst->stVFrame.u32Stride[0] + nOffsetX;
        stDataSrc.pu8VirAddr = (HI_U8*)pstSrc2->stVFrame.pVirAddr[0];
        stDataSrc.u32PhyAddr = pstSrc2->stVFrame.u32PhyAddr[0];
        stDataSrc.u16Width  = (HI_U16)pstSrc2->stVFrame.u32Width;
        stDataSrc.u16Height  = (HI_U16)pstSrc2->stVFrame.u32Height;
        stDataSrc.u16Stride  = (HI_U16)pstSrc2->stVFrame.u32Stride[0];
        stDataDst.pu8VirAddr = (HI_U8*)pstDst->stVFrame.pVirAddr[0] + nOffsetDst;
        stDataDst.u32PhyAddr = pstDst->stVFrame.u32PhyAddr[0] + nOffsetDst;
        stDataDst.u16Width  = (HI_U16)pstSrc2->stVFrame.u32Width;
        stDataDst.u16Height  = (HI_U16)pstSrc2->stVFrame.u32Height;
        stDataDst.u16Stride  = (HI_U16)pstDst->stVFrame.u32Stride[0];
        s32Ret = HI_MPI_IVE_DMA(&hIveHandle, &stDataSrc, &stDataDst, &stCtrl, HI_TRUE);
        if (HI_SUCCESS != s32Ret) {
                AFWARN("HI_MPI_IVE_DMA failed s32Ret[%#x]\n", s32Ret);
        }

        do {
                s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, HI_TRUE);
                if (bFinish == HI_FALSE)
                        usleep(100);
        } while (bFinish == HI_FALSE);
        // Src2的UV分量
        nOffsetSrc = pstSrc2->stVFrame.u32Stride[0] * pstSrc2->stVFrame.u32Height;
        nOffsetDst = pstDst->stVFrame.u32Stride[0] * pstDst->stVFrame.u32Height + nOffsetY * pstDst->stVFrame.u32Stride[0] / 2 + nOffsetX;
        stDataSrc.pu8VirAddr = (HI_U8*)pstSrc2->stVFrame.pVirAddr[0] + nOffsetSrc;
        stDataSrc.u32PhyAddr = pstSrc2->stVFrame.u32PhyAddr[0] + nOffsetSrc;
        stDataSrc.u16Height  = (HI_U16)pstSrc2->stVFrame.u32Height / 2;
        stDataDst.pu8VirAddr = (HI_U8*)pstDst->stVFrame.pVirAddr[0] + nOffsetDst;
        stDataDst.u32PhyAddr = pstDst->stVFrame.u32PhyAddr[0] + nOffsetDst;
        stDataDst.u16Height  = (HI_U16)pstSrc2->stVFrame.u32Height / 2;
        s32Ret = HI_MPI_IVE_DMA(&hIveHandle, &stDataSrc, &stDataDst, &stCtrl, HI_TRUE);
        if (HI_SUCCESS != s32Ret) {
                AFWARN("HI_MPI_IVE_DMA failed s32Ret[%#x]\n", s32Ret);
        }

        do {
                s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, HI_TRUE);
                if (bFinish == HI_FALSE)
                        usleep(100);
        } while (bFinish == HI_FALSE);

        return 0;
}

[code]

VPSS获取的图像 图像是yuv420 semi-planar 通过DMA叠加  叠加部分会有横条的闪烁,不重合的地方正常  具体代码如下:
[code]
static int AF_ImageOverlay(VIDEO_FRAME_INFO_S *pstSrc1, VIDEO_FRAME_INFO_S *pstDst, unsigned int nOffsetX, unsigned int nOffsetY)
{
        IVE_HANDLE hIveHandle;
        IVE_SRC_DATA_S stDataSrc;
        IVE_DST_DATA_S stDataDst;
        IVE_DMA_CTRL_S stCtrl = {IVE_DMA_MODE_DIRECT_COPY, 0};
        HI_BOOL bFinish = HI_FALSE;
        memset(&stDataSrc, 0, sizeof(stDataSrc));
        memset(&stDataDst, 0, sizeof(stDataDst));
        // Src1的Y分量
        stDataSrc.pu8VirAddr = (HI_U8*)pstSrc1->stVFrame.pVirAddr[0];
        stDataSrc.u32PhyAddr = pstSrc1->stVFrame.u32PhyAddr[0];
        stDataSrc.u16Width  = (HI_U16)pstSrc1->stVFrame.u32Width;
        stDataSrc.u16Height  = (HI_U16)pstSrc1->stVFrame.u32Height;
        stDataSrc.u16Stride  = (HI_U16)pstSrc1->stVFrame.u32Stride[0];
        stDataDst.pu8VirAddr = (HI_U8*)pstDst->stVFrame.pVirAddr[0];
        stDataDst.u32PhyAddr = pstDst->stVFrame.u32PhyAddr[0];
        stDataDst.u16Width  = (HI_U16)pstDst->stVFrame.u32Width;
        stDataDst.u16Height  = (HI_U16)pstDst->stVFrame.u32Height;
        stDataDst.u16Stride  = (HI_U16)pstDst->stVFrame.u32Stride[0];
        HI_S32 s32Ret = HI_MPI_IVE_DMA(&hIveHandle, &stDataSrc, &stDataDst, &stCtrl, HI_TRUE);
        if (HI_SUCCESS != s32Ret) {
                AFWARN("HI_MPI_IVE_DMA failed s32Ret[%#x]\n", s32Ret);
        }
       
        do {
                s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, HI_TRUE);
                if (bFinish == HI_FALSE)
                        usleep(100);
        } while (bFinish == HI_FALSE);
        // Src1的UV分量
        unsigned int nOffsetSrc = pstSrc1->stVFrame.u32Stride[0] * pstSrc1->stVFrame.u32Height;
        unsigned int nOffsetDst = pstDst->stVFrame.u32Stride[0] * pstDst->stVFrame.u32Height;
        stDataSrc.pu8VirAddr = (HI_U8*)pstSrc1->stVFrame.pVirAddr[0] + nOffsetSrc;
        stDataSrc.u32PhyAddr = pstSrc1->stVFrame.u32PhyAddr[0] + nOffsetSrc;
        stDataSrc.u16Height  = (HI_U16)pstSrc1->stVFrame.u32Height / 2;
        stDataDst.pu8VirAddr = (HI_U8*)pstDst->stVFrame.pVirAddr[0] + nOffsetDst;
        stDataDst.u32PhyAddr = pstDst->stVFrame.u32PhyAddr[0] + nOffsetDst;
        stDataDst.u16Height  = (HI_U16)pstDst->stVFrame.u32Height / 2;       
        s32Ret = HI_MPI_IVE_DMA(&hIveHandle, &stDataSrc, &stDataDst, &stCtrl, HI_TRUE);
        if (HI_SUCCESS != s32Ret) {
                AFWARN("HI_MPI_IVE_DMA failed s32Ret[%#x]\n", s32Ret);
        }
       
        do {
                s32Ret = HI_MPI_IVE_Query(hIveHandle, &bFinish, HI_TRUE);
                if (bFinish == HI_FALSE)
                        usleep(100);
        } while (bFinish == HI_FALSE);
}

[/code]

pstDst 是使用VB单独分配内存, pstSrc1往psdDst上面叠加

求助大佬 @zhuangweiye
我来回答
回答45个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-03-19 15:25:05
认可0
问几个问题:

1. 上面的图是哪个函数的结果(楼主的代码有两个)?
2. 闪的现象是如何看到的, 是什么流程(比如 DMA的结果sendframe到venc或者vpss等等)?
3. 两个图像的尺寸是不是一样的?
4. 能否打印一下每个VIDEO_FRAME_INFO_S的stride/width/height看看

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 15:35:59
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140736&ptid=73597]zhuangweiye 发表于 2019-3-19 15:25[/url]
问几个问题:

1. 上面的图是哪个函数的结果(楼主的代码有两个)?
[/quote]

1. 上面的图的结果是第二个函数的结果
2. HI_MPI_VPSS_GetChnFrame 得到的原始帧数据 然后通过上面的第二个函数叠加后 直接发送到vo的
3. 两个图像的宽高不一样
4.流程是:从文件读取一副底图(固定1920x1080,vb单独申请的)并构造出pstDst,把从vpss获取的原始帧pstSrc1,通过函数AF_ImageOverlay 叠加到pstDst
pstSrc1宽高300x400

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 15:38:50
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140736&ptid=73597]zhuangweiye 发表于 2019-3-19 15:25[/url]
问几个问题:

1. 上面的图是哪个函数的结果(楼主的代码有两个)?
[/quote]

如果再将另外vpss获取的pstSrc2 叠加到pstDst 如果pstSrc2和pstSrc1有重合的地方,重合的地方就会闪烁

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 15:45:42
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140736&ptid=73597]zhuangweiye 发表于 2019-3-19 15:25[/url]
问几个问题:

1. 上面的图是哪个函数的结果(楼主的代码有两个)?
[/quote]

后来我又按照这个流程 测试直接从YUV文件 构造原始帧 发送到vo
屏幕出现竖条 画面也是闪烁

流程如下:
hBlock = HI_MPI_VB_GetBlock();
pu8PhyAddr = HI_MPI_VB_Handle2PhysAddr();
pu8VirAddr = HI_MPI_SYS_Mmap();
u32PoolId = HI_MPI_VB_Handle2PoolId();
// 填写 VIDEO_FRAME_INFO_S结构
...

// 填写图像buffer
...
从YUV文件读取

HI_MPI_VO_SendFrame();

HI_MPI_SYS_Munmap();
HI_MPI_VB_ReleaseBlock();

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-03-19 15:46:38
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140738&ptid=73597]jugg_kai 发表于 2019-3-19 15:35[/url]
1. 上面的图的结果是第二个函数的结果
2. HI_MPI_VPSS_GetChnFrame 得到的原始帧数据 然后通过上面的第 ...[/quote]

楼主的代码:
// Src1的UV分量
        unsigned int nOffsetSrc = pstSrc1->stVFrame.u32Stride[0] * pstSrc1->stVFrame.u32Height;
        unsigned int nOffsetDst = pstDst->stVFrame.u32Stride[0] * pstDst->stVFrame.u32Height;
        stDataSrc.pu8VirAddr = (HI_U8*)pstSrc1->stVFrame.pVirAddr[0] + nOffsetSrc;
        stDataSrc.u32PhyAddr = pstSrc1->stVFrame.u32PhyAddr[0] + nOffsetSrc;
   

这里有个疑问, stDataSrc.u32PhyAddr 为什么不直接用pstSrc1->stVFrame.u32PhyAddr[1] ,而要计算得到?

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 15:55:17
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140741&ptid=73597]zhuangweiye 发表于 2019-3-19 15:46[/url]
楼主的代码:
// Src1的UV分量
        unsigned int nOffsetSrc = pstSrc1->stVFrame.u32Stride[0] * p ...[/quote]

直接用pstSrc1->stVFrame.u32PhyAddr[1] 的话 变成黑白的了

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-03-19 16:15:02
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140742&ptid=73597]jugg_kai 发表于 2019-3-19 15:55[/url]
直接用pstSrc1->stVFrame.u32PhyAddr[1] 的话 变成黑白的了[/quote]

什么芯片和SDK, 函数输入值感觉有点怪

是这个吗?
HI_S32 HI_MPI_IVE_DMA(IVE_HANDLE *pIveHandle, IVE_DATA_S *pstSrc,
IVE_DST_DATA_S *pstDst, IVE_DMA_CTRL_S *pstDmaCtrl,HI_BOOL bInstant);

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 16:18:22
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140745&ptid=73597]zhuangweiye 发表于 2019-3-19 16:15[/url]
什么芯片和SDK, 函数输入值感觉有点怪

是这个吗?
[/quote]

是这个函数

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 16:23:28
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140745&ptid=73597]zhuangweiye 发表于 2019-3-19 16:15[/url]
什么芯片和SDK, 函数输入值感觉有点怪

是这个吗?
[/quote]

是这个SDK Hi3531D V100R001C02SPC040

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 16:51:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140745&ptid=73597]zhuangweiye 发表于 2019-3-19 16:15[/url]
什么芯片和SDK, 函数输入值感觉有点怪

是这个吗?
[/quote]

有没有可能是DMA操作的有些像素没有拷贝过来 导致又镂空的现象

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-03-19 17:08:59
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140750&ptid=73597]jugg_kai 发表于 2019-3-19 16:51[/url]
有没有可能是DMA操作的有些像素没有拷贝过来 导致又镂空的现象[/quote]

不会出现这种情况

把src1/src2的格式打出来看看

楼主的代码需要
enVideoFormat = VIDEO_FORMAT_LINEAR
enCompressMode = COMPRESS_MODE_NONE

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 17:26:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140753&ptid=73597]zhuangweiye 发表于 2019-3-19 17:08[/url]
不会出现这种情况

把src1/src2的格式打出来看看
[/quote]

打印如下:
src1: 23 0 0   src2: 23 0 0
src1: 23 0 0   src2: 23 0 0
src1: 23 0 0   src2: 23 0 0
src1: 23 0 0   src2: 23 0 0
src1: 23 0 0   src2: 23 0 0
src1: 23 0 0   src2: 23 0 0

枚举
23 -> PIXEL_FORMAT_YUV_SEMIPLANAR_420
0   -> VIDEO_FORMAT_LINEAR
0   -> COMPRESS_MODE_NONE

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-19 17:36:32
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140753&ptid=73597]zhuangweiye 发表于 2019-3-19 17:08[/url]
不会出现这种情况

把src1/src2的格式打出来看看
[/quote]

我又测试了一下 怀疑是底图导致的 因为底图是从YUV文件读取的 (单独申请的VB)
只填充了一次视频信息和YUV数据  之后不再释放 之后src1 和 src2均叠加到这个底图构造的原始帧上面 DMA操作的目的参数也是这个底图构造的原始帧数据
后来改为vo_sendframe之后 该底图的原始帧反映射并且释放block 之后再重新构造这个底图的原始帧,结果是 叠加的部分和视频部分均正常 但是其他无视频区域都是竖条  不停的闪烁

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-20 10:21:54
认可0
本帖最后由 jugg_kai 于 2019-3-20 10:23 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=140753&ptid=73597]zhuangweiye 发表于 2019-3-19 17:08[/url]
不会出现这种情况

把src1/src2的格式打出来看看
[/quote]

你好 我在你其他帖子里面的看到 关于HI_MPI_XXX_SendFrame的流程 如下:

如果是要用HI_MPI_XXX_SendFrame()
意味着只能用下面的流程
[code]
HI_MPI_VB_CreatePool()
HI_MPI_VB_GetBlock()
HI_MPI_VB_Handle2PhysAddr()
HI_MPI_SYS_Mmap()
// copy data
HI_MPI_VB_Handle2PoolId()
HI_MPI_XXX_SendFrame()
HI_MPI_SYS_Munmap()
HI_MPI_VB_ReleaseBlock()
[/code]

我现在想做成下面这样的流程(销毁 创建 读取 发送 这样的循环,不是只创建一次),但是vo花屏
[code]
HI_MPI_VB_CreatePool()
while(1)
{
        HI_MPI_VB_GetBlock()
        HI_MPI_VB_Handle2PhysAddr()
        HI_MPI_SYS_Mmap()
        // copy data
        HI_MPI_VB_Handle2PoolId()

        HI_MPI_XXX_SendFrame()
        HI_MPI_SYS_Munmap()
        HI_MPI_VB_ReleaseBlock()
}
[/code]

但是如果流程是这样:
[code]
HI_MPI_VB_CreatePool()
HI_MPI_VB_GetBlock()
HI_MPI_VB_Handle2PhysAddr()
HI_MPI_SYS_Mmap()
// copy data
HI_MPI_VB_Handle2PoolId()
while(1)
{
        HI_MPI_XXX_SendFrame()
}
HI_MPI_SYS_Munmap()
HI_MPI_VB_ReleaseBlock()
[/code]
vo是正常输出

具体的代码我使用的是sample_comm_vi.c里面的
HI_S32 SAMPLE_COMM_VI_GetVFrameFromYUV(FILE *pYUVFile, HI_U32 u32Width, HI_U32 u32Height,HI_U32 u32Stride, VIDEO_FRAME_INFO_S *pstVFrameInfo) 函数
代码如下:
[code]
/******************************************************************************
* function : Get from YUV
******************************************************************************/
HI_S32 SAMPLE_COMM_VI_GetVFrameFromYUV(FILE *pYUVFile, HI_U32 u32Width, HI_U32 u32Height,HI_U32 u32Stride, VIDEO_FRAME_INFO_S *pstVFrameInfo)
{
    HI_U32             u32LStride;
    HI_U32             u32CStride;
    HI_U32             u32LumaSize;
    HI_U32             u32ChrmSize;
    HI_U32             u32Size;
    VB_BLK VbBlk;
    HI_U32 u32PhyAddr;
    HI_U8 *pVirAddr;

    u32LStride  = u32Stride;
    u32CStride  = u32Stride;

    u32LumaSize = (u32LStride * u32Height);
    u32ChrmSize = (u32CStride * u32Height) >> 2;/* YUV 420 */
    u32Size = u32LumaSize + (u32ChrmSize << 1);

    /* alloc video buffer block ---------------------------------------------------------- */
    VbBlk = HI_MPI_VB_GetBlock(pool, u32Size, NULL);
    if (VB_INVALID_HANDLE == VbBlk)
    {
        SAMPLE_PRT("HI_MPI_VB_GetBlock err! size:%d\n",u32Size);
        return -1;
    }
    u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk);
    if (0 == u32PhyAddr)
    {
        return -1;
    }

    pVirAddr = (HI_U8 *) HI_MPI_SYS_Mmap(u32PhyAddr, u32Size);
    if (NULL == pVirAddr)
    {
        return -1;
    }

    pstVFrameInfo->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk);
    if (VB_INVALID_POOLID == pstVFrameInfo->u32PoolId)
    {
        return -1;
    }
//   SAMPLE_PRT("pool id :%d, phyAddr:%x,virAddr:%x\n" ,pstVFrameInfo->u32PoolId,u32PhyAddr,(int)pVirAddr);

    pstVFrameInfo->stVFrame.u32PhyAddr[0] = u32PhyAddr;
    pstVFrameInfo->stVFrame.u32PhyAddr[1] = pstVFrameInfo->stVFrame.u32PhyAddr[0] + u32LumaSize;
    pstVFrameInfo->stVFrame.u32PhyAddr[2] = pstVFrameInfo->stVFrame.u32PhyAddr[1] + u32ChrmSize;

    pstVFrameInfo->stVFrame.pVirAddr[0] = pVirAddr;
    pstVFrameInfo->stVFrame.pVirAddr[1] = pstVFrameInfo->stVFrame.pVirAddr[0] + u32LumaSize;
    pstVFrameInfo->stVFrame.pVirAddr[2] = pstVFrameInfo->stVFrame.pVirAddr[1] + u32ChrmSize;

    pstVFrameInfo->stVFrame.u32Width  = u32Width;
    pstVFrameInfo->stVFrame.u32Height = u32Height;
    pstVFrameInfo->stVFrame.u32Stride[0] = u32LStride;
    pstVFrameInfo->stVFrame.u32Stride[1] = u32CStride;
    pstVFrameInfo->stVFrame.u32Stride[2] = u32CStride;
    pstVFrameInfo->stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
    pstVFrameInfo->stVFrame.u32Field = VIDEO_FIELD_INTERLACED;/* Intelaced D1,otherwise VIDEO_FIELD_FRAME */

    /* read Y U V data from file to the addr ----------------------------------------------*/
    SAMPLE_COMM_VI_ReadFrame(pYUVFile, pstVFrameInfo->stVFrame.pVirAddr[0],
       pstVFrameInfo->stVFrame.pVirAddr[1], pstVFrameInfo->stVFrame.pVirAddr[2],
       pstVFrameInfo->stVFrame.u32Width, pstVFrameInfo->stVFrame.u32Height,
       pstVFrameInfo->stVFrame.u32Stride[0], pstVFrameInfo->stVFrame.u32Stride[1] >> 1 );

    /* convert planar YUV420 to sem-planar YUV420 -----------------------------------------*/
    SAMPLE_COMM_VI_PlanToSemi(pstVFrameInfo->stVFrame.pVirAddr[0], pstVFrameInfo->stVFrame.u32Stride[0],
      pstVFrameInfo->stVFrame.pVirAddr[1], pstVFrameInfo->stVFrame.u32Stride[1],
      pstVFrameInfo->stVFrame.pVirAddr[2], pstVFrameInfo->stVFrame.u32Stride[1],
      pstVFrameInfo->stVFrame.u32Width, pstVFrameInfo->stVFrame.u32Height);

    HI_MPI_SYS_Munmap(pVirAddr, u32Size);
    return 0;
}
[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-03-20 11:00:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140776&ptid=73597]jugg_kai 发表于 2019-3-20 10:21[/url]
你好 我在你其他帖子里面的看到 关于HI_MPI_XXX_SendFrame的流程 如下:

如果是要用HI_MPI_XXX_Send ...[/quote]


试试 vpss绑定vo 而后 sendframe 到 vpss

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-20 11:03:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140777&ptid=73597]zhuangweiye 发表于 2019-3-20 11:00[/url]
试试 vpss绑定vo 而后 sendframe 到 vpss[/quote]

这个试过了 同样的结果

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-20 11:10:49
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140777&ptid=73597]zhuangweiye 发表于 2019-3-20 11:00[/url]
试试 vpss绑定vo 而后 sendframe 到 vpss[/quote]

运行时VB 的截图

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-03-20 11:18:45
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140780&ptid=73597]jugg_kai 发表于 2019-3-20 11:10[/url]
运行时VB 的截图[/quote]

HI_MPI_VB_CreatePool()
while(1)
{
        HI_MPI_VB_GetBlock()
        HI_MPI_VB_Handle2PhysAddr()
        HI_MPI_SYS_Mmap()
        // copy data
        HI_MPI_VB_Handle2PoolId()

        HI_MPI_XXX_SendFrame()
        HI_MPI_SYS_Munmap()
        HI_MPI_VB_ReleaseBlock()
}

能否在上面代码里加点打印, 看看每次得到的VB的物理地址是否都一样?

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-20 11:35:33
认可0
本帖最后由 jugg_kai 于 2019-3-20 11:36 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=140781&ptid=73597]zhuangweiye 发表于 2019-3-20 11:18[/url]
HI_MPI_VB_CreatePool()
while(1)
{
[/quote]

每次打印的物理地址
SAMPLE_PRT("pool id :%d, phyAddr:%x,virAddr:%x --- %u \n" ,pstVFrameInfo->u32PoolId,u32PhyAddr,(int)pVirAddr, u32Size);

jugg

4个粉丝

15

问答

0

专栏

2

资料

jugg 2019-03-20 11:44:32
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=140781&ptid=73597]zhuangweiye 发表于 2019-3-20 11:18[/url]
HI_MPI_VB_CreatePool()
while(1)
{
[/quote]

这些物理地址好像都是有规律的重复
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区