lcg0115

lcg0115

0个粉丝

1

问答

0

专栏

0

资料

lcg0115  发布于  2019-04-28 18:47:55
采纳率 0%
1个问答
2745

请教从vi到vpss发送数据的疑问

 
本帖最后由 lcg0115 于 2019-4-28 18:56 编辑

最近在学习hi3516平台

我打算通过截取VI 的yuv数据,使用opencv 添加osd数据后,再送到VPSS

这里先测试 获取VI 数据,再转发给 VPSS 就出错了。

代码使用

sample\venc\sample_venc.c


在 HI_S32 SAMPLE_COMM_VI_Bind_VPSS()
取消 HI_MPI_SYS_Bind(&stSrcChn, &stDestChn)
并创建一下线程 用于 获取VI 数据,再转发送给 VPSS

打印提示
[GetFrameFromVItoVPSS]-503: HI_MPI_VI_GetChnFrame success with 0,width=0    这里应该是得到空数据了
[GetFrameFromVItoVPSS]-508: HI_MPI_VPSS_SendFrame failed with 0xa0078003  这里是提示VPSS参数错误?

HiMPP V4.0 媒体处理软件开发参考.pdf 文档翻了好几天,没有看到要点。

恳请各位大神能帮忙指点迷津,感谢。

代码如下:

[code]void *GetFrameFromVItoVPSS(void* arg)
{
   VIDEO_FRAME_INFO_S pstFrameInfo; //sYUVFrameInfo
   HI_S32      s32MilliSec = 2000;
   HI_S32 s32Ret;
   VI_PIPE ViPipe = 0 ;
   VI_CHN ViChn = 0;
   
   
   VPSS_GRP VpssGrp = 0;
   VPSS_GRP_PIPE VpssGrpPipe = 0;
  while(1) {
   HI_MPI_VI_GetChnFrame(ViPipe, ViChn, &pstFrameInfo,s32MilliSec);
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("HI_MPI_VI_GetChnFrame failed with %#x\n",s32Ret);
       return s32Ret;
   }
   SAMPLE_PRT("HI_MPI_VI_GetChnFrame success with %#x,width=%d\n", s32Ret,
    pstFrameInfo.stVFrame.u32Width);
   
   s32Ret = HI_MPI_VPSS_SendFrame(VpssGrp, VpssGrpPipe, &pstFrameInfo, s32MilliSec);
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("HI_MPI_VPSS_SendFrame failed with %#x\n", s32Ret);
       return s32Ret;
   }
   
   s32Ret = HI_MPI_VI_ReleaseChnFrame(ViPipe, ViChn, &pstFrameInfo );
   if (HI_SUCCESS != s32Ret)
   {
       SAMPLE_PRT("HI_MPI_VI_ReleaseChnFrame failed with %#x\n", s32Ret);
       return s32Ret;
   }
}

   //HI_MPI_VI_GetPipeFrame();
}



HI_S32 SAMPLE_COMM_VI_Bind_VPSS(VI_PIPE ViPipe, VI_CHN ViChn, VPSS_GRP VpssGrp)
{
    MPP_CHN_S stSrcChn;
    MPP_CHN_S stDestChn;

    stSrcChn.enModId   = HI_ID_VI;
    stSrcChn.s32DevId  = ViPipe;
    stSrcChn.s32ChnId  = ViChn;

    stDestChn.enModId  = HI_ID_VPSS;
    stDestChn.s32DevId = VpssGrp;
    stDestChn.s32ChnId = 0;

    SAMPLE_PRT("ViPipe=%d,ViChn=%d,VpssGrp=%d\n", ViPipe, ViChn, VpssGrp);
    //CHECK_RET(HI_MPI_SYS_Bind(&stSrcChn, &stDestChn), "HI_MPI_SYS_Bind(VI-VPSS)");
   
    int ret = pthread_create(&th_getVIFrame,NULL,GetFrameFromVItoVPSS,NULL);
    SAMPLE_PRT("create ret=%d\n", ret);
    return HI_SUCCESS;
}[/code]

打印提示如下

[SAMPLE_COMM_VI_Bind_VPSS]-535: ViPipe=0,ViChn=0,VpssGrp=0
[SAMPLE_COMM_VI_Bind_VPSS]-539: create ret=0
[GetFrameFromVItoVPSS]-503: HI_MPI_VI_GetChnFrame success with 0,width=0
[GetFrameFromVItoVPSS]-508: HI_MPI_VPSS_SendFrame failed with 0xa0078003
我来回答
回答1个
时间排序
认可量排序

lcg0115

0个粉丝

1

问答

0

专栏

0

资料

lcg0115 2019-05-03 09:29:15
认可1

主要还是要设置一下stChnAttr.u32Depth 就好了。
最开始想着从yuv直接画框,貌似opencv 不支持对yuv操作
还 是要研究一下海思的区域。

[code]void *GetFrameFromVItoVPSS(void* arg)
{
   VIDEO_FRAME_INFO_S pstFrameInfo; //sYUVFrameInfo
   HI_S32      s32MilliSec = 2000;
   HI_S32 s32Ret;
   VI_PIPE ViPipe = 0 ;
   VI_CHN ViChn = 0;
   VI_CHN_ATTR_S stChnAttr;
   HI_U32 u32Depth = 2;
   
   VPSS_GRP VpssGrp = 0;
   VPSS_GRP_PIPE VpssGrpPipe = 0;
   
   s32Ret = HI_MPI_VI_GetChnAttr(ViPipe, ViChn, &stChnAttr);
   
   if (HI_SUCCESS != s32Ret)
   {
       printf("get chn attr error!!!\n");
       return (HI_VOID*) - 1;
   }
   
   u32OrigDepth = stChnAttr.u32Depth;
   stChnAttr.u32Depth = u32Depth;
   s32Ret = HI_MPI_VI_SetChnAttr(ViPipe, ViChn, &stChnAttr);
   
   if (HI_SUCCESS != s32Ret)
   {
       printf("set chn attr error!!!\n");
       return (HI_VOID*) - 1;
   }
   while(1) {
  
       HI_MPI_VI_GetChnFrame(ViPipe, ViChn, &pstFrameInfo,s32MilliSec);
       if (HI_SUCCESS != s32Ret)
       {
           SAMPLE_PRT("HI_MPI_VI_GetChnFrame failed with %#x\n",s32Ret);
           //return s32Ret;
           //continue;
       } else {
           SAMPLE_PRT("HI_MPI_VI_GetChnFrame success with %#x,width=%d\n", s32Ret, pstFrameInfo.stVFrame.u32Width);
           //sample_yuv_work(&pstFrameInfo);
           
           s32Ret = HI_MPI_VPSS_SendFrame(VpssGrp, VpssGrpPipe, &pstFrameInfo, s32MilliSec);
           if (HI_SUCCESS != s32Ret)
           {
               SAMPLE_PRT("HI_MPI_VPSS_SendFrame failed with %#x\n", s32Ret);
               //return s32Ret;
               //continue;
           }
       }
      
       s32Ret = HI_MPI_VI_ReleaseChnFrame(ViPipe, ViChn, &pstFrameInfo );
       if (HI_SUCCESS != s32Ret)
       {
           SAMPLE_PRT("HI_MPI_VI_ReleaseChnFrame failed with %#x\n", s32Ret);
           //return s32Ret;
           //continue;
       }
      
   }
   //HI_MPI_VI_GetPipeFrame();
}[/code]
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区