一个真实帧缓冲区中的多个逻辑缓冲区

一个真实帧缓冲区中的多个逻辑缓冲区

问题描述:

我有许多必须实时处理视频流的模块。简单的方法是从模块获取视频图像的位置获取帧缓冲区,然后处理并删除它们。一个真实帧缓冲区中的多个逻辑缓冲区

问题1:并非所有的模块都以相同的速度工作。有些能够处理所有的帧,有些则不能。所以,一些模块不会处理所有的帧。如果我等待所有模块在删除缓冲区之前完成作业,则更快的将无故停止(图A)。

一个简单的解决方案是图B。每个模块都有独立的缓冲区。如果缓冲区已满,帧将不会放在那里。但问题2出现了:内存被浪费了:某些帧会在不同的缓冲区中有多个副本。

更聪明的解决方案将是一个物理缓冲区,附加更多逻辑缓冲区,如图C中的。当至少有一个逻辑缓冲区可以容纳该帧时,将在实际缓冲区中添加一个帧,并且在移除链接到该逻辑缓冲区的所有逻辑缓冲区时删除实际缓冲区。 (一个简单的实现方案由智能指针给出 - 将一个智能指针添加到所有可容纳它的逻辑缓冲区)问题#3:在最坏的情况下,可能发生每帧被分配给一个模块,而不是共享,这将是一个混乱的拉回溶液B

问题

有没有更好的方式来处理这个问题呢?一个标准答案?一个模板库实现它?

编辑 这在某种程度上复杂的机制,使用缓冲区,但是删除帧,如果缓冲区已满,提供不同平台上的一个可扩展的解决方案:我处理尽可能多的帧作为可能的,无论模块或硬件性能。

enter image description here

+2

如果系统设计失败(设计为不能满足全速率的模块),为什么还要排队?如果没有时间完成所有模块,则需要定义系统如何​​工作。 – blueshift 2012-03-30 07:13:32

+0

即使在相同的模块中,处理每个帧所用的时间也不是恒定的。有一个短队列(2-3帧),可以弥补处理时间的波动,而不会丢失太多的帧。但是如果平均处理速度很低,它应该能够自动跳过一些帧。 – Sam 2012-03-30 07:16:13

+0

也许我还不够清楚:我希望每个模块都能尽可能多地处理帧,而不必知道每个模块的性能 – Sam 2012-03-30 07:17:49

这里有两种方法我在生产实时视频系统看到:

  1. 类似于选项A,存储缓冲区的一个列表,但增加了两套标志来每个缓冲区。第一组标志指定哪些任务需要在缓冲区上执行,第二组标志指定哪些任务已经执行。当每个模块准备就绪时,它将扫描缓冲区列表,直到找到可以帮助的缓冲区。

  2. 与选项C类似,使用多个包含指向实际帧数据的指针。使用reference counting来跟踪哪些帧仍然存在。这意味着每次您向框架创建一个新指针时,都会调用一个函数来增加其引用计数,并且每次完成指针时,都会调用一个函数来减少引用计数。一旦参考计数达到零,帧就可以重新使用。

在我看来,第一种方法更容易实现,是好的,如果你有一个小的一批优秀的框架和少量的处理任务,但第二个是更普遍的,应该更容易扩展到更复杂的系统。