MCIM-USB3

MCIM-USB3(Multi-Camera Input Module with Usb3.0 Output)实现了多路高清数字摄像头输入,同步,打包和USB3.0 接口输出的功能。带有USB3.0接口的设备,通过MCIM-USB3即可实现4路720P摄像头的实时Capture和Preview。

MCIM-USB3针对的是需要实时视频采集处理并且对视频延时敏感的场合,因此MCIM-USB3并不对视频进行压缩编码,而是直接将原始数据以最小的延时扔给Host设备。

MCIM-USB3使用了TI DS90UB914作为摄像头接收端,只能连接使用TI DS90UB913作为发送端的LVDS接口摄像头。如果要使用其他传输接口的摄像头,需要定制对应接口芯片的接口板。

细节说明

帧同步

MCIM-USB3硬件上实现了多路摄像头图像的同步功能,在实现方法上使用了FIFO的机制,以便保证灵活的Host端设备适配。这里的图像同步功能并非通过Sync信号实现不同摄像头之间的真正同步,而是指在图像缓存中,通过FIFO对图像进行时序对齐,传输给Host端的图像已经是数据头部对齐的,Host端无需通过软件对摄像头进行图像头对齐。通过FIFO方法实现图像头对齐的缺陷是显而易见的,虽然在应用层取得的图像是同步的,但是实际上,这些摄像头之间的图像一定存在或多或少(一般是+-20ms之间)的时间差,对于需要摄像头严格时间同步的应用来说,是不可用的,但是对于时序要求不严格的应用,就不存在大问题。毕竟,能够摄像头之间硬件帧同步的方案在成本上要高很多。需要Sensor支持 Sync信号同时传输方案支持 反向传输下发Sync信号,市面上可能找到的方案,不管是T家的还是M家的,成本都不低。

丢帧

MCIM-USB3使用了USB3.0作为与Host端通信的接口,不同于DVP(并行数字视频端口)或者MIPI这样的标准摄像头接口输出固定的信号时序,USB是无法保障稳定带宽的。多个设备之间的占用竞争会导致带宽变化,如果同一个USB接口上连接了其他高速设备,也有可能出现MCIM-USB3可以占用的带宽波动。而视频又是需要保证带宽的,因此MCIM-USB3根据USB带宽不稳定的特点,设计了丢帧机制,也就是说,如果Host端读取摄像头视频的速度赶不上视频的帧率,造成数据堆积,MCIM-USB3会丢弃无法读取的图像帧,从而实现自动的帧率调节。

速率

USB3.0的最高传输速率应该可以达到接近500MB。 Cypress 的CYUSB3014芯片 FIFO接口的最大速率是400MB。理论上来说,通过CYUSB3014芯片的USB3.0可以实时传输7路 720P@25fps的摄像头图像,但是因为Host端USB3.0硬件带宽瓶颈,Host端驱动软件效率等问题,实际上可以达到的速度远远低于这个理论速度。通常情况下,根据Host端硬件的同步,传输2~4路 720P@25fps 的实时视频数据 是完全没问题的。

测试

在MCIM-USB3开发之前,我们对不同的硬件平台进行了USB3.0的速率测试,以便评估在不同的方案上,是否可以通过USB3.0实时传输多路高清视频,测试过的软硬件和结果如下。所有的测试都是Host 端 Bulk in。测试的是数据上传的速率。

2015-03-01

测试方法,win7下使用的是cypress自带的带宽测试程序,ubuntu使用的是测试demo,自己修改了源码,测量204800个包,每个包16KB,然后记录时间。

T430 win7 »»» 440MB/s
T430 ubuntu »»» 240MB/s (16KB x 200K次 = 13s)
TK1 ubuntu »»» 80MB/s (16KB x 200K次 = 40s)
XU3 Lubuntu »»» 107MB/s (16KB x 200K次 = 30s)

2015-07-01

最初以为libusb库的包大小最大是16KB,后来进一步测试,发现包的大小可以改大,改大之后,速度明显有了提升。

T430 ubuntu »»» 305MB/s ( 1MB x 10K次 = 33s)

2016-10-18

QT + libusb-win32-1.2.6.0 (16KB x 100K次 = 12.6s)= 126MB/s
VS2013 + libusb-win32-1.2.6.0 (16KB x 100K次 = 12.6s) 约= 126MB/s
cypress streamer 310MB/s

2016-12

TK1 ubuntu »» 125MB/s (1MB包 Bulkin )
XU3 ubuntu »» 175MB/s (1MB包 Bulkin)

2017-03

手头正好有两个intel Atom 芯片的二合一平板(台电X16),于是也进行了测试。

RK3399 ubuntu »» usb3.0 bulk transfer 报错,后续没有再跟进测试,可以识别设备,可以枚举设备,但是程序执行到提交 bulk_transfer就会宕掉。
Intel Z8350 , Z8750 win7 »» USB3.0使用Libub-win均不能正常工作,可以识别设备,可以枚举设备,但是一开始 bulk tranfser,设备就会出错丢失,重新连接。

测试结果发现libusb-win32速度比较慢,在win7上,直接用streamer测试,一个速度达到320MB/s的slavefifo控件,用libusb-win32 只能跑到126MB/s左右,感觉应该是libusb-win32底层接口的机制限制了性能。

关于在不同的平台上测试USB3.0 速率的过程,请参考 标签USB30 下的其他文章。

多路图像采集效果(双路)