GenICam GenTL 标准 ver1.5(4)第五章 采集引擎

5.1 概览

    采集引擎是GenTL数据流的核心。它的任务是运输本身,主要由缓冲区管理组成。如前所述,采集引擎的目标是抽象底层数据传输使其能够被使用的机制,即使不是全部,也应当适用于市场上的大多数技术。这个目标是将来自输入流的数据获取到GenTL消费者提供的存储缓冲区或者GenTL消费者可以访问到。内部设计可以单独实现,但它必须遵循一些指令。GenTL采集引擎作为一个重要的管理元素,拥有许多内部逻辑缓冲池。

5.1.1 声明缓冲池

        此处引用了所有声明的缓冲区,因此采集引擎知道这些缓冲区。一个缓冲区从声明处开始,直到它被撤销(从采集引擎移除)。如果一个缓冲区在采集过程中声明的(见5.2.2),那么就依赖于GenTL生产者。缓冲区即使在被引用时也将保留在此池中,直至撤销。这些引用可能来自其他队列/池,如输入缓冲池(见5.1.2)或输出缓冲队列(见5.1.3)或交付给GenTL消费者。

缓冲池中缓冲区的顺序未定义。缓冲区的最大可能数量仅受限于系统资源,缓冲池中缓冲区的最小数目是一个或多个,具体取决于允许的流式处理的实现或技术。

5.1.2 输入缓冲池

        当采集引擎从设备接收到数据时,它将填充输入缓冲池中的一个缓冲区。填充缓冲区后,如果成功填充,会将其从池中移除,然后将其放入输出缓冲区队列。如果传输未成功或用指定的ACQ_STOP_FLAGS_KILL指令,停止采集后,默认情况下将缓冲区放入输出缓冲区队列。由实现者提供额外的缓冲区处理模式将以不同的方式处理部分填充的缓冲区。

缓冲池中缓冲区的顺序未定义。仅存在声明缓冲池的缓冲区可以在输入缓冲池中。此池中缓冲区的最大数目是声明的缓冲区的数目。

5.1.3 输出缓冲队列

        输入缓冲池中的一个缓冲区在成功填充后,会被放入此输出缓冲队列中。只要输出缓冲区队列中至少有一个缓冲区,以前注册的事件对象会收到信号,这样GenTL消费者可以获取事件数据,从而可以识别已填充的缓冲区。

事件数据被取走后,将从输出缓冲区中删除关联的缓冲区。这也意味着数据和缓冲区只能获取一次。当缓冲区从输出缓冲区队列中移除(已交付)后,采集引擎不得再将数据写入其中。因此,这是一种有效的缓冲锁定机制。

为了重用此缓冲区,GenTL消费者必须将缓冲区放回输入中缓冲池(重新排队)。

缓冲区的顺序由缓冲区处理模式定义。缓冲区由新缓冲区事件,以逻辑上先进先出的方式(队列)创建。如果采集引擎没有删除或重新排序输出缓冲区队列中的缓冲区,它始终把输出缓冲队列中最老的缓冲区返回给GenTL消费者。仅出现在声明缓冲池中且已经填充过的缓冲区可以在输出缓冲队列中。

5.2 数据采集系列步骤

以下描述从GenTL消费者的视角(默认缓冲区处理模式)显示了采集图像的步骤。图像或数据采集,在具有使用DS_HANDLE的函数的数据流模块上执行的。因此在采集之前必须对数据流模块进行枚举(参见第章3模块枚举)。有关C函数和数据的详细说明类型见第6章软件接口。

在执行以下步骤之前,远程设备,如有必要(使用采集卡的情况下),以及GenTL设备模块应配置为生成所需的图像格式。可以从GenTL设备模块的DevGetPort函数获取远程设备的PORT_HANDLE句柄。

缓冲区使用视角下的采集步骤如下图所示,

5.2.1 分配内存

        首先,必须获得单个缓冲区的大小。为了获得该信息,GenTL消费者必须查询GenTL数据流模块(重要提示:不是远程设备)。检查有效负载大小信息是否提供,由GenTL生产者提供使用命令参数STREAM_INF_DEFINES_PAYLOADSIZE,调用DSGetInfo函数。如果返回的信息为真,消费者必须使用STREAM_INFO_PAYLOAD_SIZE参数调用DSGetInfo来检索当前有效负载大小。此外,GenTL生产者可在数据流模块的节点映射图中提供“PayloadSize”功能,反映GenTL生产者的有效负载大小。通过该功能报告的值必须与通过DSGetInfo提供的值相同。如果DSGetInfo返回的信息STREAM_INFO_DEFINES_PAYLOADSIZE为false,消费者 需要查询通过远程设备的节点映射获得PayloadSize。远程设备端口可以通过DevGetPort函数从相应的设备模块中检索。GenTL消费者必须在远程设备中选择流媒体通道并读取“PayloadSize”标准功能。

        无论如何,GenTL生产者和基础技术必须提供一种检索有效负载大小的方法。当设备不提供PayloadSize功能时(比如,GenTL生产者在接口标准的实现中,未将PayloadSize指定为强制功能),GenTL生产者必须使用流信息命令STREAM_INFO_DEFINES_PAYLOADSIZE和STREAM_INFO_PAYLOADSIZE,自行报告所需的有效负载大小。如果无法查询所需的有效负载大小,GenTL消费者通常不允许正确设置采集。它可能会根据设备配置尝试计算有效负载大小,但这样的计算永远不会可靠。

        如果STREAM_INFO_DEFINES_PAYLOADSIZE返回true,则数据流模块必须提供描述参数的缓冲区。这允许GenTL生产者修改用于预处理图像的缓冲区参数。如果GenTL生产者正在这样做,它必须实现所有缓冲区描述参数。有关详细说明,请参阅第5.5章节。

        有了这些信息,可以根据GenTL消费者的需要分配一个或多个缓冲区。GenTL生产者驱动程序也可以通过组合DSAllocAndAnnounceBuffer函数来分配缓冲区。如果缓冲区大于请求的缓冲区,则会无所谓,实际大小可以通过DSGetBufferInfo函数获得。如果缓冲区小于请求的值,则会在缓冲区模块上触发错误事件(如果错误事件在缓冲模块)和传输数据流上实现具有GC_ERR_BUFFER_TO_SMALL错误代码的模块。由GenTL生产者决定是否“太小”的缓冲区被部分传输的有效载荷填满,或者如果缓冲区未填满完全。在这两种情况下,缓冲区都会传递到消费者那边,如果基础技术允许它和相应的BUFFER_INFO_CMDs, BUFFER_INFO_INCOMPLETE,BUFFER_INFO_SIZE_FILLED,并且BUFFER_INFO_DATA_LARGER_THAN_BUFFER应报告填充状态。同样在一个或多个声明的缓冲区小于GenTL生产者的有效负载大小的情况下,可以通过返回错误代码GC_ERR_BUFFER_TOO_SMALL的DSStartAcquisition拒绝启动采集。

        每个缓冲区的有效载荷大小,无论是由GenTL生产者还是由远程设备定义,在采集期间都有可能会发生变化。只要采集的有效负载大小小于采集开始时报告的实际有效负载大小。给定的缓冲大小可以通过BUFFER_INFO_CMDs查询缓冲区。

5.2.2 声明缓冲

        采集引擎中使用的所有缓冲区,在使用之前,必须先让程序了解到它们,换句话说,使用之前先声明。可以随时添加(声明)和删除(撤销)缓冲区。通常做法是,所有缓冲区在调用DSStartAcquisition之前声明,但如果GenTL生产者基础技术支持的情况下,在数据采集过程中,可以在调用DSStartAcquisition与DSStopAcquisition之间声明与撤销缓冲区。

        为了撤销缓冲区,还需要特定缓冲区仅在声明的缓冲池中引用,这意味着它既不是在任何采集队列中,并且当前未采集到。如果基础GenTL生产者不支持在采集过程中宣布或撤销缓冲区活动(在调用DSStartAcquisition和DSStopAcquisition之间),那么GenTL生产者调用DSAnnounceBuffer、DSAllocAndAnnounceBuffer或DSRevokeBuffer返回GC_ERR_BUSY就是合法的。

        与缓冲区内存一起,传递一个指向用户数据的指针,该指针可能指向缓冲区的具体实现。该指针在新建缓冲区事件中,与缓冲区模块句柄一起被传递。

DSAnnounceBuffer和DSAllocAndAnnounceBuffer函数返回唯一的BUFFER_HANDLE,用于标识进程中的缓冲区。必须声明的缓冲区的最小数量取决于使用的技术。此信息可以是从数据流模块功能中查询。如果存在已知的最大值,也可以已查询。否则,缓冲区的数量仅受可用内存的限制。采集引擎通常使用声明的缓冲区存储额外数据,例如,使用DMA传输填充缓冲区。

5.2.3 缓冲进队列

要获取数据,必须使用DSQueueBuffer函数将至少一个缓冲区排进队列中。当缓冲区排队时,它被放入输入缓冲池。用户必须显式调用DSQueueBuffer将缓冲区放入输入缓冲池。缓冲区在队列中的顺序不需要与它们的声明顺序匹配。这个队列顺序也不一定会影响缓冲区的填充顺序。这仅取决于缓冲区处理模式。

5.2.4 注册新缓冲事件

必须使用NewBufferEvent ID注册数据流的事件对象来通知新填充缓冲区。GCRegisterEvent函数返回唯一的EVENT_HANDLE,可用于在事件发生时获取特定于事件的数据发出信号。对于“New Buffer”事件,此数据是BUFFER_HANDLE和用户数据指针。

5.2.5 开始采集

首先使用DSStartAcquisition函数启动主机上的采集引擎。之后,通过GenICam的 GenApi设置的“AcquisitionStart”标准功能来启动远程设备的图像采集。

如果设备实现了SFNC传输控制功能,GenTL消费者可能需要根据操作模式,也可在远程设备上启动传输。

5.2.6 采集图像数据

在循环中执行以下操作:

  1. 等待“新缓冲区”事件发出信号(见4.2信号)
  2. 处理图像数据
  3. 在输入缓冲池中重新设置缓冲区

通过信号事件的事件数据,可以获得新填充的缓冲区,然后处理。如前所述,除非缓冲区处理模式定义了,否则缓冲区的顺序没有任何设定。

可以使用DSQueueBuffer函数按任意顺序重新设置缓冲区。只要缓冲区不在输入缓冲池或输出缓冲队列中,采集引擎不会写入缓冲区。这种机制可以有效地锁定缓冲区。

5.2.7 停止采集

完成图像数据采集后,如有必要需要在远程设备上停止采集。这可以通过在遥控器上设置“AcquisitionStop”标准功能来实现。如果远程设备存在,则应执行命令。调用DSStopAcquisition函数后,主机上的采集就会停止。通过这样做缓冲区的状态不变。这意味着输入缓冲池中的缓冲区仍然存在。输出缓冲区队列中的缓冲区也是如此。这样做带来一个优点:在采集停止过程中,填充的缓冲区仍然可以检索和处理。

如果在调用DSStopAcquisition中指定了ACQ_STOP_FLAGS_KILL,默认情况下,部分填充的缓冲区移动到输出缓冲区等待处理的队列。带有BUFFER_INFO_IS_INCOMPLETE的DSGetBufferInfo表示缓冲区未完成。

如果设备实现SFNC传输控制功能,GenTL消费者可能需要根据操作模式,停止远程设备上的传输。

5.2.8 刷新缓冲池与队列

为了清除缓冲区的状态以允许撤销它们,必须使用DSFlushQueue函数或EventFlush函数刷新缓冲区。使用DSFlushQueue函数可以将输入缓冲池中的缓冲区刷新到输出缓冲区队列或丢弃。输出缓冲区队列中的缓冲区也必须是已处理或冲洗。通过调用EventFlush来刷新输出缓冲区队列。对“New Buffer”事件使用EventFlush函数将丢弃输出缓冲区队列中的缓冲区。

5.2.9 撤销缓冲

要使采集引擎释放采集图像数据所需的所有资源,撤销声明的缓冲区。无法撤销在输入缓冲池或输出缓冲区队列中的缓冲区。在使用DSRevokeBuffer函数撤销的缓冲区,采集引擎就不再知道它,因此不能参与排队,也不能接收任何图像数据。

缓冲区撤销的顺序取决于其声明的方法。如果缓冲区是由DSAnnounceBuffer函数声明的,就可以用任意顺序撤销。如果是使用DSAllocAndAnnounceBuffer函数声明的缓冲区,撤销时就需要小心一些。正常情况下,基础采集引擎不得更改指向缓冲区中包含数据的内存的基指针对象。如果使用DSAllocAndAnnounceBuffer函数,则缓冲区的基指针对象可能会在使用DSRevokeBuffer函数后改变。尽管如此,建议在句柄的生存期保持缓冲区的基地址。

5.2.10 释放内存

如果GenTL消费者,如果使用DSAnnounceBuffer函数提供内存给缓冲区,用完后消费者还必须释放内存。如果GenTL分配的内存,是生产者使用DSAllocAndAnnounceBuffer函数实现的,如有必要请访问库来释放内存,GenTL消费者不得释放此内存。

5.3 缓冲处理模式

缓冲区处理模式描述采集期间的内部缓冲区处理。本文档中定义了一种强制模式,也是GenTL 生产者实现的默认模式。GenICam GenTL标准特征命名约定文档中定义了更多模式。某一模式可能在以下方面与另一模式不同:

  1. 从输入缓冲池中提取哪个缓冲区用来填充。
  2. 填充的缓冲区在何时移动到输出缓冲区队列,以及插入到什么位置。
  3. 输出缓冲区队列中的哪个缓冲区被覆盖(如果有的话)在一个空的输入缓冲池中。

图5-6中的图形描述假设我们正在查看采集开始场景中有五个已声明并排队的缓冲区B0到B4,可供采集。当缓冲区已交付。图像编号在下方标有“用户”的栏中说明。缓冲区的时间线上的实心条说明了它在缓冲池中的存在。斜坡表示图像传输和后面的转换。在细线过程中,缓冲区由GenTL消费者控制和锁定用于数据。

5.3.1 默认处理方式

        默认模式设计简单而灵活,仅有一些限制。这样做是为了能够将其映射到当前使用的大多数采集技术。如果是特定技术无法映射到此模式,必须通过复制数据和模拟来实现目标软件中的行为。在这种情况下,如果平均值处理时间低于采集时间。处理时间的峰值可以通过数量较多的缓冲区减小。

                                                图5-6 消费者视角下的默认采集过程 

        首先获取的缓冲区(最旧的)总是传递给GenTL消费者。无缓冲区在输出缓冲区队列中被丢弃或覆盖。通过连续调用检索事件数据(以及缓冲区)所有填充的缓冲区都是按照它们的顺序传递的获得无论缓冲区何时填充,都会执行此操作。如果新的图像数据收到。如果输入缓冲池中没有缓冲区(例如,重新排队率低于传输速率超过足够的时间),传入图像将丢失。这个采集引擎将暂停,直到重新调用缓冲区。

总结:

  1. 没有定义从输入缓冲池提取缓冲区的顺序。
  2. 一个缓冲区一旦填充完毕,就会被放置在输出缓冲区队列的末尾。
  3. 如果输入缓冲池变空,采集引擎就会暂停,直至有缓冲区进队列

​​​​​​​5.4 块数据处理

5.4.1 概览

        GenICam GenApi标准包含“块数据”的概念。这些是数据块存在于从设备获取的单个缓冲区中,同时存在或不存在其他有效载荷数据。每个块都由其ChunkID(最多64位无符号)明确标识整数),将其映射到远程设备XML描述中的相应端口节点文件,XML文件中描述了各个块携带的信息。要寻址块中的数据,GenApi实现中必须知道缓冲区中的块的偏移及其大小。

缓冲区中块数据的结构是一种技术。因此GenTL生产者有责任在缓冲区(如果有)中解析块数据。要解析包含块数据的缓冲区,GenTL消费者使用函数DSGetBufferChunkData

报告缓冲区,并将每个块的ChunkID、偏移量和大小作为SINGLE_CHUNK_DATA结构。此信息足以将块连接到远程设备的nodemap(例如,通过GenApi的通用块适配器参考实现)。

获取的缓冲区可能只包含区块数据,或者可能混有在相同的缓冲区的图像或其他数据。要查询给定缓冲区包含的块数据,则可以使用BUFFER_INFO_CONTAINS_CHUNKDATA命令,该命令如果缓冲区包含区块数据将返回true,或者在缓冲区包含可访问的区块数据的情况下使用函数DSGetBufferChunkData,将返回可用块的数量。

还有其他与块数据相关的缓冲区信息命令,例如BUFFER_INFO_IMAGEPRESENT(表示缓冲区还包含图像)或BUFFER_INFO_CHUNKLAYOUTID(如果区块结构已更改,可以帮助检查自上次传递的缓冲区开始,如果有必要再次解析它)。这个STREAM_INFO_NUM_CHUNKS_MAX命令将最大块数报告给在通过给定流获取的缓冲区中预期的最大值(如果该最大值是先验已知的)。如果GenTL消费者知道块数据结构,例如访问已知的标准技术,无需使用DSGetBufferChunkData函数来解析缓冲区。GenTL消费者可以使用更直接的方法提取数据(通过在GenApi参考实现中使用标准块适配器)。

5.4.2 例子

{

 // Check if the buffer contains chunk data

 DSGetBufferInfo (hStream, hBuffer, BUFFER_INFO_PAYLOADTYPE, Type, PayloadType,

SizeOfPayloadType);

 if ( PayloadType == PAYLOAD_TYPE_CHUNK_DATA )

 {

 ChunkListSize = 0;

 DSGetBufferChunkData( hStream, hBuffer, 0, ChunkListSize )

 {

 // Alternatively it would be possible to inquire the max number of

 // chunks per buffer through STREAM_INFO_NUM_CHUNKS_MAX

 DSGetInfo( hStream, STREAM_INFO_NUM_CHUNKS_MAX, Type, ChunkListSize,

sizeof(ChunkListSize));

 // In this case the consumer needs error checking in case the

 // GenTL Producer cannot provide that information

 }

 // Allocate array of SINGLE_CHUNK_DATA structures

 DSGetBufferChunkData( hStream, hBuffer, ChunkArray, ChunkListSize )

 // Pass Chunk Array to GenApi Port

 // Free ChunkArray.

 }

}

5.5 数据负载传输

如果有需要或用户觉得方便的情况下,GenTL生产者可以修改从远程设备获取的图像数据。此类修改的示例可以是像素格式转换(例如,当解码Bayer编码的彩色图像时)或线间距调整(消除远程设备上产生的线填充)。

每当修改导致解释图片的基本参数改变时,GenTL生产商必须将修改通知GenTL消费者。它是必须通过BUFFER_INFO_CMD或C接口的BUFFER_PART_INFO_CMD命令。列出的值的表BUFFER_INFO_CMD和BUFFER_PART_INFO_CMD还列出了以下可选和和为必需的命令。

如果给定的BUFFER_INFO_CMD命令不可用,GenTL使用者会假定,GenTL生产者没有修改相应的参数远程设备上的设置。例如,如果查询BUFFER_INFOPIXELFORMAT返回错误,这意味着BUFFER_INFO_PIXELFORMAT命令不可用,GenTL消费者应假定GenTL生产者没有修改像素格式,以及缓冲区中的像素格式与远程设备节点映射中的PixelFormat功能值。用命令BUFFER_INFO_CMD和BUFFER_PART_INFO_CMD列出来的参数中的唯一的异常是有效载荷尺寸大小,因为它是在任何缓冲区在交付前知道(因为它用于缓冲区分配)。因此,如果GenTL生产商修改有效负载大小,它必须通过STREAM_INFO_PAYLOAD_SIZE命令来报告,如第5.2.1章所述。还可以通过流和缓冲区节点映射来报告修改。

GenTL生产者在修改流中的图像数据时必须特别小心携带块数据。此类修改不得导致块数据布局损坏。在这种情况下,GenTL生产者必须重建块缓冲区。

5.6 多分区缓冲处理

5.6.1 概览

        在许多用途中,GenTL生产者需要交付不同的数据集,逻辑上属于一起的数据(尤其是来自单个“曝光”的数据),但由多个不同的部分组成。为了有效地传递此类数据,GenTL引入了一个多分区缓冲区有效负载类型(PAYLOAD_TYPE_MULTI_PART)。多分区缓冲区的不同数据段物理上放置在单个缓冲区中。分区数量和属性可以分别使用函数DSGetNumBufferParts和DSGetBufferPartInfo获取。

 

当接收到多分区有效负载数据时,GenTL消费者需要使用上述两个函数,查询缓冲区中不同数据部分的数量以及属性。需要注意的是,数据的某些属性(例如AOI和/或数据格式)使用相应的DSGetBufferPartInfo函数支持的info命令。处理时多部分数据“缓冲区全局”信息函数DSGetBufferInfo不能用于查询缓冲区分区特定信息(例如,BUFFER_INFO_ PIXELFORMAT,BUFFER_INFO_WIDTH、BUFFER_INFO_HEIGHT等)。即使某些属性,如AOI大小,对于缓冲区中的所有分区都是相同的,应按分区通过DSGetBufferPartInfo,使用BUFFER_PART_INFO_CMDs报告和查询。另一方面,描述全局缓冲区且未定义的缓冲区属性必须使用DSGetBufferInfo(例如。,BUFFER_INFO_TIMESTAMP,BUFFER_INFO_NEW_DATA,BUFFER_INFO_DELIVERED_CHUNKPAYLOADSIZE等)。它与BUFFER_INFO_XXX常量哪个常量被零件特定信息覆盖,或者如果它描述了整个缓冲区。

与任何其他基本有效负载类型类似,可以将块数据附加到多分区有效载荷。块数据处理的原则与其他基本有效负载保持相同类型。因此,块数据对于缓冲区中的所有部分都是通用的。在多分区缓冲区中,只有一个块数据。

GenTL规范没有为单个数据类型之间的关系定义严格的规则。下面的文字将讨论一些典型用例。

5.6.2 平面像素格式

多分区缓冲区可用于使用平面像素可靠地传输和描述数据格式,如单独R-G-B平面中的颜色数据。在这种情况下,每个分区都带有一个颜色平面。通常,所有分区都具有相同的尺寸,仅在数据上有所不同。例如,在这种情况下,使用的数据类型将是(取决于实际数据)PART_DATATYPE_2D_PLANE_TRIPLANAR。使用多分区缓冲区,所有属于一起的平面都很好且明确描述。

5.6.3 多个感兴趣区域AOIs

有些设备支持多个感兴趣区域(AOI),要在传感器捕获图像。还可以使用多分区有效载荷效地传输来自这些多个AOI的数据。在这种情况下,所有分区的数据格式通常相同,仅在AOI参数中分区不同。

GenTL消费者是否愿意将单个AOI视为独立的,这取决于GenTL消费者或者它是否将

从AOI重建单个图像。主要优点是属于相同曝光的AOI一起传输。

5.6.4 像素置信度数据

带有数据类型PART_DATATYPE_CONFIDENCE_MAP的缓冲区部分用于确定其他部分中携带的像素值的有效性级别。置信度映射图中的每个值指定其他数据部分相同位置(行/列)像素的置信度级别。在1位置信度数据的最简单情况下,置信度映射只是标记对应的像素有效或无效。有效性映射中位深度更高的整数数据类型允许指定从0到给定整数的最大值的置信水平数据类型。使用浮点置信度格式时,置信度通常报告为区间[0.0,1.0]。这些规则不一定严格,可能在特定用例中重新定义。像素置信度数据的用例包括指定单个三维点云中的点坐标或非矩形图像的掩膜。

5.6.5 3D数据交换

3D设备通常不仅提供3D数据本身,还提供其他信息例如强度图像、像素置信度信息或甚至各种其他附加信息图像属性。因此,多部分有效负载类型通常是传输属于单次曝光。请注意,要完全解释多部分缓冲区中的3D数据,通常需要查询使用SFNC中定义良好的三维数据模型的其他信息。

5.6.6 非面向行的数据

对于某些数据格式(例如,对于三维点云)有效载荷可能不一定是面向直线的或组织在矩形矩阵中,而是只是一组无组织的像素。在这种情况下,建议图像宽度(BUFFER_PART_ INFO_WIDTH)始终设置为1,图像高度(BUFFER_PART_INFO_HEIGHT)用于描述有效载荷。这与其他标准中的类似做法一致。

5.6.7 多源设备

在大多数“简单”的情况下,所有部分中的数据都来自相同的源(例如物理传感器),并且可以一起进行像素映射。这意味着相同行/列的像素坐标(同时考虑每个部件的AOI偏移参数)认定为在获取的场景中表示同一像素的不同属性。这种方式下,具有来自各个坐标平面的给定三维坐标的点(PART_DATATYPE_3D_PLANE_TRIPLANAR)可以映射到密度值来自2D图像数据部分中相同位置的像素(PART_DATATYPE_2D_IMAGE)。

然而,有些复杂的设备,可以并行地从多个数据源获取数据。比如一个双传感器设备。在这种情况下,来自不同数据源的数据不能直接映射在一起。

生产者报告哪些部分来自同一来源的信息(因此可以使用BUFFER_PART_INFO_SOURCE_ID_INFO命令。数据来自相同(像素可映射)源的应使用相同的源ID、不同源的数据应使用不同ID来进行标记。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值