放学后不许跑

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑  发布于  2017-05-25 10:25:04
采纳率 0%
2个问答
9861

如何解决VPSS DisableChn failed with 0xa0078010这个初始化问题

 
我是拿Project.cvbs版本的sample_venc的例子自己在第一个功能里(一共有CHN 0  PIC_D1 ,    CHN 1   PIC_D1 ,CHN 2    PIC_CIF      这三个物理通道)把2通道改成了拓展通道4并绑定了物理通道0,想通过拓展通道把分辨率放大1920*1080,结果添加完HI_MPI_VPSS_SetExtChnAttr 和
HI_MPI_VPSS_SetExtChnCrop之后,编译没问题,但是再板子上一跑,结果只有通道0和1有文件保存下来,通道4是0字节,    然后提示摁两次回车,回车之后就会出现错误代码SAMPLE_COMM_VPSS_DisableChn failed with 0xa0078010!   请问这个问题该如何解决,朝哪个方向去思考,求大神相助。
我来回答
回答29个
时间排序
认可量排序

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 10:25:54
认可0
补充一下,板子是HI516A  CVBS版本的

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 10:28:48
认可0
而且,我也参考[url]http://www.ebaina.com/bbs/thread-7406-1-1.html[/url]这个贴的方法试过了,我的编译环境里的SDK版本和板子的SDK版本是一样的V1.0.5.0    ,自己之前也那sample_venc编译完跑过,都没问题。驱动是怎么回事,确实还是不太清楚,请大家不吝赐教~

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 16:01:19
认可0
求大侠们相助!!我已经困惑两天了~

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-25 16:18:32
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50358&ptid=15328]放学后不许跑 发表于 2017-5-25 16:01[/url]
求大侠们相助!!我已经困惑两天了~[/quote]

问题中缺少有用的信息, 无法判断

1。关于没有编码的问题,先确定该通道venc设置是否对,是否收到数据,简单的方法可以看/proc/umap/venc,/proc/umap/vpss,/proc/umap/sys,/dev/logmpp

2。关于disable出错的问题,只能看代码,一般来说楼主的情况是流程问题

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 16:32:24
认可0
本帖最后由 放学后不许跑 于 2017-5-25 21:27 编辑

HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID)
{
    PAYLOAD_TYPE_E enPayLoad[2] = {PT_H264, PT_H264};
    PIC_SIZE_E enSize[2] = {PIC_D1, PIC_D1};
    HI_U32 u32Profile = 0;

    VB_CONF_S stVbConf;
    SAMPLE_VI_CONFIG_S stViConfig = {0};

    VPSS_GRP VpssGrp;
    VPSS_CHN VpssChn;
    VPSS_GRP_ATTR_S stVpssGrpAttr;
    VPSS_CHN_ATTR_S stVpssChnAttr;
    VPSS_CHN_MODE_S stVpssChnMode;
        VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr;
        VPSS_CROP_INFO_S stCropInfo;

    VENC_CHN VencChn;
    SAMPLE_RC_E enRcMode = SAMPLE_RC_CBR;

    HI_S32 s32ChnNum = 2;

    HI_S32 s32Ret = HI_SUCCESS;
    HI_U32 u32BlkSize;
    SIZE_S stSize;
    char c;


    /******************************************
     step  1: init sys variable
    ******************************************/
    memset(&stVbConf, 0, sizeof(VB_CONF_S));

    SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]);
    SAMPLE_COMM_VI_GetSizeBySensor(&enSize[1]);

    stVbConf.u32MaxPoolCnt = 128;

    /*video buffer*/
    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, \
                 enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[0].u32BlkCnt = 20;

    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, \
                 enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.astCommPool[1].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[1].u32BlkCnt = 20;


    /******************************************
     step 2: mpp system init.
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("system init failed with %d!\n", s32Ret);
        goto END_VENC_1080P_CLASSIC_0;
    }

    /******************************************
     step 3: start vi dev & chn to capture
    ******************************************/
    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");
        goto END_VENC_1080P_CLASSIC_1;
    }

    /******************************************
     step 4: start vpss and vi bind vpss
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
        goto END_VENC_1080P_CLASSIC_1;
    }

    VpssGrp = 0;
    stVpssGrpAttr.u32MaxW = 2592;
    stVpssGrpAttr.u32MaxH = 2592;
    stVpssGrpAttr.bIeEn = HI_FALSE;
    stVpssGrpAttr.bNrEn = HI_TRUE;
    stVpssGrpAttr.bHistEn = HI_FALSE;
    stVpssGrpAttr.bDciEn = HI_FALSE;
    stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE;
    stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;

    s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Vpss failed!\n");
        goto END_VENC_1080P_CLASSIC_2;
    }

    s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Vi bind Vpss failed!\n");
        goto END_VENC_1080P_CLASSIC_3;
    }

    VpssChn = 0;
    stVpssChnMode.enChnMode      = VPSS_CHN_MODE_USER;
    stVpssChnMode.bDouble        = HI_FALSE;
    stVpssChnMode.enPixelFormat  = SAMPLE_PIXEL_FORMAT;
    stVpssChnMode.u32Width       = stSize.u32Width;
    stVpssChnMode.u32Height      = stSize.u32Height;
    stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG;
    memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr));
    stVpssChnAttr.s32SrcFrameRate = -1;
    stVpssChnAttr.s32DstFrameRate = -1;
    s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Enable vpss chn failed!\n");
        goto END_VENC_1080P_CLASSIC_4;
    }

    VpssChn = 4;

        stVpssExtChnAttr.s32BindChn   = 0;
        stVpssExtChnAttr.u32Width          = 1920;
        stVpssExtChnAttr.u32Height          = 1080;
        stVpssExtChnAttr.s32DstFrameRate   = -1;
        stVpssExtChnAttr.s32SrcFrameRate   = -1;
        stVpssExtChnAttr.enPixelFormat           = SAMPLE_PIXEL_FORMAT;
        stVpssExtChnAttr.enCompressMode    = COMPRESS_MODE_NONE;
               
    s32Ret = HI_MPI_VPSS_SetExtChnAttr(VpssGrp, VpssChn, &stVpssExtChnAttr);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret);
        return HI_FAILURE;
            goto END_VENC_1080P_CLASSIC_4;
    }

        stCropInfo.bEnable          = HI_TRUE;
        stCropInfo.enCropCoordinate = VPSS_CROP_ABS_COOR;
        stCropInfo.stCropRect.s32X = 0;
        stCropInfo.stCropRect.s32Y = 0;
        stCropInfo.stCropRect.u32Width = 1920;
        stCropInfo.stCropRect.u32Height = 1080;

        s32Ret = HI_MPI_VPSS_SetExtChnCrop(VpssGrp, VpssChn, &stCropInfo);
        if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret);
        return HI_FAILURE;
                goto END_VENC_1080P_CLASSIC_4;
                       
    }
                               
        s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("HI_MPI_VPSS_EnableChn failed with %#x\n", s32Ret);
                return HI_FAILURE;
                goto END_VENC_1080P_CLASSIC_4;
    }
               


    /******************************************
     step 5: start stream venc
    ******************************************/

     enRcMode = SAMPLE_RC_CBR;

    VpssGrp = 0;
    VpssChn = 0;
    VencChn = 0;
    s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0], \
                                    gs_enNorm, enSize[0], enRcMode, u32Profile);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    /*** 1080p **/
    VpssChn = 1;  //  这里我的代码上是4,复制过来不知道啥时候变了。
    VencChn = 1;
    s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \
                                    gs_enNorm, enSize[1], enRcMode, u32Profile);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }


    /******************************************
     step 6: stream venc process -- get stream, then save it to file.
    ******************************************/
    s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    printf("please press twice ENTER to exit this sample\n");
    getchar();
    getchar();

    /******************************************
     step 7: exit process
    ******************************************/
    SAMPLE_COMM_VENC_StopGetStream();

END_VENC_1080P_CLASSIC_5:
    VpssGrp = 0;

    VpssChn = 0;
    VencChn = 0;
    SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn);
    SAMPLE_COMM_VENC_Stop(VencChn);

    VpssChn = 1;  //同样,这里应该是  =4  
    VencChn = 1;
    SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn);
    SAMPLE_COMM_VENC_Stop(VencChn);



    SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);
END_VENC_1080P_CLASSIC_4:        //vpss stop
    VpssGrp = 0;
    VpssChn = 0;
    SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);
    VpssChn = 1;   //这里也一样,应该是4
    SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);

END_VENC_1080P_CLASSIC_3:    //vpss stop
    SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);
END_VENC_1080P_CLASSIC_2:    //vpss stop
    SAMPLE_COMM_VPSS_StopGroup(VpssGrp);
END_VENC_1080P_CLASSIC_1:        //vi stop
    SAMPLE_COMM_VI_StopVi(&stViConfig);
END_VENC_1080P_CLASSIC_0:        //system exit
    SAMPLE_COMM_SYS_Exit();

    return s32Ret;
}

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 16:33:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50360&ptid=15328]zhuangweiye 发表于 2017-5-25 16:18[/url]
问题中缺少有用的信息, 无法判断

1。关于没有编码的问题,先确定该通道venc设置是否对,是否收到数据 ...[/quote]

您好,我现在是把第三个通道取消了,只剩了两个,一个物理0,一个拓展4。一直是这个问题,代码如上。您能帮我看一下问题出在哪里吗?

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 16:37:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50360&ptid=15328]zhuangweiye 发表于 2017-5-25 16:18[/url]
问题中缺少有用的信息, 无法判断

1。关于没有编码的问题,先确定该通道venc设置是否对,是否收到数据 ...[/quote]

您说的确定VENC设置是否对,是否收到数据,是在连接了VI源之后直接在板子上/proc/umap/venc,/proc/umap/vpss,/proc/umap/sys,/dev/logmpp执行这些指令就行吗?我的代码执行完,生成的两个文件一个是有大小的,另一个拓展通道保存下来的文件一直是0字节。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-25 17:11:18
认可0
本帖最后由 zhuangweiye 于 2017-5-25 17:14 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=50364&ptid=15328]放学后不许跑 发表于 2017-5-25 16:33[/url]
您好,我现在是把第三个通道取消了,只剩了两个,一个物理0,一个拓展4。一直是这个问题,代码如上。您能 ...[/quote]

几个问题:

1。不知道楼主用HI_MPI_VPSS_SetExtChnCrop()的目的是什么?

      这个函数是用于crop输入的,既然通道0输出是D1的那么通道4输入的crop设成1080P是不是有点驴头不对马嘴的意思
      看来楼主对VPSS还是不太理解,vpss group是设置能处理的输入图像的大小, vpss channel是设置输出图像的大小(当然是user mode,auto mode不需要设,由后级绑定模块提供大小)
      如果是测试放大全图,那么就不用设crop了, 如果是要测试放大原图中的一部分才用得上

2。关于venc,楼主的代码
s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \
                                    gs_enNorm, enSize[1], enRcMode, u32Profile);
其中PIC_SIZE_E enSize[2] = {PIC_D1, PIC_D1};
目的是要编D1的图吗? 是测试用还是有什么其他想法,不太懂

3。第二路编码的绑定关系
  VpssChn = 1;
  VencChn = 1;
没看错的话,这绑到vpss channel 1上去了,这个是楼主的想法,还是有问题?乱猜中。。。
另外,ipc的SAMPLE_COMM_VPSS_StartGroup()只start了group,并没有enablechn,这个channel 1好像没有启动,这个。。。,然后

4。最后退出前
VpssChn = 1;
SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);
没有enable就去disable,这个。。。


wahuqeir

0个粉丝

1

问答

0

专栏

1

资料

wahuqeir 2017-05-25 17:19:01
认可0
cat /dev/logmpp 看一下错误

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 21:07:23
认可0
本帖最后由 放学后不许跑 于 2017-5-25 21:23 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=50372&ptid=15328]zhuangweiye 发表于 2017-5-25 17:11[/url]
几个问题:

1。不知道楼主用HI_MPI_VPSS_SetExtChnCrop()的目的是什么?
[/quote]

首先,多谢大神指点,原来CROP是用来裁剪输入的(我理解为是裁剪拓展输出的),那我的这个crop就不用再设置了。
然后,第二个问题,我设置两路D1是用来排除不确定因素的,因为我不知道到底哪个参数影响了我第二个通道保存不到数据。     
第三,我复制错了,应该是vpss4通道和venc1通道绑定,4通道使能在4通道属性设置SET CROP之后把通道4 使能了的。
第四,vpss chn1应该是vpss chn4的,使能了,和第三一样,这个可能是没有更改生效。

下面是我整理后的:
HI_S32 SAMPLE_VENC_1080P_CLASSIC(HI_VOID)
{
    PAYLOAD_TYPE_E enPayLoad[2] = {PT_H264, PT_H264};
    PIC_SIZE_E enSize[2] = {PIC_D1, PIC_D1};
    HI_U32 u32Profile = 0;

    VB_CONF_S stVbConf;
    SAMPLE_VI_CONFIG_S stViConfig = {0};

    VPSS_GRP VpssGrp;
    VPSS_CHN VpssChn;
    VPSS_GRP_ATTR_S stVpssGrpAttr;
    VPSS_CHN_ATTR_S stVpssChnAttr;
    VPSS_CHN_MODE_S stVpssChnMode;
        VPSS_EXT_CHN_ATTR_S stVpssExtChnAttr;
        VPSS_CROP_INFO_S stCropInfo;

    VENC_CHN VencChn;
    SAMPLE_RC_E enRcMode = SAMPLE_RC_CBR;

    HI_S32 s32ChnNum = 2;

    HI_S32 s32Ret = HI_SUCCESS;
    HI_U32 u32BlkSize;
    SIZE_S stSize;
    char c;



    /******************************************
     step  1: init sys variable
    ******************************************/
    memset(&stVbConf, 0, sizeof(VB_CONF_S));

    SAMPLE_COMM_VI_GetSizeBySensor(&enSize[0]);
    SAMPLE_COMM_VI_GetSizeBySensor(&enSize[1]);

    stVbConf.u32MaxPoolCnt = 128;

    /*video buffer*/
    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, \
                 enSize[0], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[0].u32BlkCnt = 20;

    u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(gs_enNorm, \
                 enSize[1], SAMPLE_PIXEL_FORMAT, SAMPLE_SYS_ALIGN_WIDTH);
    stVbConf.astCommPool[1].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[1].u32BlkCnt = 20;

    /******************************************
     step 2: mpp system init.
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("system init failed with %d!\n", s32Ret);
        goto END_VENC_1080P_CLASSIC_0;
    }

    /******************************************
     step 3: start vi dev & chn to capture
    ******************************************/
    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");
        goto END_VENC_1080P_CLASSIC_1;
    }

    /******************************************
     step 4: start vpss and vi bind vpss
    ******************************************/
    s32Ret = SAMPLE_COMM_SYS_GetPicSize(gs_enNorm, enSize[0], &stSize);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_SYS_GetPicSize failed!\n");
        goto END_VENC_1080P_CLASSIC_1;
    }

    VpssGrp = 0;
    stVpssGrpAttr.u32MaxW = 2592;
    stVpssGrpAttr.u32MaxH = 2592;
    stVpssGrpAttr.bIeEn = HI_FALSE;
    stVpssGrpAttr.bNrEn = HI_TRUE;
    stVpssGrpAttr.bHistEn = HI_FALSE;
    stVpssGrpAttr.bDciEn = HI_FALSE;
    stVpssGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE;
    stVpssGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;

    s32Ret = SAMPLE_COMM_VPSS_StartGroup(VpssGrp, &stVpssGrpAttr);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Vpss failed!\n");
        goto END_VENC_1080P_CLASSIC_2;
    }

    s32Ret = SAMPLE_COMM_VI_BindVpss(stViConfig.enViMode);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Vi bind Vpss failed!\n");
        goto END_VENC_1080P_CLASSIC_3;
    }

    VpssChn = 0;
    stVpssChnMode.enChnMode      = VPSS_CHN_MODE_USER;
    stVpssChnMode.bDouble        = HI_FALSE;
    stVpssChnMode.enPixelFormat  = SAMPLE_PIXEL_FORMAT;
    stVpssChnMode.u32Width       = stSize.u32Width;
    stVpssChnMode.u32Height      = stSize.u32Height;
    stVpssChnMode.enCompressMode = COMPRESS_MODE_SEG;
    memset(&stVpssChnAttr, 0, sizeof(stVpssChnAttr));
    stVpssChnAttr.s32SrcFrameRate = -1;
    stVpssChnAttr.s32DstFrameRate = -1;
    s32Ret = SAMPLE_COMM_VPSS_EnableChn(VpssGrp, VpssChn, &stVpssChnAttr, &stVpssChnMode, HI_NULL);   //这个函数是封装的一个函数,里面主要有两个功能函数,一个是setvpsschnmode和 setvpsschnattr,另外一个就是使能函数Enablevpsschn
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Enable vpss chn failed!\n");
        goto END_VENC_1080P_CLASSIC_4;
    }

    VpssChn = 4;

        stVpssExtChnAttr.s32BindChn   = 0;
        stVpssExtChnAttr.u32Width          = 1920;
        stVpssExtChnAttr.u32Height          = 1080;
        stVpssExtChnAttr.s32DstFrameRate   = -1;
        stVpssExtChnAttr.s32SrcFrameRate   = -1;
        stVpssExtChnAttr.enPixelFormat           = SAMPLE_PIXEL_FORMAT;
        stVpssExtChnAttr.enCompressMode    = COMPRESS_MODE_NONE;
               
    s32Ret = HI_MPI_VPSS_SetExtChnAttr(VpssGrp, VpssChn, &stVpssExtChnAttr);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("%s failed with %#x\n", __FUNCTION__, s32Ret);
        return HI_FAILURE;
            goto END_VENC_1080P_CLASSIC_4;
    }


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

    /******************************************
     step 5: start stream venc
    ******************************************/

     enRcMode = SAMPLE_RC_CBR;

    VpssGrp = 0;
    VpssChn = 0;
    VencChn = 0;
    s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[0], \
                                    gs_enNorm, enSize[0], enRcMode, u32Profile);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    /*** 1080p **/
    VpssChn = 4;
    VencChn = 1;
    s32Ret = SAMPLE_COMM_VENC_Start(VencChn, enPayLoad[1], \
                                    gs_enNorm, enSize[1], enRcMode, u32Profile);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    s32Ret = SAMPLE_COMM_VENC_BindVpss(VencChn, VpssGrp, VpssChn);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }


    /******************************************
     step 6: stream venc process -- get stream, then save it to file.
    ******************************************/
    s32Ret = SAMPLE_COMM_VENC_StartGetStream(s32ChnNum);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("Start Venc failed!\n");
        goto END_VENC_1080P_CLASSIC_5;
    }

    printf("please press twice ENTER to exit this sample\n");
    getchar();
    getchar();

    /******************************************
     step 7: exit process
    ******************************************/
    SAMPLE_COMM_VENC_StopGetStream();

END_VENC_1080P_CLASSIC_5:
    VpssGrp = 0;

    VpssChn = 0;
    VencChn = 0;
    SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn);
    SAMPLE_COMM_VENC_Stop(VencChn);

    VpssChn = 4;
    VencChn = 1;
    SAMPLE_COMM_VENC_UnBindVpss(VencChn, VpssGrp, VpssChn);
    SAMPLE_COMM_VENC_Stop(VencChn);



    SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);
END_VENC_1080P_CLASSIC_4:        //vpss stop
    VpssGrp = 0;
    VpssChn = 0;
    SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);
    VpssChn = 4;
    SAMPLE_COMM_VPSS_DisableChn(VpssGrp, VpssChn);

END_VENC_1080P_CLASSIC_3:    //vpss stop
    SAMPLE_COMM_VI_UnBindVpss(stViConfig.enViMode);
END_VENC_1080P_CLASSIC_2:    //vpss stop
    SAMPLE_COMM_VPSS_StopGroup(VpssGrp);
END_VENC_1080P_CLASSIC_1:        //vi stop
    SAMPLE_COMM_VI_StopVi(&stViConfig);
END_VENC_1080P_CLASSIC_0:        //system exit
    SAMPLE_COMM_SYS_Exit();

    return s32Ret;
}


放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 21:46:27
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50373&ptid=15328]wahuqeir 发表于 2017-5-25 17:19[/url]
cat /dev/logmpp 看一下错误[/quote]

好长一段,好像都是循环,有用的就三句话:
/aaaa/1/V1.1.7/Debug # cat /dev/logmpp
s_AddExtChnVGSTask [Line]:1260 [Info]:<3>[  vpss] s32PhyChn 4 Scale task get vb fail,w:1920,h:1080
<3>[  vpss] [Func]:VpssDrvGetFrmVbBlk [Line]:7428 [Info]:<3>[  vpss] [grp0 chn0}:get buffer fail,size 3110400 !
<3>[  vpss] [Func]:Vpss_AddExtChnVGSTask [Line]:1260 [Info]:<3>[  vpss] s32PhyChn 4 Scale task get vb fail,w:1920,h:1080
........(重复都是以上两句)
<3>[  vpss] [Func]:VPSS_DisableChn [Line]:4848 [Info]:<3>[  vpss] bind ext chn4 still enabled



(大神,我有一个疑问,就是这里为什么会显示[  vpss] s32PhyChn 4 Scale task get vb fail,w:1920,h:1080
  chn4不应该是Extchn 吗?怎么这里会显示PhyChn?)

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-25 22:20:26
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50372&ptid=15328]zhuangweiye 发表于 2017-5-25 17:11[/url]
几个问题:

1。不知道楼主用HI_MPI_VPSS_SetExtChnCrop()的目的是什么?
[/quote]

VI——VpssChn0——Venc0
         |
         VpssExtChn4——Venc1   大神,这样理解这个结构对吗?
还是说应该是
VI——VpssChn0——VpssExtChn4——Venc1      VpssChn0和VpssExtChn4中间不能加Venc 0?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-26 08:06:34
认可0
本帖最后由 zhuangweiye 于 2017-5-26 08:08 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=50389&ptid=15328]放学后不许跑 发表于 2017-5-25 21:46[/url]
好长一段,好像都是循环,有用的就三句话:
/aaaa/1/V1.1.7/Debug # cat /dev/logmpp
s_AddExtChnVGSTa ...[/quote]

系统初始化时开一些1920x1080的VB, 不然vpss channel 4因为没有VB而导致没有输出

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-26 08:09:26
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50391&ptid=15328]放学后不许跑 发表于 2017-5-25 22:20[/url]
VI——VpssChn0——Venc0
         |
         VpssExtChn4——Venc1   大神,这样理解这个结构对吗?
...[/quote]

VI——VpssChn0——Venc0
         |
         VpssExtChn4——Venc1  

这个合理

wahuqeir

0个粉丝

1

问答

0

专栏

1

资料

wahuqeir 2017-05-26 09:14:40
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50389&ptid=15328]放学后不许跑 发表于 2017-5-25 21:46[/url]
好长一段,好像都是循环,有用的就三句话:
/aaaa/1/V1.1.7/Debug # cat /dev/logmpp
s_AddExtChnVGSTa ...[/quote]

1. VB 分配不合理,你看下MMZ的内存是多大,给1080P再多加几个块
2. chn 4 是ext chn,最后一个错误显示,你没有解绑就去disable,报错了

wahuqeir

0个粉丝

1

问答

0

专栏

1

资料

wahuqeir 2017-05-26 09:28:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50389&ptid=15328]放学后不许跑 发表于 2017-5-25 21:46[/url]
好长一段,好像都是循环,有用的就三句话:
/aaaa/1/V1.1.7/Debug # cat /dev/logmpp
s_AddExtChnVGSTa ...[/quote]

cat /proc/media-mem 查看MMZ 内存,看还有没有剩余,如果没有,看能不能调整内存分配吧!

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-26 10:34:02
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50399&ptid=15328]wahuqeir 发表于 2017-5-26 09:14[/url]
1. VB 分配不合理,你看下MMZ的内存是多大,给1080P再多加几个块
2. chn 4 是ext chn,最后一个错误显示 ...[/quote]

/aaaa/1/V1.1.7/Debug # cat /proc/media-mem
+---ZONE: PHYS(0x84000000, 0x9FFFFFFF), GFP=0, nBYTES=458752KB, NAME="anonymous"
   |-MMB: phys(0x84000000, 0x84003FFF), kvirt=0x  (null), flags=0x00000000, length=16KB,        name="sys_scale_coef"
   |-MMB: phys(0x84004000, 0x84007FFF), kvirt=0x  (null), flags=0x00000000, length=16KB,        name="sys_defliscale_"
   |-MMB: phys(0x84008000, 0x84017FFF), kvirt=0x  (null), flags=0x00000000, length=64KB,        name="TDE_MEMPOOL_MMB"
   |-MMB: phys(0x84055000, 0x8405CFFF), kvirt=0x  (null), flags=0x00000000, length=32KB,        name="ACM LUTS"
   |-MMB: phys(0x8405D000, 0x8405DFFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="ACM Coef"
   |-MMB: phys(0x8405E000, 0x841F2FFF), kvirt=0x  (null), flags=0x00000000, length=1620KB,      name="hifb_layer0"
   |-MMB: phys(0x841F3000, 0x841FFFFF), kvirt=0x  (null), flags=0x00000000, length=52KB,        name="higo_log"

---MMZ_USE_INFO:
total size=458752KB(448MB),used=1804KB(1MB + 780KB),remain=456948KB(446MB + 244KB),zone_number=1,block_number=7




以下是官方封装好的两个sample绑定和解绑函数。




绑定

/*****************************************************************************
* function : Vi chn bind vpss group
*****************************************************************************/
HI_S32 SAMPLE_COMM_VI_BindVpss(SAMPLE_VI_MODE_E enViMode)
{
    HI_S32 j, s32Ret;
    VPSS_GRP VpssGrp;
    MPP_CHN_S stSrcChn;
    MPP_CHN_S stDestChn;
    SAMPLE_VI_PARAM_S stViParam;
    VI_CHN ViChn;

    s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_VI_Mode2Param failed!\n");
        return HI_FAILURE;
    }

    VpssGrp = 0;
    for (j = 0; j < stViParam.s32ViChnCnt; j++)
    {
        ViChn = j * stViParam.s32ViChnInterval;

        stSrcChn.enModId  = HI_ID_VIU;
        stSrcChn.s32DevId = 0;
        stSrcChn.s32ChnId = ViChn;

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

        s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
        if (s32Ret != HI_SUCCESS)
        {
            SAMPLE_PRT("failed with %#x!\n", s32Ret);
            return HI_FAILURE;
        }

        VpssGrp ++;
    }
    return HI_SUCCESS;
}




/******************************************************************************
* function : venc bind vpss
******************************************************************************/
HI_S32 SAMPLE_COMM_VENC_BindVpss(VENC_CHN VeChn, VPSS_GRP VpssGrp, VPSS_CHN VpssChn)
{
    HI_S32 s32Ret = HI_SUCCESS;
    MPP_CHN_S stSrcChn;
    MPP_CHN_S stDestChn;

    stSrcChn.enModId = HI_ID_VPSS;
    stSrcChn.s32DevId = VpssGrp;
    stSrcChn.s32ChnId = VpssChn;

    stDestChn.enModId = HI_ID_VENC;
    stDestChn.s32DevId = 0;
    stDestChn.s32ChnId = VeChn;

    s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("failed with %#x!\n", s32Ret);
        return HI_FAILURE;
    }

    return s32Ret;
}







解绑

/******************************************************************************
* function : venc unbind vpss
******************************************************************************/
HI_S32 SAMPLE_COMM_VENC_UnBindVpss(VENC_CHN VeChn, VPSS_GRP VpssGrp, VPSS_CHN VpssChn)
{
    HI_S32 s32Ret = HI_SUCCESS;
    MPP_CHN_S stSrcChn;
    MPP_CHN_S stDestChn;

    stSrcChn.enModId = HI_ID_VPSS;
    stSrcChn.s32DevId = VpssGrp;
    stSrcChn.s32ChnId = VpssChn;

    stDestChn.enModId = HI_ID_VENC;
    stDestChn.s32DevId = 0;
    stDestChn.s32ChnId = VeChn;

    s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
    if (s32Ret != HI_SUCCESS)
    {
        SAMPLE_PRT("failed with %#x!\n", s32Ret);
        return HI_FAILURE;
    }

    return s32Ret;
}





/*****************************************************************************
* function : Vi chn unbind vpss group
*****************************************************************************/
HI_S32 SAMPLE_COMM_VI_UnBindVpss(SAMPLE_VI_MODE_E enViMode)
{
    HI_S32 i, j, s32Ret;
    VPSS_GRP VpssGrp;
    MPP_CHN_S stSrcChn;
    MPP_CHN_S stDestChn;
    SAMPLE_VI_PARAM_S stViParam;
    VI_DEV ViDev;
    VI_CHN ViChn;

    s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);
    if (HI_SUCCESS != s32Ret)
    {
        SAMPLE_PRT("SAMPLE_COMM_VI_Mode2Param failed!\n");
        return HI_FAILURE;
    }

    VpssGrp = 0;
    for (i = 0; i < stViParam.s32ViDevCnt; i++)
    {
        ViDev = i * stViParam.s32ViDevInterval;

        for (j = 0; j < stViParam.s32ViChnCnt; j++)
        {
            ViChn = j * stViParam.s32ViChnInterval;

            stSrcChn.enModId = HI_ID_VIU;
            stSrcChn.s32DevId = ViDev;
            stSrcChn.s32ChnId = ViChn;

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

            s32Ret = HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
            if (s32Ret != HI_SUCCESS)
            {
                SAMPLE_PRT("failed with %#x!\n", s32Ret);
                return HI_FAILURE;
            }

            VpssGrp ++;
        }
    }
    return HI_SUCCESS;
}



以上这两个解绑函数,在两个绑定通道都用了。
问题一:但是拓展ExtChn4绑定了Chn0,这个是不是也需要解除绑定?(是的话,那我就找到原因了。。哈哈哈)
对,还有问题,就是如果要解除这个绑定,它的优先级应该在END5(venc和vpss解绑,vi和vpss解绑)  和  END4(DisableChn)中间吧?解绑函数我自己封装一个就可以吧?
问题二:看以上的MMZ内存还有很大剩余啊,上面7个内存块好像没有是放VB的,“1080P多加几个块”怎么添加?(是不是按照上面的格式,把名字换成VB的,地址再加几段就行?)
我是新手,还请多多指教!

放学后不许跑

0个粉丝

2

问答

0

专栏

0

资料

放学后不许跑 2017-05-26 10:39:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50399&ptid=15328]wahuqeir 发表于 2017-5-26 09:14[/url]
1. VB 分配不合理,你看下MMZ的内存是多大,给1080P再多加几个块
2. chn 4 是ext chn,最后一个错误显示 ...[/quote]

我还想补充个问题,就是:
为什么在VI绑定VPSS  和解绑的过程中
        stDestChn.enModId  = HI_ID_VPSS;
        stDestChn.s32DevId = VpssGrp;
        stDestChn.s32ChnId = 0;
ChnId只等于0呢,那这样是不是除了0通道别的通道就没有VI了,还是说这里的0是指不限通道

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2017-05-26 11:19:46
认可0
本帖最后由 zhuangweiye 于 2017-5-26 11:25 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=50411&ptid=15328]放学后不许跑 发表于 2017-5-26 10:39[/url]
我还想补充个问题,就是:
为什么在VI绑定VPSS  和解绑的过程中
        stDestChn.enModId  = HI_ID_V ...[/quote]

vpss是一进多出的,当做为数据接收者时(Vi绑Vpss)只考虑进,即只有group的概念,没有channel的概念,所以stDestChn.s32ChnId = 0

当做为数据源的时候才是即有group(devId),也有channel(chnId)

关于增加VB的问题

一般初始化都有下面类似代码
    memset(&stVbConf,0,sizeof(VB_CONF_S));

    stVbConf.u32MaxPoolCnt = 64;

   u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(...,PIC_HD720,...);
     
    stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[0].u32BlkCnt = 16;

    memset(stVbConf.astCommPool[0].acMmzName,0,
        sizeof(stVbConf.astCommPool[0].acMmzName));

在后面加上
   u32BlkSize = SAMPLE_COMM_SYS_CalcPicVbBlkSize(...,PIC_HD1080,...);
     
    stVbConf.astCommPool[x].u32BlkSize = u32BlkSize;
    stVbConf.astCommPool[x].u32BlkCnt = 16;

    memset(stVbConf.astCommPool[x].acMmzName,0,
        sizeof(stVbConf.astCommPool[x].acMmzName));

x:假定自己初始化代码中stVbConf.astCommPool[]下标最大值为y,那么x = y+1,上面例子中y=0,所以x = 1

wahuqeir

0个粉丝

1

问答

0

专栏

1

资料

wahuqeir 2017-05-26 11:34:37
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=50411&ptid=15328]放学后不许跑 发表于 2017-5-26 10:39[/url]
我还想补充个问题,就是:
为什么在VI绑定VPSS  和解绑的过程中
        stDestChn.enModId  = HI_ID_V ...[/quote]

一.  从你的应用角度去理解这个问题:
绑定应该是 1. VI 绑定 VPSS(group0 chn0) 这个里的VPSS应该是Group的概念,但需要CHN0接收
              vpss-phychn0(group0) 绑定 venc0,  vpss-extchn4(group0) 绑定 venc1
解绑应该是:venc1 解绑 vpss-extchn4 , venc0 解绑 vpss-phychn0 ,VPSS(group0 chn0) 解绑VI

二, Vb创建
找一下 这个方法 HI_MPI_VB_SetConf(pstVbConf),参数就vb的创建,关联一下代码上下文,你就知道了


加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区