首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么USB视频会在实时Linux中丢弃帧?

为什么USB视频会在实时Linux中丢弃帧?
EN

Unix & Linux用户
提问于 2022-01-26 00:09:55
回答 1查看 238关注 0票数 2

我们有一个问题,大约每60秒丢失一帧,使用实时Linux补丁将四个USB摄像头连接到Ubuntu20.04。在用户代码ioctl(VIDIOC_DQBUF)调用级别上,我们看到v4l2_buffer.sequence跳过一个缓冲区,但没有报告错误。奇怪的是,一台相机不会跳过,但三台会跳过,尽管它们都在单独的USB端口上。

查看内核调试信息,我们看到如下信息:

代码语言:javascript
复制
Jan 21 08:48:52 kernel: [ 612.290354] uvcvideo: frame 1955 stats: 0/151/151 packets, 0/0/151 pts (!early initial), 0/151 scr, last pts/stc/sof 0/0/0
Jan 21 08:48:52 kernel: [ 612.291017] uvcvideo: frame 1940 stats: 0/151/151 packets, 0/0/151 pts (!early initial), 0/151 scr, last pts/stc/sof 0/0/0
Jan 21 08:48:52 kernel: [ 612.294264] uvcvideo: frame 1956 stats: 0/9/9 packets, 0/0/9 pts (!early initial), 0/9 scr, last pts/stc/sof 0/0/0
Jan 21 08:48:52 kernel: [ 612.294269] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294270] uvcvideo: Frame complete (FID bit toggled).
Jan 21 08:48:52 kernel: [ 612.294270] uvcvideo: frame 1957 stats: 0/1/1 packets, 0/0/0 pts (!early !initial), 0/1 scr, last pts/stc/sof 0/1217480818/18547
Jan 21 08:48:52 kernel: [ 612.294272] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294678] uvcvideo: frame 1958 stats: 0/2/2 packets, 0/0/0 pts (!early !initial), 0/1 scr, last pts/stc/sof 0/1217480818/18547
Jan 21 08:48:52 kernel: [ 612.294682] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294682] uvcvideo: Frame complete (FID bit toggled).
Jan 21 08:48:52 kernel: [ 612.294683] uvcvideo: frame 1959 stats: 0/1/1 packets, 0/0/0 pts (!early !initial), 0/1 scr, last pts/stc/sof 0/1267616628/19316
Jan 21 08:48:52 kernel: [ 612.294685] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294686] uvcvideo: Frame complete (EOF found).
Jan 21 08:48:52 kernel: [ 612.294888] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295094] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.295094] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295299] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295509] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.295510] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295715] uvcvideo: frame 1960 stats: 0/5/5 packets, 2/4/3 pts (!early !initial), 2/3 scr, last pts/stc/sof 1284525428/1284525171/19827

查看源代码,Frame complete (FID bit toggled)意味着USB驱动程序没有发送完整的帧(否则我们会得到(EOF found)消息),它由显示0/2/2 packets而不是0/151/151的日志备份。

现在如何进行调试?我很难相信USB驱动程序是错误的,但是栈中是否有一些没有完全RTLinux准备好的组件呢?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-01-26 02:16:42

是否有可能是高优先级的任务或线程干扰您的USB摄像头/端口?

默认情况下,在PREEMPT_RT上(或者在主线linux上使用线程中断时),所有IRQ线程都将在50个prio上使用SCHED_FIFO运行。因此,除非您已经将这些线程/任务设置为更高的优先级,否则它们很可能会被其他东西抢占。

例如,linux proaudio用户总是将他们的音频接口设置为系统上的最高优先级,以避免被其他任务/线程抢占或中断.你会想要为你的相机和重要任务做一些类似的事情。

另一种可能是您在一个/一些USB端口上共享了中断--这也可能导致断断续续的中断。您应该能够通过查看procfs中的中断来判断。事实是,你在3台摄像机上得到了掉落,而不是在一台摄像机上--这让我觉得有些东西是被分享的/在背后被戳到了.

除此之外,您可以使用ftrace更好地查看正在发生的事情以及导致延迟的函数/可能是罪魁祸首。如果你看到了一些不对劲的东西,那么最近的顶部可能也会给出一些提示。

编辑:

这些"uvcvideo:标记缓冲区为坏(错误位设置)“的消息看起来很可疑。

https://stackoverflow.com/questions/17155738/uvcvideo-marking-buffer-as-bad-error-bit-set

如果做不到这一点,我在这里找到了一个bug报告;https://bugzilla.kernel.org/show_bug.cgi?id=207045有一个链接修补程序来修复这个问题.

它仍然适用于linux-5.16.2;https://lore.kernel.org/lkml/20200420191506.664877-1-julianmeyer2000@gmail.com/

如果您的硬件有此问题,可能会有帮助。你永远也不知道。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/687945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档