前段时间找了块HI3520DV200的开发板玩了一下,用的是GV7601的前端,SDI输入。
搭配GV7601的AD采集1080P的视频,SDI输入,跑sample_venc程序,一直输出超时,查看VI调试信息发现有中断,但是所有接收到的数据全部丢掉。零零总总卡了三四天才解决,现在把中途遇到的问题及解决办法整理成笔记,以备后查。希望路过的朋友及时指正,谢谢!
运行起sample_venc程序后,串口终端一直打印输出以下错误提示:
[Video_Get_VencStream_Proc]-1372: get vencstream time out, exit thread
查看VI 调试信息如下图:
开始以为是没有驱动起GV7601芯片,也没时间去仔细读GV7601的芯片手册,后来跟大神确认,才知道GV7601不需要单独的驱动,只要加载海思SDK中的ssp.ko,即可以采集GV7601的数据。
通过调试信息来看,已经能采集数据了,只是每一帧都是错误的,这有可能是:VI口使用或者掩码配置不对,或者采集时钟不对。于是开始一步步确认板端的初始化及设置流程。
加载海思驱动时,设置复用寄存器VICAP时要选择1X1080P,没问题的。
接着查BT1120S的时序。
enViMode设置为SAMPLE_VI_MODE_1_1080P。
不需要额外的GV7601芯片驱动,所以SAMPLE_COMM_VI_ADStart()接口直接返回即可。
SAMPLE_COMM_VI_StartDev()接口中使用海思已经默认填充好的结构体VI_DEV_ATTR_SDEV_ATTR_7441_BT1120_1080P来设置VIDEV的属性,跟硬件确认前端的接口线序后,掩码配置按照海思《媒体处理软件开发参考》文档中设置:
设置也是OK的。
然后走了一遍sample_venc代码流程,想起来之前在做HI3518E的时候,编码多路视频流时,设备跑了一段时间后也会出现这种视频超时的问题,当时是重新分配系统mem和MMZ媒体内存后解决的,于是重新分配内存,50M(mem) +78M(MMZ) = 128M,发现依旧提示视频超时,中断到来后也全部丢失。
想到内存分配,随即联想到视频缓存池的空间是否够用,一查发现海思默认给的缓存池
尝试把6改为10:
果然视频正常。原来是1080P的视频数据大小超出了海思默认的视频缓存池大小。。。。。。。。
我也是第一次做HI3520D开发,过程中遇到几个问题点一开始困扰了我,后面慢慢解决了,现在简单的总结如下:
1、如果前端摄像头工作在4*720模式,则模数转换芯片AD的工作模式也要设置为4*720P的模式,HI3520D的VI那里也必须按4*720P来采集输入;
2、《Hi3520DV200H.264编解码处理器简介.pdf》中说“每个8bit接口支持144MHzBT.656 2路字节间插模式,共支持4x720P30实时视频输入”,但是我现在使用的SDK为V100版本的,不会影响它的编码性能;
3、文档中提到“144MHzBT.656 2路字节间插模式,共支持4x720P30实时视频输入”,对应的驱动,如NVP6114中已经默认设置了输入接口的工作时钟为144MHz。
4、“2路字节间插模式”就是指Dev0和Dev1分别工作在【2路720p(INTERLEAVED)】的场景;
5、应用程序运行起来后,如果提示select超时,先查看/proc/umap/vi有没有中断产生,如果没有中断,要先确认BT1120时序或者BT656时序是否设置对了,同时确认掩码值跟硬件设计时的接线顺序是否一致,例如:Camera输入模式时,有的硬件工程师在sensor接口硬件设计电路时采用高10位,有的采用低10位,如果掩码不按照实际硬件电路来设置则采集不到视频;
6、缓存池大小应该根据实际视频编码的分辨率和码流大小来作相应调整,系统内存和媒体内存也需要做相应调整,否则多客户端同时打开视频预览时很容易导致CPU飚高或者内存不足而宕机的情况。
7、受网络带宽限制的情况下,P2P传输时,设备端最好采用CBR的码率控制模式,根据实际情况灵活调整帧率和码流大小来保证传输的稳定性。因为VBR虽然可以提高视频预览的效果,但是实际使用过程中发现,在画面动态的情况下,编码码流很容易飚高而且码流波动范围很大,在缓存池有限的情况下很容易出现编码数据超出缓存池空间大小。