2783
- 收藏
- 点赞
- 分享
- 举报
HI3559AV100的HI_MPI_VPSS_SenfFrame使用问题
最近在HI3559AV100上尝试将YUV数据直接发送到VPSS模块,参考了论坛前两天的帖子,
static HI_U32 u32TimeRef= 0;
HI_U32 *pVirAddr;
HI_U32 u32LStride;
HI_U32 u32CStride;
HI_U32 u32LumaSize;
HI_U32 u32ChrmSize;
HI_U32 u32Width;
HI_U32 u32Height;
HI_S32 s32Ret = HI_SUCCESS;
memset(&stFrameInfo,0,sizeof(VIDEO_FRAME_INFO_S));
memset(&stFrameInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
u32Width = pstYuvThreadParam->width;
u32Height = pstYuvThreadParam->height;
u32LStride = u32Width;
u32CStride = u32Width;
u32LumaSize = (u32LStride * u32Height);
u32ChrmSize = (u32CStride * u32Height) >> 2;/* 420*/
u32Size = u32LumaSize + (u32ChrmSize << 1);
printf("u32Size:%d\n",u32Size);
/* get a buffer block from pool*/
Face_VbBlk = HI_MPI_VB_GetBlock(Face_VbPool, u32Size,NULL);
if (VB_INVALID_HANDLE == Face_VbBlk )
{
printf("get vb block err\n");
(void)HI_MPI_VB_DestroyPool(Face_VbPool);
}
/* get the physical address of buffer block*/
Face_VB_u32Addr = HI_MPI_VB_Handle2PhysAddr(Face_VbBlk);
if (HI_SUCCESS == Face_VB_u32Addr)
{
printf("blk to physaddr err\n");
}
printf("poolid:%d,vbblk:%d,addr:%#x\n",Face_VbPool,Face_VbBlk,Face_VB_u32Addr);
pVirAddr =(HI_U32*)HI_MPI_SYS_Mmap(Face_VB_u32Addr,u32Size);
printf("pVirAddr:%#x\n",pVirAddr);
/* mmap physical address to virtual address*/
stFrameInfo.stVFrame.u32Width = u32Width;
stFrameInfo.stVFrame.u32Height = u32Height;
stFrameInfo.stVFrame.enField = VIDEO_FIELD_FRAME;
stFrameInfo.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
stFrameInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR;
stFrameInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE;
stFrameInfo.stVFrame.s16OffsetTop = 0;
stFrameInfo.stVFrame.s16OffsetBottom = 0;
stFrameInfo.stVFrame.s16OffsetLeft = 0;
stFrameInfo.stVFrame.s16OffsetRight = 0;
stFrameInfo.stVFrame.u32TimeRef = u32TimeRef;
stFrameInfo.stVFrame.u64PTS = 0;
stFrameInfo.stVFrame.u32Stride[0] = u32LStride;
stFrameInfo.stVFrame.u32Stride[1] = u32CStride;
stFrameInfo.stVFrame.u32Stride[2] = u32CStride;
stFrameInfo.stVFrame.u64PhyAddr[0] = Face_VB_u32Addr;
stFrameInfo.stVFrame.u64PhyAddr[1] = stFrameInfo.stVFrame.u64PhyAddr[0] + u32LumaSize;
stFrameInfo.stVFrame.u64PhyAddr[2] = stFrameInfo.stVFrame.u64PhyAddr[1] + u32ChrmSize;
stFrameInfo.stVFrame.u64VirAddr[0] = pVirAddr;
printf("pVirAddr:%#x\n",stFrameInfo.stVFrame.u64VirAddr[0]);
stFrameInfo.stVFrame.u64VirAddr[1] = stFrameInfo.stVFrame.u64VirAddr[0] + u32LumaSize;
stFrameInfo.stVFrame.u64VirAddr[2] = stFrameInfo.stVFrame.u64VirAddr[1] + u32ChrmSize;
stFrameInfo.stVFrame.u64PrivateData = 0;
stFrameInfo.u32PoolId = Face_VbPool;
//stFrameInfo.enModId = HI_ID_VB;
stFrameInfo.enModId = HI_ID_VPSS;
memcpy(pVirAddr,pstYuvThreadParam->buffer,pstYuvThreadParam->width*pstYuvThreadParam->height*3/2);
printf("yuvstart\n");
s32Ret=HI_MPI_VPSS_SendFrame(0, 0, &stFrameInfo, 1);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("YUV Send data to VPSS fail for %#x!\n", s32Ret);
}
HI_MPI_SYS_Munmap(pVirAddr,u32Size);
最后出现的问题就是YUV Send data to VPSS fail for 0xa0078003;
因为HI3559AV100和HI3559有一些区别,不知道32位地址和64位地址定义,赋值这一块会影响吗?
还是由于stFrameInfo.enModId,但是改成 HI_ID_VB和 HI_ID_USER也是相同的报错。
static HI_U32 u32TimeRef= 0;
HI_U32 *pVirAddr;
HI_U32 u32LStride;
HI_U32 u32CStride;
HI_U32 u32LumaSize;
HI_U32 u32ChrmSize;
HI_U32 u32Width;
HI_U32 u32Height;
HI_S32 s32Ret = HI_SUCCESS;
memset(&stFrameInfo,0,sizeof(VIDEO_FRAME_INFO_S));
memset(&stFrameInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
u32Width = pstYuvThreadParam->width;
u32Height = pstYuvThreadParam->height;
u32LStride = u32Width;
u32CStride = u32Width;
u32LumaSize = (u32LStride * u32Height);
u32ChrmSize = (u32CStride * u32Height) >> 2;/* 420*/
u32Size = u32LumaSize + (u32ChrmSize << 1);
printf("u32Size:%d\n",u32Size);
/* get a buffer block from pool*/
Face_VbBlk = HI_MPI_VB_GetBlock(Face_VbPool, u32Size,NULL);
if (VB_INVALID_HANDLE == Face_VbBlk )
{
printf("get vb block err\n");
(void)HI_MPI_VB_DestroyPool(Face_VbPool);
}
/* get the physical address of buffer block*/
Face_VB_u32Addr = HI_MPI_VB_Handle2PhysAddr(Face_VbBlk);
if (HI_SUCCESS == Face_VB_u32Addr)
{
printf("blk to physaddr err\n");
}
printf("poolid:%d,vbblk:%d,addr:%#x\n",Face_VbPool,Face_VbBlk,Face_VB_u32Addr);
pVirAddr =(HI_U32*)HI_MPI_SYS_Mmap(Face_VB_u32Addr,u32Size);
printf("pVirAddr:%#x\n",pVirAddr);
/* mmap physical address to virtual address*/
stFrameInfo.stVFrame.u32Width = u32Width;
stFrameInfo.stVFrame.u32Height = u32Height;
stFrameInfo.stVFrame.enField = VIDEO_FIELD_FRAME;
stFrameInfo.stVFrame.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
stFrameInfo.stVFrame.enVideoFormat = VIDEO_FORMAT_LINEAR;
stFrameInfo.stVFrame.enCompressMode = COMPRESS_MODE_NONE;
stFrameInfo.stVFrame.s16OffsetTop = 0;
stFrameInfo.stVFrame.s16OffsetBottom = 0;
stFrameInfo.stVFrame.s16OffsetLeft = 0;
stFrameInfo.stVFrame.s16OffsetRight = 0;
stFrameInfo.stVFrame.u32TimeRef = u32TimeRef;
stFrameInfo.stVFrame.u64PTS = 0;
stFrameInfo.stVFrame.u32Stride[0] = u32LStride;
stFrameInfo.stVFrame.u32Stride[1] = u32CStride;
stFrameInfo.stVFrame.u32Stride[2] = u32CStride;
stFrameInfo.stVFrame.u64PhyAddr[0] = Face_VB_u32Addr;
stFrameInfo.stVFrame.u64PhyAddr[1] = stFrameInfo.stVFrame.u64PhyAddr[0] + u32LumaSize;
stFrameInfo.stVFrame.u64PhyAddr[2] = stFrameInfo.stVFrame.u64PhyAddr[1] + u32ChrmSize;
stFrameInfo.stVFrame.u64VirAddr[0] = pVirAddr;
printf("pVirAddr:%#x\n",stFrameInfo.stVFrame.u64VirAddr[0]);
stFrameInfo.stVFrame.u64VirAddr[1] = stFrameInfo.stVFrame.u64VirAddr[0] + u32LumaSize;
stFrameInfo.stVFrame.u64VirAddr[2] = stFrameInfo.stVFrame.u64VirAddr[1] + u32ChrmSize;
stFrameInfo.stVFrame.u64PrivateData = 0;
stFrameInfo.u32PoolId = Face_VbPool;
//stFrameInfo.enModId = HI_ID_VB;
stFrameInfo.enModId = HI_ID_VPSS;
memcpy(pVirAddr,pstYuvThreadParam->buffer,pstYuvThreadParam->width*pstYuvThreadParam->height*3/2);
printf("yuvstart\n");
s32Ret=HI_MPI_VPSS_SendFrame(0, 0, &stFrameInfo, 1);
if(s32Ret != HI_SUCCESS)
{
SAMPLE_PRT("YUV Send data to VPSS fail for %#x!\n", s32Ret);
}
HI_MPI_SYS_Munmap(pVirAddr,u32Size);
最后出现的问题就是YUV Send data to VPSS fail for 0xa0078003;
因为HI3559AV100和HI3559有一些区别,不知道32位地址和64位地址定义,赋值这一块会影响吗?
还是由于stFrameInfo.enModId,但是改成 HI_ID_VB和 HI_ID_USER也是相同的报错。
我来回答
回答2个
时间排序
认可量排序
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2019-12-23 15:58:16
-
2019-09-06 08:34:34
-
2020-09-16 15:00:18
-
2019-11-22 22:36:43
-
2020-08-18 14:00:33
-
2019-01-04 15:21:05
-
2020-09-24 15:47:04
-
2020-07-30 08:58:45
-
2019-11-01 08:59:43
-
2019-06-11 20:53:21
-
2023-04-25 14:05:31
-
2020-11-22 23:37:01
-
2023-10-18 18:01:17
-
2020-05-14 10:26:36
-
2024-08-08 10:45:48
-
2019-03-12 19:43:53
-
2019-12-05 16:44:10
-
2018-12-18 21:49:15
-
2023-08-22 10:25:56
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
-
10EB-RV1126-BC-191板子运行自己编码的程序
-
10求HI3519DV500_SDK_V2.0.1.1
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认