ubosm

ubosm

0个粉丝

1

问答

0

专栏

0

资料

ubosm  发布于  2019-12-10 19:04:13
采纳率 0%
1个问答
1865

3536C解码多路,内存不足,菜鸟求助

 
背景:我们想在3536C上展示4-16路监控画面,但开发板只有256M的内存,然后uboot里面系统内存设置的64M,剩下的mmz192M
出现问题:我解码3路1080P是OK,但是当我设置4路的时候。就会报内存不足错误
求助:我想拉流16路1080P,然后解成D1展示就OK,请问我要怎么配置我的代码,买开发板的时候里面自带了一个NVR系统,那个是可以解码显示4路+的。才玩这个,菜鸟求指点。


代码如下

[code]HI_S32 SAMPLE_VDEC_H264(HI_VOID)
{
    VB_CONF_S stVbConf, stModVbConf;
    HI_S32 i, s32Ret = HI_SUCCESS;
    VDEC_CHN_ATTR_S stVdecChnAttr[VDEC_MAX_CHN_NUM];
    VdecThreadParam stVdecSend[VDEC_MAX_CHN_NUM];
    VPSS_GRP_ATTR_S stVpssGrpAttr[VDEC_MAX_CHN_NUM];
    SIZE_S stSize, stRotateSize;
    VO_DEV VoDev;
    VO_LAYER VoLayer;
    VO_PUB_ATTR_S stVoPubAttr;
    VO_VIDEO_LAYER_ATTR_S stVoLayerAttr;
    HI_U32 u32VdCnt = 4, u32GrpCnt = 4;
    pthread_t   VdecThread[2*VDEC_MAX_CHN_NUM];

    stSize.u32Width = DEST_WIDTH;
    stSize.u32Height = DEST_HEIGHT;
       
    /************************************************
    step1:  init SYS and common VB
    *************************************************/
    // SAMPLE_COMM_VDEC_Sysconf(&stVbConf, &stSize);
    // s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
    // if(s32Ret != HI_SUCCESS)
    // {
    //     SAMPLE_PRT("init sys fail for %#x!\n", s32Ret);
    //     goto END1;
    // }
    MPP_SYS_CONF_S stSysConf = {0};

        memset(&stVbConf,0,sizeof(stVbConf));
        stSize.u32Width = DEST_WIDTH;
    stSize.u32Height = DEST_HEIGHT;
    HI_S32 PicSize;
    VB_PIC_BLK_SIZE(DEST_WIDTH, DEST_HEIGHT, PT_H264, PicSize);        
        stVbConf.u32MaxPoolCnt = 1;
        stVbConf.astCommPool[0].u32BlkSize = PicSize;
        stVbConf.astCommPool[0].u32BlkCnt         = 5;
        memset(stVbConf.astCommPool[0].acMmzName,0,sizeof(stVbConf.astCommPool[0].acMmzName));
       
        HI_MPI_SYS_Exit();
   
    for(i=0;i<22;i++)
    {
         HI_MPI_VB_ExitModCommPool(i);
    }
    for(i=0; i<256; i++)
    {
         HI_MPI_VB_DestroyPool(i);
    }
    HI_MPI_VB_Exit();
       
        s32Ret = HI_MPI_VB_SetConf(&stVbConf);
        if (HI_SUCCESS != s32Ret)
        {
                SAMPLE_PRT("HI_MPI_VB_SetConf failed!\n");
                return HI_FAILURE;
        }
        s32Ret = HI_MPI_VB_Init();
        if (HI_SUCCESS != s32Ret)
        {
                SAMPLE_PRT("HI_MPI_VB_Init failed!\n");
                return HI_FAILURE;
        }
        stSysConf.u32AlignWidth = 16;
        /*set config of mpp system*/
        s32Ret = HI_MPI_SYS_SetConf(&stSysConf);
        if (HI_SUCCESS != s32Ret)
        {
                SAMPLE_PRT("HI_MPI_SYS_SetConf failed!\n");
                return HI_FAILURE;
        }
        s32Ret = HI_MPI_SYS_Init();               
        if (HI_SUCCESS != s32Ret)
        {
                SAMPLE_PRT("HI_MPI_SYS_Init failed!\n");
                return HI_FAILURE;
        }


    /************************************************
    step2:  init mod common VB
    *************************************************/
    SAMPLE_COMM_VDEC_ModCommPoolConf(&stModVbConf, PT_H264, &stSize, u32VdCnt, HI_FALSE);       
    s32Ret = SAMPLE_COMM_VDEC_InitModCommVb(&stModVbConf);
    if(s32Ret != HI_SUCCESS)
    {                   
        SAMPLE_PRT("init mod common vb fail for %#x!\n", s32Ret);
        goto END1;
    }

    /************************************************
    step3:  start VDEC
    *************************************************/
    SAMPLE_COMM_VDEC_ChnAttr(u32VdCnt, &stVdecChnAttr[0], PT_H264, &stSize);
    s32Ret = SAMPLE_COMM_VDEC_Start(u32VdCnt, &stVdecChnAttr[0]);
    if(s32Ret != HI_SUCCESS)
    {       
        SAMPLE_PRT("start VDEC fail for %#x!\n", s32Ret);
        goto END2;
    }

    /************************************************
    step4:  start VPSS
    *************************************************/
    stRotateSize.u32Width = stRotateSize.u32Height = MAX2(stSize.u32Width, stSize.u32Height);
    SAMPLE_COMM_VDEC_VpssGrpAttr(u32GrpCnt, &stVpssGrpAttr[0], &stRotateSize);
    s32Ret = SAMPLE_COMM_VPSS_Start(u32GrpCnt, &stRotateSize, 1, &stVpssGrpAttr[0]);
    if(s32Ret != HI_SUCCESS)
    {            
        SAMPLE_PRT("start VPSS fail for %#x!\n", s32Ret);
        goto END3;
    }

    /************************************************
    step5:  start VO
    *************************************************/       
    VoDev = SAMPLE_VO_DEV_DHD0;
    VoLayer = SAMPLE_VO_DEV_DHD0;
   
#if HI_FPGA
    stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30;
    stVoPubAttr.enIntfType = VO_INTF_VGA;
#else
    stVoPubAttr.enIntfSync = VO_OUTPUT_1080P60;
    stVoPubAttr.enIntfType = VO_INTF_VGA | VO_INTF_HDMI;
#endif
    s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr);
    if(s32Ret != HI_SUCCESS)
    {               
        SAMPLE_PRT("vdec bind vpss fail for %#x!\n", s32Ret);
        goto END4_1;
    }

#ifndef HI_FPGA
    if (HI_SUCCESS != SAMPLE_COMM_VO_HdmiStart(stVoPubAttr.enIntfSync))
    {
        SAMPLE_PRT("Start SAMPLE_COMM_VO_HdmiStart failed!\n");
        goto END4_2;
    }
#endif

    stVoLayerAttr.bClusterMode = HI_FALSE;
    stVoLayerAttr.bDoubleFrame = HI_FALSE;
    stVoLayerAttr.enPixFormat = SAMPLE_PIXEL_FORMAT;   

    s32Ret = SAMPLE_COMM_VO_GetWH(stVoPubAttr.enIntfSync, \
        &stVoLayerAttr.stDispRect.u32Width, &stVoLayerAttr.stDispRect.u32Height, &stVoLayerAttr.u32DispFrmRt);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("failed with %#x!\n", s32Ret);
        goto  END4_2;
    }
    stVoLayerAttr.stImageSize.u32Width = stVoLayerAttr.stDispRect.u32Width;
    stVoLayerAttr.stImageSize.u32Height = stVoLayerAttr.stDispRect.u32Height;
    s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stVoLayerAttr);
    if(s32Ret != HI_SUCCESS)
    {               
        SAMPLE_PRT("SAMPLE_COMM_VO_StartLayer fail for %#x!\n", s32Ret);
        goto END4_3;
    }       

    s32Ret = SAMPLE_COMM_VO_StartChn(VoLayer, VO_MODE_4MUX);
    if(s32Ret != HI_SUCCESS)
    {               
        SAMPLE_PRT("vdec bind vpss fail for %#x!\n", s32Ret);
        goto END4_4;
    }

    /************************************************
    step6:  VDEC bind VPSS
    *************************************************/       
    for(i=0; i     {
            s32Ret = SAMPLE_COMM_VDEC_BindVpss(i, i);
            if(s32Ret != HI_SUCCESS)
            {            
            SAMPLE_PRT("vdec bind vpss fail for %#x!\n", s32Ret);
            goto END5;
            }       
    }
           
    /************************************************
    step7:  VPSS bind VO
    *************************************************/
    for(i=0; i     {
        s32Ret = SAMPLE_COMM_VO_BindVpss(VoLayer, i, i, VPSS_CHN0);
        if(s32Ret != HI_SUCCESS)
        {            
            SAMPLE_PRT("vpss bind vo fail for %#x!\n", s32Ret);
            goto END6;
        }       
    }       

    /************************************************
    step8:  send stream to VDEC
    *************************************************/
    SAMPLE_COMM_VDEC_ThreadParam(u32VdCnt, &stVdecSend[0], &stVdecChnAttr[0], SAMPLE_1080P_H264_PATH);       
    SAMPLE_COMM_VDEC_StartSendStream(u32VdCnt, &stVdecSend[0], &VdecThread[0]);

    /***  get the stat info of luma pix  ***/
    SAMPLE_COMM_VDEC_StartGetLuma(u32VdCnt, &stVdecSend[0], &VdecThread[0]);

    /***  set the rotational angle of decode pic  ***/
    printf("SAMPLE_TEST: set set the rotational angle of decode pic now.");
   #if 0
    sleep(5);
    for(i=0; i     {   
        enRotate = ROTATE_90;
        HI_MPI_VDEC_SetRotate(i, enRotate);
    }
    sleep(3);
    for(i=0; i     {   
        enRotate = ROTATE_180;
        HI_MPI_VDEC_SetRotate(i, enRotate);
    }
    sleep(3);
    for(i=0; i     {   
        enRotate = ROTATE_270;
        HI_MPI_VDEC_SetRotate(i, enRotate);
    }
    sleep(3);       
    for(i=0; i     {   
        enRotate = ROTATE_NONE;
        HI_MPI_VDEC_SetRotate(i, enRotate);
    }
#endif
    /***  control the send stream thread and get luma info thread  ***/
    SAMPLE_COMM_VDEC_CmdCtrl(u32VdCnt, &stVdecSend[0]);

    SAMPLE_COMM_VDEC_StopSendStream(u32VdCnt, &stVdecSend[0], &VdecThread[0]);

    SAMPLE_COMM_VDEC_StopGetLuma(u32VdCnt, &stVdecSend[0], &VdecThread[0]);
               
END6:
    for(i=0; i     {
        s32Ret = SAMPLE_COMM_VO_UnBindVpss(VoLayer, i, i, VPSS_CHN0);
        if(s32Ret != HI_SUCCESS)
        {            
            SAMPLE_PRT("vpss unbind vo fail for %#x!\n", s32Ret);
        }       
    }               

END5:
    for(i=0; i     {
        s32Ret = SAMPLE_COMM_VDEC_UnBindVpss(i, i);
        if(s32Ret != HI_SUCCESS)
        {            
            SAMPLE_PRT("vdec unbind vpss fail for %#x!\n", s32Ret);
        }       
    }

END4_4:
    SAMPLE_COMM_VO_StopChn(VoLayer, VO_MODE_4MUX);       
END4_3:
    SAMPLE_COMM_VO_StopLayer(VoLayer);
END4_2:
#ifndef HI_FPGA
    SAMPLE_COMM_VO_HdmiStop();
#endif
END4_1:
    SAMPLE_COMM_VO_StopDev(VoDev);

END3:
    SAMPLE_COMM_VPSS_Stop(u32GrpCnt, VPSS_CHN0);

END2:
    SAMPLE_COMM_VDEC_Stop(u32VdCnt);               
       
END1:
    SAMPLE_COMM_SYS_Exit();       

    return s32Ret;
}
[/code]
我来回答
回答3个
时间排序
认可量排序

goodman

2个粉丝

30

问答

18

专栏

17

资料

goodman 2019-12-11 13:42:06
认可0
同时解码16路这点内存是不行的,显示成D1也是解码后通过VPSS缩放完成的

ubosm

0个粉丝

1

问答

0

专栏

0

资料

ubosm 2019-12-11 14:02:00
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=151000&ptid=76869]goodman 发表于 2019-12-11 13:42[/url]
同时解码16路这点内存是不行的,显示成D1也是解码后通过VPSS缩放完成的[/quote]

请问一下 我512M的可以不哇,针对这个demo,我还有啥可以优化的地方哇,我现在把VO的buffer降下来了,释放了大概20M内存出来,可以跑4路1080P了.

ubosm

0个粉丝

1

问答

0

专栏

0

资料

ubosm 2019-12-13 11:09:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=151000&ptid=76869]goodman 发表于 2019-12-11 13:42[/url]
同时解码16路这点内存是不行的,显示成D1也是解码后通过VPSS缩放完成的[/quote]

感谢大佬,目前已经可以4路1080P了,按照MPP文档里面的FAQ内存优化建议进行了一系列优化,现在内存节约了好几十M
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区