3.6. 场序

我们必须区分逐行扫描和隔行扫描视频。逐行扫描视频按顺序传输视频图像的所有行。隔行扫描视频将图像分成两个场,分别只包含图像的奇数行和偶数行。交替传输所谓的奇数场和偶数场,并且由于场之间有很小的延迟,阴极射线电视会交错显示这些行,从而产生原始帧。发明这种奇特的技术是因为在类似于胶片的刷新率下,图像会消退得太快。传输场可以减少闪烁,而无需将帧速率加倍,从而减少每个通道所需的带宽。

重要的是要理解,摄像机不是一次曝光一帧,而只是将帧分成场来传输。这些场实际上是在两个不同的时间点捕获的。屏幕上的对象很可能在一个场和下一个场之间移动。对于分析运动的应用程序来说,识别帧的哪个场更旧(即时间顺序)至关重要。

当驱动程序按场而不是交错方式提供或接受图像时,应用程序了解这些场如何组合成帧也很重要。我们区分顶场(也称为奇数场)和底场(也称为偶数场),即空间顺序:顶场的第一行是隔行扫描帧的第一行,底场的第一行是该帧的第二行。

但是,由于场是依次捕获的,因此争论帧是从顶场还是底场开始毫无意义。任何两个连续的顶场和底场,或底场和顶场都会产生有效的帧。只有当源最初是逐行扫描的,例如,将胶片传输到视频时,两个场可能来自同一帧,从而产生自然顺序。

与直觉相反,顶场不一定是较旧的场。较旧的场是否包含顶行或底行是由视频标准决定的约定。因此区分场的时序顺序和空间顺序。下面的图应该可以更清楚地说明这一点。

在 V4L 中,假设所有摄像机都以捕获的相同顺序在媒体总线上发送场,因此如果首先捕获顶场(是较旧的场),则顶场也会首先在总线上发送。

所有视频捕获和输出设备都必须报告当前的场序。某些驱动程序可能允许选择不同的顺序,为此,应用程序在调用 VIDIOC_S_FMT ioctl 之前,初始化 struct v4l2_pix_formatfield 字段。如果不希望这样做,则应将该值设置为 V4L2_FIELD_ANY (0)。

3.6.1. enum v4l2_field

类型 v4l2_field

V4L2_FIELD_ANY

0

当任何场格式都可以接受时,应用程序会请求此场序。驱动程序根据硬件功能或例如请求的图像大小进行选择,并返回实际的场序。驱动程序绝不能返回 V4L2_FIELD_ANY。如果可以采用多种场序,则驱动程序必须在 VIDIOC_S_FMTVIDIOC_TRY_FMT 期间选择一种可能的场序。struct v4l2_buffer field 永远不能是 V4L2_FIELD_ANY

V4L2_FIELD_NONE

1

图像采用逐行扫描(基于帧)格式,而不是隔行扫描(基于场)格式。

V4L2_FIELD_TOP

2

图像仅包含顶场(也称为奇数场)。

V4L2_FIELD_BOTTOM

3

图像仅包含底场(也称为偶数场)。应用程序可能希望阻止设备捕获隔行扫描图像,因为它们在移动对象周围会有“梳状”或“羽化”伪影。

V4L2_FIELD_INTERLACED

4

图像包含两个场,逐行交错。场的时序顺序(顶场还是底场更旧)取决于当前的视频标准。在 M/NTSC 中,底场是较旧的场。在所有其他标准中,顶场是较旧的场。

V4L2_FIELD_SEQ_TB

5

图像包含两个场,顶场线首先存储在内存中,紧接着是底场线。场始终按时序顺序存储,较旧的场首先存储在内存中。图像大小是指帧,而不是场。

V4L2_FIELD_SEQ_BT

6

图像包含两个场,底场线首先存储在内存中,紧接着是顶场线。场始终按时序顺序存储,较旧的场首先存储在内存中。图像大小是指帧,而不是场。

V4L2_FIELD_ALTERNATE

7

帧的两个场按时序顺序在单独的缓冲区中传递,即较旧的场首先传递。为了指示场奇偶校验(当前场是顶场还是底场),驱动程序或应用程序(取决于数据方向)必须将 struct v4l2_buffer field 设置为 V4L2_FIELD_TOPV4L2_FIELD_BOTTOM。任何两个连续的场配对以构建帧。如果场是连续的,并且它们之间没有任何丢弃的场(场可以单独丢弃),则可以从 struct v4l2_buffer sequence 字段确定。使用读/写 I/O 方法时无法选择此格式,因为无法传达场是顶场还是底场。

V4L2_FIELD_INTERLACED_TB

8

图像包含两个场,逐行交错,顶场优先。顶场是较旧的场。

V4L2_FIELD_INTERLACED_BT

9

图像包含两个场,逐行交错,顶场优先。底场是较旧的场。

3.6.2. 场序,首先传输顶场

fieldseq_tb.svg

场序,首先传输顶场

3.6.3. 场序,首先传输底场

fieldseq_bt.svg

场序,首先传输底场