houyongnan

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan  发布于  2017-10-17 09:50:17
采纳率 0%
32个问答
11593

关于HI_MPI_VPSS_SendFrame的参数设置

 
memset(&pstVideoFrame,0,sizeof(VIDEO_FRAME_INFO_S));

fp=fopen("nv21_v6.yuv","r");

if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&Phyaddr,((void**)&Viraddr),NULL, NULL, HD_WIDTH*HD_HEIGHT*2))
    {
        SAMPLE_PRT("allocate memory (maxW*maxH*2 bytes) failed\n");
        fclose(fp);
        return HI_NULL;
    }
memset(Viraddr, 0x00,HD_WIDTH*HD_HEIGHT*2);
fread(Viraddr,1,HD_WIDTH*HD_HEIGHT*2,fp);

pstVideoFrame.stVFrame.u32Width=1280;
pstVideoFrame.stVFrame.u32Height=720;
pstVideoFrame.stVFrame.u32Field= VIDEO_FIELD_FRAME;//帧场模式,帧类型
pstVideoFrame.stVFrame.enPixelFormat=PIXEL_FORMAT_YUV_PLANAR_420;  //视频图像像素格式。
pstVideoFrame.stVFrame.enCompressMode=COMPRESS_MODE_NONE;//视频压缩模式
pstVideoFrame.stVFrame.u32PhyAddr[0]=Phyaddr;    //物理地址
pstVideoFrame.stVFrame.pVirAddr[0]=Viraddr;       //虚拟地址
pstVideoFrame.stVFrame.u32Stride[0]=2;      //图像跨距。

s32Ret =HI_MPI_VPSS_SendFrame(0,&pstVideoFrame, -1);
    if(s32Ret != HI_SUCCESS)
    {               
        SAMPLE_PRT("vpss  send frame fail for %#x!\n", s32Ret);
        fclose(fp);
        return HI_NULL;       
    }       

运行时报错:0xa0078003 (VPSS 参数设置无效)
我来回答
回答20个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-10-17 13:23:48
认可0
sendframe用的buffer不能用HI_MPI_SYS_MmzAlloc

使用的必须是VB pool里面的buffer

一般流程:

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
...
HI_MPI_XXX_SendFrame();

HI_MPI_SYS_Munmap();
HI_MPI_VB_ReleaseBlock();

初始化时要用HI_MPI_VB_CreatePool()创建一个VB pool
程序退出时要HI_MPI_VB_DestroyPool()

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-10-17 16:36:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79523&ptid=37986]zhuangweiye 发表于 2017-10-17 13:23[/url]
sendframe用的buffer不能用HI_MPI_SYS_MmzAlloc

使用的必须是VB pool里面的buffer
[/quote]

十分感谢,你又来回答我的问题。:D还有一点疑问。
HI_U32 u32Width;
HI_U32 u32Height;
HI_U32 u32LStride;
HI_U32 u32CStride;
HI_U32 u32LumaSize;
HI_U32 u32ChrmSize;
HI_U32 u32Size;

u32Height=720;
u32Width=1280;

u32LStride=?
u32CStride=?//这两个值应该赋多少(yuv420,nv21)?

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

/* get physical address*/
u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk);
pVirAdd=HI_MPI_SYS_Mmap(u32PhyAddr,u32Size);

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;
将YUV420 Semi-Planar Data填充到pVirAdd

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-10-17 16:41:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79545&ptid=37986]houyongnan 发表于 2017-10-17 16:36[/url]
十分感谢,你又来回答我的问题。还有一点疑问。
HI_U32 u32Width;
HI_U32 u32Height;
[/quote]

都是1280

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-10-18 09:15:56
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79546&ptid=37986]zhuangweiye 发表于 2017-10-17 16:41[/url]
都是1280[/quote]

不好意思还是要麻烦你。还是会报vpss参数设置无效的错误。

u32Height=720;
u32Width=1280;
u32LStride=1280;
u32CStride=1280;
/* you need get width and height of pictrue */
u32LumaSize = (u32LStride * u32Height);
u32ChrmSize = (u32CStride * u32Height) >> 2;/* 420*/
u32Size = u32LumaSize + (u32ChrmSize << 1);
/* get video buffer block form common pool */
printf("VbPool:%d\n",VbPool);
VbBlk = HI_MPI_VB_GetBlock(VbPool,u32Size,NULL);
printf("VbBlk:%d\n",VbBlk);
if (VB_INVALID_HANDLE == VbBlk)
{
printf("HI_MPI_VB_GetBlock failed\n");
return -1;
}
/* get physical address*/
u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk);
printf("u32PhyAddr:%#x\n",u32PhyAddr);
if (0 == u32PhyAddr)
{
printf("HI_MPI_VB_Handle2PhysAddr failed\n");
return -1;
}

pVirAddr=HI_MPI_SYS_Mmap(u32PhyAddr,u32Size);
printf("pVirAddr:%#x\n",pVirAddr);
/* mmap physical address to virtual address*/
/* get pool id */
pstVFrameInfo->u32PoolId = HI_MPI_VB_Handle2PoolId(VbBlk);
printf("pstVFrameInfo->u32PoolId:%d\n",pstVFrameInfo->u32PoolId);
if (VB_INVALID_POOLID == pstVFrameInfo->u32PoolId)
{
printf("HI_MPI_VB_Handle2PoolId faile\n");
return -1;
}
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.enVideoFormat=VIDEO_FIELD_FRAME;

/* now you need get YUV Semi Palnar Data ,fill them to the virtual
address */
fp=fopen("nv21_v6.yuv","r");

fread(pVirAddr,1,u32Size,fp);


s32Ret =HI_MPI_VPSS_SendFrame(0,pstVFrameInfo, -1);
    if(s32Ret != HI_SUCCESS)
    {               
        SAMPLE_PRT("vpss  send frame fail for %#x!\n", s32Ret);
        fclose(fp);
        //return HI_NULL;
        goto END1;
    }
打印信息:
VbPool:2
VbBlk:131072
u32PhyAddr:0x8d2af000
pVirAddr:0xb6d3c000
pstVFrameInfo->u32PoolId:2
[SAMPLE_VDEC_JpegDecoding]-281: vpss  send frame fail for 0xa0078003!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-10-18 09:39:40
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79551&ptid=37986]houyongnan 发表于 2017-10-18 09:15[/url]
不好意思还是要麻烦你。还是会报vpss参数设置无效的错误。

u32Height=720;
[/quote]

加个初始化

memset(&pstVFrameInfo->stVFrame, 0, sizeof(VIDEO_FRAME_S));

试试

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-10-18 09:47:23
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79546&ptid=37986]zhuangweiye 发表于 2017-10-17 16:41[/url]
都是1280[/quote]

英雄十分感谢你,总是解救我。我已经显示出来了。(pstVFrameInfo)这个东西我本来定义的是指针型,不把他定义成指指针型就解决了,很神奇。

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-10-18 09:48:44
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79546&ptid=37986]zhuangweiye 发表于 2017-10-17 16:41[/url]
都是1280[/quote]

我知道怎么回事了,我忘加&,好悲伤。

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-10-18 09:54:28
认可0
抱歉,我以前用指针没加正常,总之别用指针就对了

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-10-18 09:55:21
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79559&ptid=37986]houyongnan 发表于 2017-10-18 09:48[/url]
我知道怎么回事了,我忘加&,好悲伤。[/quote]

:L:L:L:L:L:L:L

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-10-18 11:13:09
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79554&ptid=37986]zhuangweiye 发表于 2017-10-18 09:39[/url]
加个初始化

memset(&pstVFrameInfo->stVFrame, 0, sizeof(VIDEO_FRAME_S));
[/quote]

加初始化居然解决了我arm-hisiv300-linux-g++ 编译运行时报vpss  send frame fail for 0xa0078003!(gcc编译可成功运行)。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-10-18 11:58:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79570&ptid=37986]houyongnan 发表于 2017-10-18 11:13[/url]
加初始化居然解决了我arm-hisiv300-linux-g++ 编译运行时报vpss  send frame fail for 0xa0078003!(gcc ...[/quote]

这个...

难道都不初始化的吗?

汗如雨下啊

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-10-18 12:07:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79580&ptid=37986]zhuangweiye 发表于 2017-10-18 11:58[/url]
这个...

难道都不初始化的吗?
[/quote]

哈哈,gcc编译的可运行成功,谁知道g++不能运行是这个原因,我以为是g++编译时链接库时出现了错误呢

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-11-04 10:14:50
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79554&ptid=37986]zhuangweiye 发表于 2017-10-18 09:39[/url]
加个初始化

memset(&pstVFrameInfo->stVFrame, 0, sizeof(VIDEO_FRAME_S));
[/quote]

为什么图片的宽度必须设置成1280,我现在需要显示600*800的图片,这三个u32Width=600;u32LStride=600;
u32CStride=600;设置成600后HI_MPI_VPSS_SendFrame就会出现无效的参数设置的错误,这是为什么。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-11-06 07:49:36
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=80375&ptid=37986]houyongnan 发表于 2017-11-4 10:14[/url]
为什么图片的宽度必须设置成1280,我现在需要显示600*800的图片,这三个u32Width=600;u32LStride=600;
u3 ...[/quote]

这个问题不好回答, 一般和上下文有关

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-11-06 13:46:20
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=80408&ptid=37986]zhuangweiye 发表于 2017-11-6 07:49[/url]
这个问题不好回答, 一般和上下文有关[/quote]

恩现在发现图片的宽度只要是80的倍数就可以,很神奇。

houyongnan

1个粉丝

32

问答

0

专栏

0

资料

houyongnan 2017-11-06 14:04:24
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=80408&ptid=37986]zhuangweiye 发表于 2017-11-6 07:49[/url]
这个问题不好回答, 一般和上下文有关[/quote]

应该是这段代码了
memset(&pstVFrameInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
u32Height=800;
u32Width=1760;
u32LStride=1760;
u32CStride=1760;
/*get width and height of pictrue */
u32LumaSize = (u32LStride * u32Height);
u32ChrmSize = (u32CStride * u32Height) >> 2;//420,亮度
u32Size = u32LumaSize + (u32ChrmSize << 1);

/* get video buffer block form common pool */
printf("VbPool:%d\n",VbPool);
VbBlk = HI_MPI_VB_GetBlock(VbPool,u32Size,NULL);
printf("VbBlk:%d\n",VbBlk);
if (VB_INVALID_HANDLE == VbBlk)
{
printf("HI_MPI_VB_GetBlock failed\n");
return -1;
}
/* get physical address*/
u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(VbBlk);
printf("u32PhyAddr:%#x\n",u32PhyAddr);
if (0 == u32PhyAddr)
{
printf("HI_MPI_VB_Handle2PhysAddr failed\n");
return -1;
}

pVirAddr=HI_MPI_SYS_Mmap(u32PhyAddr,u32Size);
printf("pVirAddr:%#x\n",pVirAddr);
/* mmap physical address to virtual address*/
/* get pool id */

pstVFrameInfo.u32PoolId=HI_MPI_VB_Handle2PoolId(VbBlk);

printf("pstVFrameInfo->u32PoolId:%d\n",pstVFrameInfo.u32PoolId);
if (VB_INVALID_POOLID == pstVFrameInfo.u32PoolId)
{
printf("HI_MPI_VB_Handle2PoolId faile\n");
return -1;
}
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;


/* YUV Semi Palnar Data ,fill them to the virtual
address */
i=1;
AVM_init(NULL);
while(i<3)
{
uchar *pDst=new uchar[1760*800*3/2];
FRAME_INIT(i);
i++;

printf("copy begin\n");
if(0==NV21CopyPart(pResult,600,800,10,0,pDst,1760,800,0,0,590,800))
       printf(" copy pResult over\n");
if(0==NV21CopyPart(pImgF,1280,720,60,0,pDst,1760,800,590,0,1160,680))
       printf("copy pImgF over\n");
//memcpy(pVirAddr, pResult,u32Size);
memcpy(pVirAddr,pDst,u32Size);
s32Ret =HI_MPI_VPSS_SendFrame(VpssGrp,&pstVFrameInfo,s32MilliSec);
    if(s32Ret != HI_SUCCESS)
    {               
        SAMPLE_PRT("vpss  send frame fail for %#x!\n", s32Ret);
        fclose(fp);
       
        goto END1;
    }
sleep(2);
delete(pResult);
delete(pImgF);
delete(pDst);
}

qn1549961209

0个粉丝

5

问答

0

专栏

0

资料

qn1549961209 2019-03-05 11:54:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=80428&ptid=37986]houyongnan 发表于 2017-11-6 14:04[/url]
应该是这段代码了
memset(&pstVFrameInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
u32Height=800;
[/quote]

hi,请问HI_MPI_VPSS_SendFrame的release函数你有用到吗?我在bind了avs以后,16帧后提示vpss 满了

qn1586941869

0个粉丝

0

问答

0

专栏

0

资料

qn1586941869 2020-04-23 08:56:01
认可0
你好,我现在调试3559A 也遇到 0xa0078003的问题,代码跟你的基本上一致,还请指教一下,流程是把VI去掉,直接申请POOL,初始化,VPSS,VO,然后HI_MPI_VPSS_SendFrame

forestguan

0个粉丝

3

问答

0

专栏

0

资料

forestguan 2020-08-13 15:28:58
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=157149&ptid=37986]qn1586941869 发表于 2020-4-23 08:56[/url]
你好,我现在调试3559A 也遇到 0xa0078003的问题,代码跟你的基本上一致,还请指教一下,流程是把VI去掉, ...[/quote]

您好最近我也在调试这个,能交流下吗?

qn1591840505

0个粉丝

2

问答

0

专栏

0

资料

qn1591840505 2020-11-18 10:36:36
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=79546&ptid=37986]zhuangweiye 发表于 2017-10-17 16:41[/url]
都是1280[/quote]

你好 想请教下这些参数是什么意思 为什么是数组[3] 以及地址应该怎么计算的? 没有例程
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区