zihao_ling

zihao_ling

0个粉丝

6

问答

1

专栏

0

资料

zihao_ling  发布于  2018-12-26 21:22:40
采纳率 0%
6个问答
3613

海思提供的 vdec sample

 
海思提供的 vdec sample 正常跑起来应该是把264数据解析 输出到VO。我现在跑起来屏幕黑色一点反应。附修改后的代码。修改的地方都注释出来了,使用的264为 320*240 ,是sample 录制的,我感觉还是某些配置的问题。

{
    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 = 1, u32GrpCnt = 1;
    pthread_t   VdecThread[2*VDEC_MAX_CHN_NUM];
        ROTATE_E enRotate;

        VIDEO_FRAME_INFO_S pstVideoFrame;

    stSize.u32Width = HD_WIDTH;
    stSize.u32Height = HD_HEIGHT;


        stSize.u32Width = 360;// 1)自己改了大小。对应打开264的宽高
    stSize.u32Height = 240;
       
    /************************************************
    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;
    }

    /************************************************
    step2:  init mod common VB
    *************************************************/
    SAMPLE_COMM_VDEC_ModCommPoolConf(&stModVbConf, PT_H264, &stSize, u32VdCnt);       
    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);
        stRotateSize.u32Width = stRotateSize.u32Height = MAX2(stSize.u32Width, stSize.u32Height);
       
        stRotateSize.u32Width = 320;//改了这里
        stRotateSize.u32Height = 240;

        printf("stRotateSize.u32Width %d  stRotateSize.u32Height %d \n",stRotateSize.u32Width,stRotateSize.u32Height);
    SAMPLE_COMM_VDEC_VpssGrpAttr(u32GrpCnt, &stVpssGrpAttr[0], &stRotateSize);
    //s32Ret = SAMPLE_COMM_VPSS_Start(u32GrpCnt, &stRotateSize, 1, &stVpssGrpAttr[0]);
       
        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;
#endif

    stVoPubAttr.enIntfSync = VO_OUTPUT_NTSC;
    stVoPubAttr.enIntfType = VO_INTF_CVBS;
        VoDev = SAMPLE_VO_DEV_DSD0;
        VoLayer = SAMPLE_VO_LAYER_VSD0;//改了这里, 在测试vio用了这样的配置,这里也改了


    s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stVoPubAttr);
    if(s32Ret != HI_SUCCESS)
    {               
        SAMPLE_PRT("vdec bind vpss fail for %#x!\n", s32Ret);
        goto END4_1;
    }

#if 0 //关了 感觉不需要
#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
#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_1MUX_1);//这个函数有自己改过,只是增加了一些模式,应该不影响
    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]);

        s32Ret = HI_MPI_VPSS_GetChnFrame(0, 0, &pstVideoFrame, -1);//为了测试加的,这里获取不成功
        if(HI_SUCCESS!=s32Ret)
        {
                printf("HI_MPI_VPSS_GetChnFrame failed %08x\n",s32Ret);
        } else {
                printf("HI_MPI_VPSS_GetChnFrame ok\n");
        }

    /***  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;
}
我来回答
回答7个
时间排序
认可量排序

cc966358

0个粉丝

7

问答

0

专栏

7

资料

cc966358 2018-12-26 21:28:02
认可0
[code]#if HI_FPGA
    stVoPubAttr.enIntfSync = VO_OUTPUT_1080P30;
    stVoPubAttr.enIntfType = VO_INTF_VGA;
#else
    stVoPubAttr.enIntfSync = VO_OUTPUT_1080P60;
    stVoPubAttr.enIntfType = VO_INTF_VGA;
#endif

    stVoPubAttr.enIntfSync = VO_OUTPUT_NTSC;
    stVoPubAttr.enIntfType = VO_INTF_CVBS;
        VoDev = SAMPLE_VO_DEV_DSD0;
        VoLayer = SAMPLE_VO_LAYER_VSD0;//改了这里, 在测试vio用了这样的配置,这里也改了
[/code]

你改成标清的了。是从什么输出?VGA ,这个要看你的VGA支持不支持标清格式。2 默认1080的也要看显示器支持不支持

zihao_ling

0个粉丝

6

问答

1

专栏

0

资料

zihao_ling 2018-12-27 09:45:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=118290&ptid=56007]cc966358 发表于 2018-12-26 21:28[/url]
你改成标清的了。是从什么输出?VGA ,这个要看你的VGA支持不支持标清格式。2 默认1080的也要看显示器支 ...[/quote]

车载摄像头图像,输出到显示屏的AV接口。应该支持的,跑vdec 之前跑过 vio,当时vo设备 也是这样设置的,应该是可以。(有些概念我可能分不清,感谢能够指正出来)

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-12-28 09:17:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=118375&ptid=56007]zihao_ling 发表于 2018-12-27 09:45[/url]
车载摄像头图像,输出到显示屏的AV接口。应该支持的,跑vdec 之前跑过 vio,当时vo设备 也是这样设置的, ...[/quote]

流程是 vdec 绑 vpss 绑 vo

要注意的是vpss 绑定 SD/HD 是不一样的, 简单来说vpss绑定HD使用auto模式, 绑定SD要使用user模式

zihao_ling

0个粉丝

6

问答

1

专栏

0

资料

zihao_ling 2018-12-28 18:03:18
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=118375&ptid=56007]zihao_ling 发表于 2018-12-27 09:45[/url]
车载摄像头图像,输出到显示屏的AV接口。应该支持的,跑vdec 之前跑过 vio,当时vo设备 也是这样设置的, ...[/quote]

已出图像,找到一些问题。
修改:1、step4 start vpss 宽和高设置错误。是360x240,手误写成320。我觉得这个应该是要对应输入H264的宽高。我也在成功显示后改回320,发现这个参数确实有影响。
2、SAMPLE_COMM_VPSS_Start 里,设置每个group 的每个通道时,每次都是设置的通道3,但是下面与vo绑定却是通道0。(这一部分之前没有注意到,后来是4楼提了下vpss模式  我才注意到)

vpss_start  的设置 :s32Ret = HI_MPI_VPSS_SetChnMode(VpssGrp, VPSS_CHN3, &stVpssMode);
解码 vpss bind vo 的设置: s32Ret = SAMPLE_COMM_VO_BindVpss(VoLayer, i, i, VPSS_CHN0);
可以明显的看到通道不一样

疑问:1、第二点 我将绑定改为通道3 好像也不行,只能将初始化改为通道0才可以。或许在sdk文档里有说明,还不清楚为什么。而且编解码绑定的都是vpss的通道0。 我想了想,还有一点,之前测试时,在编码的时候初始化vpss 我没有初始化通道0,因为我还是上面的配置,就是每次都是设置的通道3,但是还是可以编码成功,越想越不对劲啊,有没有人能解惑一下(这里我把编码合到vio sample 里,运行的vio,然后我仔细独读了下venc的代码,后面有set ch0 ,但是我的 vio sample 却没有 好像也录制成功了)

对了,是不是只要初始化设备通道就会有一个默认的设置,所以并不影响  -。-
但是为什么解码一定要选择通道0....

2、为什么在初始化vpss 通道时没有把每个对应的通道都初始化设置,sample里只是设置了通道3,(没改过)是不是 不需要就不初始化其他的

zihao_ling

0个粉丝

6

问答

1

专栏

0

资料

zihao_ling 2018-12-28 18:07:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=118610&ptid=56007]zhuangweiye 发表于 2018-12-28 09:17[/url]
流程是 vdec 绑 vpss 绑 vo

要注意的是vpss 绑定 SD/HD 是不一样的, 简单来说vpss绑定HD使用auto模式, ...[/quote]

你好,图像出来了,找到了几个问题点。然后很不好意思的附上另一个问题的链接,感谢![url]http://bbs.ebaina.com/forum.php?mod=viewthread&tid=56049&extra=[/url]

zihao_ling

0个粉丝

6

问答

1

专栏

0

资料

zihao_ling 2019-01-08 15:48:11
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=118714&ptid=56007]zihao_ling 发表于 2018-12-28 18:03[/url]
已出图像,找到一些问题。
修改:1、step4 start vpss 宽和高设置错误。是360x240,手误写成320。我觉得 ...[/quote]

1、没有限制,4个物理通道都可以,是代码的问题,我设置 通道数为1,默认从通道0开始使能,所以虽然我设置成其他通道,使能的却是通道0,所以只有当我 正好设置的是通道0 时 整个过程才是ok的。

qn1528784679

0个粉丝

1

问答

0

专栏

0

资料

qn1528784679 2019-02-19 16:07:28
认可0
顶起来,别沉了
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区