探针让你明察秋豪
Probes 探针
Probes are callbacks that can be installed by the application and will notify the application about the states of the dataflow.
探针就是一些回调函数,它可以装载到应用程序中,由应用程序回调这些函数,以通知数据流的状态信息。
需求
应用程序应该能够监视和控制 pads 上的数据流。 有以下需求:
-
当 pad 空闲时收到通知,并确保 pad 保持空闲状态。 这对于能够在不破坏数据流的情况下实现元素的动态重新链接至关重要。
-
当数据、事件 event 或查询 query 在 pad 上推送或发送时收到通知。 还应该可以检查和修改数据。
-
能够根据回调的结果丢弃 drop、传递 pass 和阻塞 block 数据。
-
能够根据应用程序线程执行的方法在阻塞的 pad 上丢弃或传递数据。
概述
函数 gst_pad_add_probe() 用于向 pad 添加 probe,参数为探针类型掩码和一个回调函数
gulong gst_pad_add_probe (GstPad *pad,
GstPadProbeType mask,
GstPadProbeCallback callback,
gpointer user_data,
GDestroyNotify destroy_data);
这个函数返回一个 gulong 来唯一标识 probe, 可以用 gst_pad_remove_probe()
来移除探针
void gst_pad_remove_probe (GstPad *pad, gulong id);
类型掩码中的比特值含义如下
typedef enum
{
GST_PAD_PROBE_TYPE_INVALID = 0,
/* flags to control blocking */
GST_PAD_PROBE_TYPE_IDLE = (1 << 0),
GST_PAD_PROBE_TYPE_BLOCK = (1 << 1),
/* flags to select datatypes */
GST_PAD_PROBE_TYPE_BUFFER = (1 << 4),
GST_PAD_PROBE_TYPE_BUFFER_LIST = (1 << 5),
GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM = (1 << 6),
GST_PAD_PROBE_TYPE_EVENT_UPSTREAM = (1 << 7),
GST_PAD_PROBE_TYPE_EVENT_FLUSH = (1 << 8),
GST_PAD_PROBE_TYPE_QUERY_DOWNSTREAM = (1 << 9),
GST_PAD_PROBE_TYPE_QUERY_UPSTREAM = (1 << 10),
/* flags to select scheduling mode */
GST_PAD_PROBE_TYPE_PUSH = (1 << 12),
GST_PAD_PROBE_TYPE_PULL = (1 << 13),
} GstPadProbeType;
当以 IDLE 或 BLOCK 标志添加一个探针, 这个探针就会变成一个阻塞探针, 否则这个探针就会变成数据探针 (DATA probe)
数据类型和调度选择器标志 (scheduling selector flags)用于选择回调函数中所允许的数据类型和调度模式。
阻塞标志必须与触发的探针完全匹配。
探针回调定义如下:
GstPadProbeReturn (*GstPadProbeCallback) (GstPad *pad, GstPadProbeInfo *info,
gpointer user_data);
探测信息结构 GstPadProbeInfo 作为参数传递,要保证其类型与用于注册回调的掩码匹配。 GstPadProbeInfo 中的数据项包含类型特定的数据,通常是被阻塞的数据项,或者当不存在数据项时为NULL。
探针可返回以下返回类型
typedef enum
{
GST_PAD_PROBE_DROP,
GST_PAD_PROBE_OK,
GST_PAD_PROBE_REMOVE,
GST_PAD_PROBE_PASS,
GST_PAD_PROBE_HANDLED
} GstPadProbeReturn;
-
GST_PAD_PROBE_OK 是通常的返回类型
-
GST_PAD_PROBE_DROP 将删除当前正在探测的数据。
-
GST_PAD_PROBE_REMOVE:从探测器列表中删除当前正在执行的探针。
-
GST_PAD_PROBE_PASS 与阻塞探针相关,会暂时解除对 pad 的阻塞并让数据通过,然后它将再次阻塞下一个数据。
阻塞探针
阻塞探针是设置了 BLOCK 或 IDLE 标志的探针。 它们总是会根据以下规则阻塞数据流并触发回调:
当设置 IDLE 标志时,一旦没有数据流过 pad,就会调用探针的回调。 如果在探针注册时,pad 空闲,则将从当前线程立即调用回调。 否则,一旦 pad 在流线程中空闲,回调就会被调用。
IDLE 探针在执行动态链接 dynamic linking 时很有用,它允许应用程序等待 链接/取消链接操作的正确执行。 由于探针是阻塞探针,因此它还将确保 pad 保持空闲状态,直到探针被移除。
当设置了 BLOCK 标志时,当新数据到达 pad 时以及 pad 进入阻塞状态之前,将调用探针的回调函数。 因此,仅当 pad 上有新数据时才会调用此回调。
阻塞探针可通过 gst_pad_remove_probe()
移除,或者当回调函数返回 GST_PAD_PROBE_REMOVE
.
在这两种情况下,如果这是 pad 上最后一个阻塞探针,则 pad 将被解锁并且数据流可以继续。
非阻塞探针
非阻塞探针或数据探针是数据流过 pad 时触发的探针。 它们在阻塞探针运行后被调用,并且始终带有数据。