主题中讨论的其他器件: AM5718
描述:
我们正在尝试从配置为1080p@30fps YUYV 4:2:2的 USB3.0原始摄像头捕获和显示视频。
最初、视频数据似乎正在下降(图像的第一季度表现良好、然后视频与图像块偏移)、只是简单的 v4l2src 至文件链接或视频链接。 在3个内核模式后、视频图像质量得到改善、但以30fps 时视频显示不流畅。
AM5728的硬件规格似乎表明可以1080p 30fps 的捕捉和显示、以及 H.264编码和流式传输。 我们非常感谢您提供进一步的见解(内核配置设置、电路板配置等)、以实现全面的性能。
硬件配置:
处理器板:CL-SOM-AM57x - TI AM5728/AM5718模块上系统
www.compulab.com/.../
摄像机:Sony FCB-MA130、Vreo usb3.0接口板
www.intertest.com/.../18926-ishot-xblock-full-hd-mini-fcb-ma130-usb-30-camera-horizontal-configuration
软件配置:
来自 PROCESSOR-SDK-LINUX-03.03.00的 Compulab 板内核使用在 Ubuntu 16.04.2上交叉编译
$ arm-linux-gnueabi-gcc --version
arm-linux-gnueabi-gcc (Uubuntu/Linaro 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
$导出 arch=arm cross_compile=arm-linux-gnueabihf-
$ make cl-som-am57x_defconfig
$ make menuconfig
$制造
$ uname -a
Linux cl-som-am57x-SID 4.4.4.1.41-cl-som-am57x-ti-5-18-17269745-g0baf060cd12-脏#8 SMP 抢占星期五6月9日16:13:09 CDT 2017 armv7l GNU/Linux
GStreamer
$GST-LAUNCH-1.0 -版本
GST-LAUNCH-1.0版本1.10.0
GStreamer 1.10.0
packages.qa.debian.org/gstreamer1.0
注:已应用三个内核修改。
1) 1)这个是 TI 在 Lucas Kinon 和 TI 之间进行故障排除后提供的补丁、为什么720p 无法与 VPE 配合使用。 详情如下:
e2e.ti.com/.../523614
请注意、此补丁尚未显示在 TI 的内核版本中、因此我们手动应用它。
2) 2)增加了内核 USB DMA 缓冲区大小。
$ make menuconfig
linux menuconfig->device drivers > generic driver options > dma connigoud memory allocator,size in mega bytes --从24MB 更改为64MB
CONFIG_CMA_SIZE│μ V
││μ A
μ│定义连续 μ│的默认存储器区域大小(以 MIB 为单位)
│内存分配器。 如果选择了0的大小,则 CMA 将被│禁用
│默认值、但可以通过将 CMA=SIZE [MG]传递到内核来启用它。 │μ A
││μ A
││μ A
│符号:CMA_SIZE_MBytes [=24]│
│类型:整数│
│提示:大小(以兆字节为单位)│
│位置:│
│-> Device Drivers│
│->通用驱动程序选项│
│-> DMA 连续存储器分配器(DMA_CMA [=y])│
│在 drivers/base/Kconfig:267│中定义
│取决于:DMA_CMA [=y]&&!CMA_SIZE _SEL_Percentage [=n]
内核 DMA 缓冲区大小实验:24 (默认值)、64、128、512、1024 MB、 结果发现、在64 MB 时、从 USB 3.0摄像头/V4l2捕获的视频图像中、大约40%看起来不错、但图像其余部分的数据伪影仍然会丢失。 这是一个显著的改进、仅比良好图像的15%到20%有所改进。 超过64MB 的数字增长没有进一步改善。
因此、当前设置为64MB
3) 3) USB UVC DMA 缓冲区大小增加:
其他故障排除会导致在中记录2个#defines
/drivers/media/usb/uvc/uvcvideo.h
/*等时 Urbs 的数目。 *
#define UVC_Urbs 5.
/*每个 URB 的最大包数。 *
#define UVC_MAX_packets 32.
这似乎会调整 USB UVC 驱动程序代码中的 DMA 缓冲区大小、该驱动程序代码负责使用 DMA 通道移动流视频类 USB 数据。
不同的增加值与增加的内核 DMA 缓冲区大小一起尝试、直到以下值产生未损坏的视频流、100%的图像、但低于30fps (视频捕捉和显示到本地显示)。
/*等时 Urbs 的数目。 *
#define UVC_Urbs 40 //was 5
/*每个 URB 的最大包数。 *
#define UVC_MAX_packets 256 //was 32
--此 USB 摄像头似乎正在使用等时模式
测试设置:
-以 root 身份运行
-简单的捕获和显示
v4l2src IO-mode=4 --> USB DMA 模式
-运行"nice -n -20"以最高用户模式优先级运行(尚未尝试 RT 优先级)
GST 流水线、使用 USB UVC 通过 USB 3.0接口捕获视频、传输到 v4l2内核模块、720p gstreamer v4l2视频源元素、并发送到显示屏。 此 GST 服务热线运行顺畅。
$ nice -n -20 gst-launche-1.0 -e v4l2src device=/dev/video1 DO 时间戳=true IO-mo
DE=4! 视频/x-raw、格式=YUY2、宽度=1280、高度=720、帧速率=30/1! 视频连接
右! 最大扭结
(autosink、xvigesink、omapdmaibfsink、kmsink 在强制实验板上直接运行(连接到自己的显示屏)时不起作用。只有 ximagesink 似乎起作用,如果通过 ssh 远程运行,则需要使用 xvimagesink)
-此管道具有相同的捕捉-显示流程、这次为1080p。 仅使用内核补丁、只显示每个视频帧的一部分、图像的其余部分是图像的块化部分(如果使用 mplayer 或 VLC 来捕获/显示视频、则报告已丢弃的缓冲区)。 应用其他内核模式后、将显示完整的视频帧(有时会显示损坏的帧)、但帧速率较慢(不是配置的30fps)。
-此管线在 Uubuntu/x86或 i5上运行,带有 Sony 摄像头,可产生流畅的视频
-使用 videotestsrc 元素而不是 v4l2src 将生成良好的视频
$ nice -n -20 gst-launche-1.0 -e v4l2src device=/dev/video1 DO 时间戳=true IO-mo
DE=4! 视频/x-raw、格式=YUY2、宽度=1920、高度=1080、帧速率=30/1! 视频转换
太棒了! 最大扭结
应用压缩:
该 GST 管线在720p 下工作
$ nice -n -20 gst-launche-1.0 v4l2src device=/dev/video1 do timestime=true IO-mode=
4! 'video/x-raw、format=YUY2、width=1280、height=720、framerate=30/1'! VPE! Ducat
ih264enc! h264parse! mpegtsmux name=mux m2ts-mode=false! 非常棒! udpsink
客户端=192.168.0.102:5000
- 1080p 时,使用内核路径和 DMA 缓冲区模块,从该流接收到的视频显示不断丢失的数据,看起来损坏的视频流。
$ nice -n -20 gst-launche-1.0 v4l2src device=/dev/video1 do timestime=true IO-mode=
4! 'video/x-raw、format=YUY2、width=1920、height=1080、framerate=30/1'! VPE! ducatih264enc! h264parse! mpegtsmux name=mux m2ts-mode=false! rtmp
2个月! udpsink 客户端=192.168.0.102:5000
使用此选项在基于 Ubuntu (16.04.2)的 PC 上查看:
$ sudo nice -n -20 VLC -vv rtp://@:5000