hiNewer

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer  发布于  2016-10-24 21:42:48
采纳率 0%
38个问答
5124

Hi3531A中PIP层绑定到HD0设备实现多通道叠加得问题

 
       我想在视频层上实现多通道VoChn的叠加,但是手头的显示器是高清设备1080P的,但是Hi3531A的高清设备DH0的视频层VDH0或者VDH1不支持多通道叠加,看了文档说PIP层绑定到DH0设备可以实现,但是手头这方面资料比较少,有哪位用过的大牛给指导一下,附图是文档的介绍
我来回答
回答16个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-25 08:15:07
认可0

PIP很简单, 就是一个volayer(基本上和VDH0/VDH1一样处理), 会显示在VDH0或者VDH1上面的视频层(默认绑定在VDH0上)

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-25 14:59:31
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40090&ptid=13118]zhuangweiye 发表于 2016-10-25 08:15[/url]
PIP很简单, 就是一个volayer(基本上和VDH0/VDH1一样处理), 会显示在VDH0或者VDH1上面的视频层(默认绑定 ...[/quote]

嗯嗯,我想问下,VpassGrap最多可以256个,而Hi3531A的硬件VI接口是固定为8个,相应的ViChn也为8个,VpassGrap的创建数目远多于ViCHn,也就是一个ViChn可以绑定多个VpassGrap,那么一个ViChn可以绑定的VpassGrap数目有没有限制。。。。?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-25 15:07:09
认可0
本帖最后由 zhuangweiye 于 2016-10-25 15:08 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=40142&ptid=13118]hiNewer 发表于 2016-10-25 14:59[/url]
嗯嗯,我想问下,VpassGrap最多可以256个,而Hi3531A的硬件VI接口是固定为8个,相应的ViChn也为8个,Vpas ...[/quote]

31A VI 设备(videv)是9个(dev8是级联用的, bt1120接口), 每个videv(dev0-7)最多可以有4个vichan, 加上级联的1个, 一共最多可以有33个vichan
vpss的数量也不只256个

至于绑定后续vpss的数量, 没有限制

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-25 15:26:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40145&ptid=13118]zhuangweiye 发表于 2016-10-25 15:07[/url]
31A VI 设备(videv)是9个(dev8是级联用的, bt1120接口), 每个videv(dev0-7)最多可以有4个vichan, 加上 ...[/quote]

您说的是对的,海思给的例程还是要好好看,要好好改

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-25 16:19:18
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40145&ptid=13118]zhuangweiye 发表于 2016-10-25 15:07[/url]
31A VI 设备(videv)是9个(dev8是级联用的, bt1120接口), 每个videv(dev0-7)最多可以有4个vichan, 加上 ...[/quote]

我想把ViChn通道数增加到16个,就把之前的 SAMPLE_VI_MODE_8_1080P改为 SAMPLE_VI_MODE_16_1080P,但是在板子上运行时报错:[SAMPLE_COMM_VI_Start]-520: call HI_MPI_VI_BindChn failed with 0xa0108003   意思是说:视频输入参数设置无效。在SAMPLE_VI_MODE_8_1080P是默认8个VI接口绑到8个ViCHn没问题,现在增加一倍有问题。。。下面是相关代码,

          SAMPLE_VI_MODE_E enViMode = SAMPLE_VI_MODE_16_1080P;
         VIDEO_NORM_E enNorm = VIDEO_ENCODING_MODE_AUTO;
        s32Ret = SAMPLE_COMM_VI_Start(enViMode, enNorm);  
        if (HI_SUCCESS != s32Ret)
        {
                printf("%s: Start Vi failed!\n", __FUNCTION__);
                SAMPLE_COMM_SYS_Exit();
                return -1;
        }
  
HI_S32 SAMPLE_COMM_VI_Start(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm)
{
    VI_DEV ViDev;
    VI_CHN ViChn;
    HI_S32 i;
    HI_S32 s32Ret;
    SAMPLE_VI_PARAM_S stViParam;
    SIZE_S stTargetSize;
    RECT_S stCapRect;
    VI_CHN_BIND_ATTR_S stChnBindAttr;
   
    /*** get parameter from Sample_Vi_Mode ***/
    s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);
    if (HI_SUCCESS !=s32Ret)
    {
        SAMPLE_PRT("vi get param failed!\n");
        return HI_FAILURE;
    }
    s32Ret = SAMPLE_COMM_VI_Mode2Size(enViMode, enNorm, &stCapRect, &stTargetSize);
    if (HI_SUCCESS !=s32Ret)
    {
        SAMPLE_PRT("vi get size failed!\n");
        return HI_FAILURE;
    }
   
    /*** Start VI Dev ***/
    for(i=0; i     {
        ViDev = i * stViParam.s32ViDevInterval;
        s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode);
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("SAMPLE_COMM_VI_StartDev failed with %#x\n", s32Ret);
            return HI_FAILURE;
        }
    }
   
    /*** Start VI Chn ***/
    for(i=0; i     {
        ViChn = i * stViParam.s32ViChnInterval;

        if (SAMPLE_VI_MODE_16_1080P == enViMode
         || SAMPLE_VI_MODE_16_720P == enViMode)
        {
            /* When in the 16x1080p mode, bind chn 2,6,10,14 to way1 is needed */
            if (ViChn%4 != 0)
            {
                s32Ret = HI_MPI_VI_GetChnBind(ViChn, &stChnBindAttr);
                if (HI_ERR_VI_FAILED_NOTBIND == s32Ret)
                {
                    stChnBindAttr.ViDev = ViChn/4;
                    stChnBindAttr.ViWay = 1;
                    s32Ret = HI_MPI_VI_BindChn(ViChn, &stChnBindAttr);
                    if (HI_SUCCESS != s32Ret)
                    {
                       SAMPLE_PRT("call HI_MPI_VI_BindChn failed with %#x\n", s32Ret);
                        return HI_FAILURE;
                    }
                }
            }
        }

        s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, enViMode, VI_CHN_SET_NORMAL);
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("call SAMPLE_COMM_VI_StarChn failed with %#x\n", s32Ret);
            return HI_FAILURE;
        }
    }

    return HI_SUCCESS;
}

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-25 16:52:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40157&ptid=13118]hiNewer 发表于 2016-10-25 16:19[/url]
我想把ViChn通道数增加到16个,就把之前的 SAMPLE_VI_MODE_8_1080P改为 SAMPLE_VI_MODE_16_1080P,但是在 ...[/quote]

既然 报参数错误, 那么就加打印, 把参数打出来看看喽

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-25 20:50:00
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40161&ptid=13118]zhuangweiye 发表于 2016-10-25 16:52[/url]
既然 报参数错误, 那么就加打印, 把参数打出来看看喽[/quote]

搞了一下午,也还是报错:视频输入参数设置无效。按照文档中的该解绑定的先解绑定了,ViChn也禁用了,还是提示视频输入参数设置无效,默认的8个Vi接口绑定0,4,8,12,16,20,24,28。2通道绑定就出错。。
HI_S32 SAMPLE_COMM_VI_Start(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm)

{

    VI_DEV ViDev;

    VI_CHN ViChn;

    HI_S32 i;

    HI_S32 s32Ret;

    SAMPLE_VI_PARAM_S stViParam;

    SIZE_S stTargetSize;

    RECT_S stCapRect;

    VI_CHN_BIND_ATTR_S stChnBindAttr;

   

    /*** get parameter from Sample_Vi_Mode ***/

    s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);

    if (HI_SUCCESS !=s32Ret)

    {

        SAMPLE_PRT("vi get param failed!\n");

        return HI_FAILURE;

    }

    printf("(s32ViChnCnt,s32ViChnInterval)=(%d,%d)\n",stViParam.s32ViChnCnt,stViParam.s32ViChnInterval); //(s32ViChnCnt,s32ViChnInterval)=(16,2)

    s32Ret = SAMPLE_COMM_VI_Mode2Size(enViMode, enNorm, &stCapRect, &stTargetSize);

    if (HI_SUCCESS !=s32Ret)

    {

        SAMPLE_PRT("vi get size failed!\n");

        return HI_FAILURE;

    }

   

    /*** Start VI Dev ***/

    for(i=0; i
    {

        ViDev = i * stViParam.s32ViDevInterval;

        s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode);

        if (HI_SUCCESS != s32Ret)

        {

            SAMPLE_PRT("SAMPLE_COMM_VI_StartDev failed with %#x\n", s32Ret);

            return HI_FAILURE;

        }

    }
    //-----------------------add---------------------  //禁用ViChn
    for(i = 0;i < 16;i++){
    ViChn = i*stViParam.s32ViChnInterval;
    s32Ret = HI_MPI_VI_DisableChn(ViChn);
             if (HI_SUCCESS != s32Ret)

            {

                SAMPLE_PRT("call HI_MPI_VI_DisableChn failed with %#x\n", s32Ret);

                return HI_FAILURE;

            }
    }
    //---------------------------------------------------

    /*** Start VI Chn ***/

    for(i=0; i
    {

        ViChn = i * stViParam.s32ViChnInterval;

        if (SAMPLE_VI_MODE_16_1080P == enViMode

         || SAMPLE_VI_MODE_16_720P == enViMode)

        {

            /* When in the 16x1080p mode, bind chn 2,6,10,14 to way1 is needed */

            if (ViChn%4 != 0)

            {                   

                s32Ret = HI_MPI_VI_GetChnBind(ViChn, &stChnBindAttr);

                if (HI_ERR_VI_FAILED_NOTBIND == s32Ret)

                {

                   printf("ViChn = %d\n",ViChn);  //ViChn = 2

                    stChnBindAttr.ViDev = ViChn/4;

                    stChnBindAttr.ViWay = 1;
                    s32Ret = HI_MPI_VI_UnBindChn(ViChn);  //解绑定ViChn
                    if (HI_SUCCESS != s32Ret)

                    {

                        SAMPLE_PRT("call HI_MPI_VI_UnBindChn failed with %#x\n", s32Ret);

                        return HI_FAILURE;

                    }

                    s32Ret = HI_MPI_VI_BindChn(ViChn, &stChnBindAttr);

                    if (HI_SUCCESS != s32Ret)

                    {

               SAMPLE_PRT("call HI_MPI_VI_BindChn failed with %#x\n", s32Ret);   //一直都是这里出错 [SAMPLE_COMM_VI_Start]-537: call HI_MPI_VI_BindChn failed with 0xa0108003  视频输入参数设置无效

                        return HI_FAILURE;

                    }

                }

            }

        }



        s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, enViMode, VI_CHN_SET_NORMAL);

        if (HI_SUCCESS != s32Ret)

        {

            SAMPLE_PRT("call SAMPLE_COMM_VI_StarChn failed with %#x\n", s32Ret);

            return HI_FAILURE;

        }

    }



    return HI_SUCCESS;

}

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-25 20:51:21
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40174&ptid=13118]hiNewer 发表于 2016-10-25 20:50[/url]
搞了一下午,也还是报错:视频输入参数设置无效。按照文档中的该解绑定的先解绑定了,ViChn也禁用了,还 ...[/quote]

就是由SAMPLE_VI_MODE_8_1080P换为SAMPLE_VI_MODE_16_1080P模式对应16个ViChn。。。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-26 08:49:49
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40175&ptid=13118]hiNewer 发表于 2016-10-25 20:51[/url]
就是由SAMPLE_VI_MODE_8_1080P换为SAMPLE_VI_MODE_16_1080P模式对应16个ViChn。。。[/quote]

如果楼主用的是 sample代码. 那么SAMPLE_VI_MODE_16_1080P对应的DEV attr是

HI_S32 SAMPLE_COMM_VI_StartDev(VI_DEV ViDev, SAMPLE_VI_MODE_E enViMode)
{
...
        case SAMPLE_VI_MODE_16_1080P:
            memcpy(&stViDevAttr,&DEV_ATTR_7441_BT1120_STANDARD_BASE,sizeof(stViDevAttr));
            SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
            break;   

}

表示用的bt1120, 这个是一路复用的, 也就是说一个videv只有一个vichannel

这时候再去绑定应该是不对的, sample中的代码也不一定会对, 尤其是那些并没有用到的部分

如果楼主要试验16路1080P, 可以用SAMPLE_VI_MODE_16_720P的 dev attr来设置VIDEV,
不过要想出图像, 就要前端的A/D支持一个BT656输出2路复用的1080P 297M的单沿或者148.5M的双沿

修改如下:
        case SAMPLE_VI_MODE_16_720P:      
        case SAMPLE_VI_MODE_16_1080P: // 增加
           memcpy(&stViDevAttr,&DEV_ATTR_TP2823_720P_2MUX_BASE,sizeof(stViDevAttr));
            SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
            break;
#if 0 // 增加
        case SAMPLE_VI_MODE_16_1080P:
            memcpy(&stViDevAttr,&DEV_ATTR_7441_BT1120_STANDARD_BASE,sizeof(stViDevAttr));
            SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
            break;   
#endif // 增加

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-26 14:04:49
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40190&ptid=13118]zhuangweiye 发表于 2016-10-26 08:49[/url]
如果楼主用的是 sample代码. 那么SAMPLE_VI_MODE_16_1080P对应的DEV attr是

HI_S32 SAMPLE_COMM_VI_St ...[/quote]

根据您的设定,绑定是没有问题了,现在是vichan从0号到30号依次每两个分别绑定的videv从0到7号,又creatVpssGrap了16个VpssGrap依次绑定到0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30号vichan上,现有三路摄像头采集视频依次接入Videv的4,5,6号,然后将vochan0绑定到VpssGrap的9,11,13号上输出图像到屏幕,但是图像只有vpssgrap能正常输出,而且还闪烁

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-26 14:13:21
认可0
本帖最后由 hiNewer 于 2016-10-26 14:16 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=40241&ptid=13118]hiNewer 发表于 2016-10-26 14:04[/url]
根据您的设定,绑定是没有问题了,现在是vichan从0号到30号依次每两个分别绑定的videv从0到7号,又creatV ...[/quote]

你说的前端是指显示器还是板子?刚才试了vpssgrap的8,10,12绑定到vochn0,也是只有vpssGrap=8有图像输出,图像也是像打了马赛克。。。。我SAMPLE_COMM_VPSS_Start_User是用户模式,vpss输入的是1920*1080,vpss的vpsschn = 3输出到后面的模块图像是720*576大小,其他三个vpsschn是自动

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-26 14:30:36
认可0
本帖最后由 zhuangweiye 于 2016-10-26 14:32 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=40242&ptid=13118]hiNewer 发表于 2016-10-26 14:13[/url]
你说的前端是指显示器还是板子?刚才试了vpssgrap的8,10,12绑定到vochn0,也是只有vpssGrap=8有图像输 ...[/quote]

A/D 是把摄像头的数据转换成 Bt656 或者 Bt1120 的芯片, 位于camera和Vi之间, 需要驱动, 需要设置

如果A/D设置的不正确, VI设置和A/D不匹配, 是不会有正常的图进来
楼主的情况可能就要看全部信息才能知道是什么情况了

不过从楼主的描述重点来看, 并没有关注过A/D的问题, 基本上问题更可能出在 A/D的设置, 以及和Vi匹配上面

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-26 14:41:59
认可0
本帖最后由 hiNewer 于 2016-10-26 14:49 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=40245&ptid=13118]zhuangweiye 发表于 2016-10-26 14:30[/url]
A/D 是把摄像头的数据转换成 Bt656 或者 Bt1120 的芯片, 位于camera和Vi之间, 需要驱动, 需要设置

...[/quote]

刚看过文档VI_WORK_MODE_E,vi模式的2路和4路复用只能用BT656协议,那怎样设置板子的A/D与Vi的匹配呢,硬件的东西不太会弄

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-26 14:57:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40249&ptid=13118]hiNewer 发表于 2016-10-26 14:41[/url]
刚看过文档VI_WORK_MODE_E,vi模式的2路和4路复用只能用BT656协议,那怎样设置板子的A/D与Vi的匹配呢, ...[/quote]


总要知道是什么A/D芯片吧, 既然原来能有8路图, 那么A/D肯定工作起来了, 驱动肯定也加载了

这些不可能全都不清楚就开发吧

正常情况下只要打开A/D的设备, 调用对应的ioctl就能设置, 不过具体代码还要看驱动是如何实现的, 当然驱动有文档的话, 按文档来写就是了

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-10-26 15:24:07
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40251&ptid=13118]zhuangweiye 发表于 2016-10-26 14:57[/url]
总要知道是什么A/D芯片吧, 既然原来能有8路图, 那么A/D肯定工作起来了, 驱动肯定也加载了

这些不可 ...[/quote]

好的,非常感谢了。。。对着文档改。。。

zfqddd

0个粉丝

0

问答

0

专栏

0

资料

zfqddd 2016-11-26 12:17:09
认可0
进来看下了
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区