3.6. 场序

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

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

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

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

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

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

所有视频捕获和输出设备都必须报告当前的场序。某些驱动程序可能允许选择不同的顺序,为此,应用程序在调用 VIDIOC_S_FMT ioctl之前初始化结构体 v4l2_pix_formatfield 字段。如果不需要此操作,则应将其值设为 V4L2_FIELD_ANY (0)。

3.6.1. enum v4l2_field

type v4l2_field

V4L2_FIELD_ANY

0

当任何场格式都可以接受时,应用程序会请求此场序。驱动程序根据硬件功能或例如请求的图像大小进行选择,并返回实际的场序。驱动程序绝不能返回 V4L2_FIELD_ANY。如果可能有多个场序,则驱动程序必须在 VIDIOC_S_FMTVIDIOC_TRY_FMT 期间选择其中一个可能的场序。结构体 v4l2_bufferfield 永远不能是 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

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

V4L2_FIELD_INTERLACED_TB

8

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

V4L2_FIELD_INTERLACED_BT

9

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

3.6.2. 场序,先传输顶场

fieldseq_tb.svg

场序,先传输顶场

3.6.3. 场序,先传输底场

fieldseq_bt.svg

场序,先传输底场