首页问答详情

设置了depth以及用户模式,但是HI_MPI_VPSS_GetChnFrame获取到的数据为空

 
Chenw_Fly
Chenw_Fly  发布于  2017-08-07 10:52:31
采纳率 0%
2个问答

目前的方式,直接读取VI的数据,然后交给vpss处理之后得到缩放后的yuv数据,但是不管怎么样修改
HI_MPI_VPSS_GetChnFrame获取到的数据为空。看了论坛的相关的帖子,已经设置了depth,但是还是读取不到数据,麻烦
哪位帮忙看一下吧,谢谢:handshake


PS:HI_MPI_VI_GetFrame获取数据是ok的,HI_MPI_VPSS_SendFrame发送数据也没有报错。

int main()
{
        VPSS_GRP_ATTR_S                         stGrpVpssAttr = {0};
        VPSS_CHN_ATTR_S                         stChnAttr = {0};
        VIDEO_FRAME_INFO_S                 stFrame;
        HI_S32                                         s32Ret;
        VPSS_CHN_MODE_S                         stVpssMode;
           HI_S32                                        u32Depth = 2;
        VPSS_GRP                                 VpssGrp = 0;
        VPSS_CHN                                 VpssChn = 3;
   

        VB_CONF_S                                 stVbConf;
        VB_BLK                                         VbBlk = VB_INVALID_HANDLE;
        VB_POOL                                         hPool  = VB_INVALID_POOLID;
        int                                                 new_width = 1280;
        int                                                 new_height = 720;
        HI_U32                                             u32Size = new_width * new_height * 3 / 2;


        PIC_SIZE_E                                 enSize = PIC_UHD4K;
        HI_U32                                         u32BlkSize;
        VIDEO_NORM_E                         gs_enNorm = VIDEO_ENCODING_MODE_NTSC;
        SAMPLE_VI_CONFIG_S                 stViConfig = {0};
        VI_CHN                                         ViChn = 0;
        HI_U32                                        u32OldDepth = 8;

    memset(&stVbConf,0,sizeof(VB_CONF_S));

    SAMPLE_COMM_VI_GetSizeBySensor(&enSize);

    stVbConf.u32MaxPoolCnt = 16;
    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, enSize, PIXEL_FORMAT_YUV_SEMIPLANAR_422, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[0].u32BlkCnt = 8;

    s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("system init failed with %d!\n", s32Ret);      
    }


    stViConfig.enViMode   = SENSOR_TYPE;
    stViConfig.enRotate   = ROTATE_NONE;
    stViConfig.enNorm     = VIDEO_ENCODING_MODE_AUTO;
    stViConfig.enViChnSet = VI_CHN_SET_NORMAL;
    stViConfig.enWDRMode  = WDR_MODE_NONE;
    s32Ret = SAMPLE_COMM_VI_StartVi(&stViConfig);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("start vi failed!\n");
            
    }
   

        s32Ret = HI_MPI_VI_GetFrameDepth(ViChn,&u32OldDepth);
        if(HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("Err00000000000, s32Ret:0x%x\n",s32Ret);
        }



   s32Ret = HI_MPI_VI_SetFrameDepth(ViChn, u32Depth);
   if(HI_SUCCESS != s32Ret)
   {
            SAMPLE_PRT("Err11111111111111, s32Ret:0x%x\n",s32Ret);
   }


        stGrpVpssAttr.u32MaxW = 3840;
        stGrpVpssAttr.u32MaxH = 2160;
        stGrpVpssAttr.bIeEn = HI_FALSE;
        stGrpVpssAttr.bDciEn = HI_FALSE;
        stGrpVpssAttr.bNrEn = HI_TRUE;
        stGrpVpssAttr.bHistEn = HI_FALSE;
        stGrpVpssAttr.enDieMode = VPSS_DIE_MODE_NODIE;
        stGrpVpssAttr.stNrAttr.enNrType = VPSS_NR_TYPE_VIDEO;
        stGrpVpssAttr.stNrAttr.stNrVideoAttr.enNrRefSource = VPSS_NR_REF_FROM_RFR;
        stGrpVpssAttr.stNrAttr.u32RefFrameNum = 2;
        stGrpVpssAttr.bStitchBlendEn   = HI_FALSE;

        stGrpVpssAttr.enPixFmt = PIXEL_FORMAT_YUV_SEMIPLANAR_422;

   
    s32Ret = HI_MPI_VPSS_CreateGrp(VpssGrp, &stGrpVpssAttr);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_CreateGrp failed with %#x!\n", s32Ret);
        goto END;
    }

    s32Ret = HI_MPI_VPSS_StartGrp(VpssGrp);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_StartGrp failed with %#x\n", s32Ret);
        goto END;
    }

    s32Ret = VI_BindVpss(ViChn, VpssGrp, VpssChn);
        if(HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("VI_BindVpss, failed :0x%x\n",s32Ret);
              goto END;
    }

    #if 0
        s32Ret = HI_MPI_VPSS_GetGrpAttr(VpssGrp, &stGrpVpssAttr);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_GetGrpAttr failed with %#x!\n", s32Ret);
        goto END;
    }

       
        stGrpVpssAttr.bIeEn = HI_FALSE;
        stGrpVpssAttr.bNrEn = HI_FALSE;
        s32Ret = HI_MPI_VPSS_SetGrpAttr(VpssGrp, &stGrpVpssAttr);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_SetGrpAttr failed with %#x!\n", s32Ret);
        goto END;
    }
        #endif


        #if 0
        s32Ret = HI_MPI_VPSS_GetChnAttr(VpssGrp, VpssChn, &stChnAttr);       
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_GetChnAttr failed with %#x!\n", s32Ret);
        goto END;
    }
        #endif

        memset(&stChnAttr, 0, sizeof(stChnAttr));
        stChnAttr.s32SrcFrameRate = -1;
        stChnAttr.s32DstFrameRate = -1;
        s32Ret = HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, &stChnAttr);               
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_SetChnAttr failed with %#x!\n", s32Ret);
        goto END;
    }

       
    #if 0
        s32Ret =  HI_MPI_VPSS_GetChnMode(VpssGrp, VpssChn, &stVpssMode);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_GetChnMode failed with %#x!\n", s32Ret);
        goto END;
    }
        #endif

        stVpssMode.enChnMode = VPSS_CHN_MODE_USER;
    stVpssMode.bDouble         = HI_FALSE;
    stVpssMode.enPixelFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_422;
    stVpssMode.u32Width = new_width;               
    stVpssMode.u32Height = new_height;            

        s32Ret =  HI_MPI_VPSS_SetChnMode(VpssGrp, VpssChn, &stVpssMode);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_SetChnMode failed with %#x!\n", s32Ret);
        goto END;
    }

        s32Ret =  HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_SetChnMode failed with %#x!\n", s32Ret);
        goto END;
    }

        #if 1
        s32Ret =  HI_MPI_VPSS_SetDepth(VpssGrp, VpssChn, u32Depth);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_SetDepth failed with %#x!\n", s32Ret);
        goto END;
    }
        #endif


    /*create comm vb pool*/
    hPool   = HI_MPI_VB_CreatePool(u32Size, 5 , NULL);
    if (hPool == VB_INVALID_POOLID)
    {
        SAMPLE_PRT("HI_MPI_VB_CreatePool failed! \n");
                goto END;   
        }



    int count = 0;
    while(1)
    {
        VIDEO_FRAME_INFO_S stExtFrmInfo;

        count++;
          
            s32Ret = HI_MPI_VI_GetFrame(ViChn, &stFrame, 100);
            if(HI_SUCCESS != s32Ret)
            {
                SAMPLE_PRT("HI_MPI_VI_GetFrame, failed :0x%x\n",s32Ret);
                      goto END;
            }


        s32Ret = HI_MPI_VPSS_SendFrame(VpssGrp, &stFrame /*&stDstframe*/, 100);
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_VPSS_SendFrame faild with%#x! \n", s32Ret);
            goto END;
        }  

                #if 1
        memset(&stExtFrmInfo, 0, sizeof(stExtFrmInfo));
            stExtFrmInfo.u32PoolId = VB_INVALID_POOLID;

        s32Ret = HI_MPI_VPSS_GetChnFrame(VpssGrp, VpssChn, &stExtFrmInfo, 100);
            if (s32Ret == HI_SUCCESS)
        {
           HI_MPI_VPSS_ReleaseChnFrame(VpssGrp, VpssChn, &stExtFrmInfo);
           printf("success !!!!!!!!!!!!!!!!!!! \n");
        }
        else
              {
                SAMPLE_PRT("HI_MPI_VPSS_GetChnFrame failed with %#x\n", s32Ret);
                //goto END;
            }
                #endif

                s32Ret = HI_MPI_VI_ReleaseFrame(ViChn, &stFrame);
                if(HI_SUCCESS != s32Ret)
                {
                           SAMPLE_PRT("Info:HI_MPI_VB_ReleaseBlock fail, s32Ret:0x%x\n",s32Ret );
                           goto END;
                }       

        if (count >= 50)
           break;
    }


END:

        SAMPLE_COMM_VI_StopVi(&stViConfig);

    if (VB_INVALID_POOLID != hPool)
    {
        HI_MPI_VB_DestroyPool( hPool );
        hPool = VB_INVALID_POOLID;
    }

        s32Ret = VI_UnBindVpss(ViChn, VpssGrp, VpssChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("VI_UnBindVpss failed with %#x\n", s32Ret);
        }

        s32Ret = HI_MPI_VPSS_DisableChn(VpssGrp, VpssChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_DisableChn failed with %#x\n", s32Ret);
        }

    s32Ret = HI_MPI_VPSS_StopGrp(VpssGrp);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_StopGrp failed with %#x\n", s32Ret);
    }

        s32Ret =  HI_MPI_VPSS_DisableChn(VpssGrp, VpssChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_DisableChn failed with %#x!\n", s32Ret);
    }

    s32Ret = HI_MPI_VPSS_DestroyGrp(VpssGrp);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_DestroyGrp failed with %#x!\n", s32Ret);
    }


        SAMPLE_COMM_SYS_Exit();


    printf("\n\n\nfinished !!!! \n\n");
    return 0;
}
我来回答
9716
1
1
回答
14个
易百纳技术社区
Chenw_Fly 发布于2017-08-07 13:58:26
1.初始化打开vi,
2.将vi 绑定到vpss
3.然后将vi获取的数据send到vpss
4.再从vpss获取缩放后的yuv数据

就是这最后一步获取的数据为空,代码在上面,麻烦哪位帮忙看看,谢谢,这个问题折腾我几天了
0
易百纳技术社区
zhuangweiye 发布于2017-08-07 14:50:16
[quote][url=forum.php?mod=redirect&goto=findpost&pid=56939&ptid=18373]Chenw_Fly 发表于 2017-8-7 13:58[/url]
1.初始化打开vi,
2.将vi 绑定到vpss
3.然后将vi获取的数据send到vpss
[/quote]

是啥平台????
0
易百纳技术社区
Chenw_Fly 发布于2017-08-07 14:54:45
[quote][url=forum.php?mod=redirect&goto=findpost&pid=56950&ptid=18373]zhuangweiye 发表于 2017-8-7 14:50[/url]
是啥平台????[/quote]

hisi3519V101,还望庄工多指点一番,先谢过了
0
易百纳技术社区
zhuangweiye 发布于2017-08-07 15:05:54
[quote][url=forum.php?mod=redirect&goto=findpost&pid=56953&ptid=18373]Chenw_Fly 发表于 2017-8-7 14:54[/url]
hisi3519V101,还望庄工多指点一番,先谢过了[/quote]

离线还是在线模式?

不是很明白楼主的意思, 不是都绑定了vi-vpss 吗 ?
0
易百纳技术社区
Chenw_Fly 发布于2017-08-07 15:14:55
将yuv422改成了yuv420之后, /dev/logmap下面的提示信息是这样的:
<3>[  vpss] [Func]:VPSS_SendPic [Line]:8535 [Info]:<3>[  vpss] [grp0]:vpss s32PipeId(1) unexist!
0
易百纳技术社区
Chenw_Fly 发布于2017-08-07 15:47:08
[quote][url=forum.php?mod=redirect&goto=findpost&pid=56956&ptid=18373]zhuangweiye 发表于 2017-8-7 15:05[/url]
离线还是在线模式?

不是很明白楼主的意思, 不是都绑定了vi-vpss 吗 ?[/quote]

离线模式,谢谢庄工。问题已经解决了,在于maxW和maxH的设置,这个不能按照文档来,流程是对的
0
易百纳技术社区
Chenw_Fly 发布于2017-08-07 15:51:28
这个例子,有需要的同学可以作为分辨率缩放的一个demo,流程基本上是ok的,也有结果输出
0
易百纳技术社区
ksniper 发布于2017-09-14 15:50:55
请问下VPSS中 getframe的帧率能达到多少?  感觉我直接从VI中getframe 太慢了
0
易百纳技术社区
Chenw_Fly 发布于2017-09-28 15:00:23
[quote][url=forum.php?mod=redirect&goto=findpost&pid=64015&ptid=18373]ksniper 发表于 2017-9-14 15:50[/url]
请问下VPSS中 getframe的帧率能达到多少?  感觉我直接从VI中getframe 太慢了[/quote]

如果只有一个vpss的group,一个group只有一个channel,出来的帧率还是准的。senor设置的是多少,编码出来的就是多少。只是这个过程中,你要是获取一帧yuv或者编码出来一帧h264 你就写文件的话,会影响到vi获取速度,导致帧率不准
0
易百纳技术社区
qn1515560163 发布于2018-01-10 13:17:10
楼主你好,我现在跟你用的是一样的,但是vpss数据会有vi残留数据,楼主出现过吗
0
易百纳技术社区
simonhuang 发布于2018-07-27 16:30:56
vi 已经 bind vpss, 为何还要调用vpss_sendframe?
0
易百纳技术社区
qn1511544493 发布于2018-10-23 14:53:24
楼主解决后的完整代码能贴上来共享下吗?
0
易百纳技术社区
It-is-windy 发布于2019-12-30 10:40:25
[quote][url=forum.php?mod=redirect&goto=findpost&pid=56964&ptid=18373]Chenw_Fly 发表于 2017-8-7 15:47[/url]
离线模式,谢谢庄工。问题已经解决了,在于maxW和maxH的设置,这个不能按照文档来,流程是对的[/quote]

前辈,请问maxH和maxW要如何设置呢?
0
易百纳技术社区
jipd 发布于2018-07-27 17:47:50
顶起来。。。:victory:
0

Markdown 语法

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

Markdown 语法

  • 加粗 **内容**
  • 斜体 *内容*
  • 删除线 ~~内容~~
  • 引用 > 引用内容
  • 代码 `代码`
  • 代码块 ```编程语言↵代码```
  • 链接 [链接标题](url)
  • 无序列表 - 内容
  • 有序列表 1. 内容
  • 缩进 内容
  • 图片 ![alt](url)
+ 添加网盘链接/附件
或将文件直接拖到这里
悬赏:
EBC
网盘
* 网盘链接:
* 提取码:
悬赏:
EBC
相关问答
无更多相似问答 去提问
Loading...
易百纳技术社区
确定要删除此文章、专栏、评论吗?
确定
取消
易百纳技术社区
易百纳技术社区
在专栏模块发布专栏,可获得其他E友的打赏
易百纳技术社区
回答悬赏问答,被题主采纳后即可获得悬赏金
易百纳技术社区
在上传资料时,有价值的资料可设置为付费资源
易百纳技术社区
达到一定金额,收益即可提现~
收益也可用来充值ebc,下载资料、兑换礼品更容易
易百纳技术社区
活动规则
  • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
  • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准
  • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
  • 4.每周最后三个任务将会有以下奖品掉落:社区热卖开发板、小米音响、视频年度会员、京东卡、华为手机等等
易百纳技术社区
升级提醒
易百纳技术社区

恭喜您由入门

社区送出礼品一份

请填写您的收件地址,礼品将在3个工作日寄出

易百纳技术社区