Gstreamer- pad(取消)激活

pad(取消)激活

激活

当改变状态时,一个 bin 会以 sink-to-source 的顺序在它的所有子element上设置状态。当element经历 READY→PAUSED 转换时,它们的pad被激活以准备数据流。一些pad会启动任务来驱动数据流。

一个element激活它的 pads,从 sourcepads 到 sinkpads。这是为了确保当 sinkpads 被激活并准备好接收数据时,sourcepads 已经处于活动状态以向下游传递数据。

可以以两种模式之一激活pad,PUSH 和 PULL。PUSH pad是通常的情况,其中链中的source pad通过gst_pad_push()将数据发送到sink pad。 PULL pads让sink pads通过gst_pad_pull_range()从source pads请求数据。

为了激活pad,gstreamer core将调用 gst_pad_set_active() 并使用 TRUE 参数,指示pad应处于激活状态。如果pad已经处于激活状态,无论是PUSH模式还是PULL模式,gst_pad_set_active()将返回而不做任何事情。否则将调用pad的激活函数。

因为gstreamer core不知道在哪种模式下激活pad(PUSH 或 PULL),它将该选择委托给pad上的一个方法 activate()。 pad 的 activate() 函数应该选择是在 PUSH 还是 PULL 模式下工作。一旦做出选择,它应该使用选定的激活模式调用 activate_mode() 。默认的 activate() 函数将使用 #GST_PAD_MODE_PUSH 调用 activate_mode(),因为它是数据流的默认机制。如果 SCHEDULING 查询上游包含#GST_PAD_MODE_PULL 调度模式,则支持任一操作模式的sink pad可能会调用 activate_mode(PULL),否则会调用 activate_mode(PUSH)。

考虑到 fakesrc ! fakesink 的情况,其中 fakesink 被配置为在 PULL 模式下运行。pipeline中的状态更改将从 fakesink 开始,它是最下游的element。gstreamer core将在 fakesink 的pad上调用 activate()。要使 fakesink 进入 PULL 模式,它需要实现一个自定义的 activate() 函数,该函数将在其sink调用 activate_mode(PULL)(因为默认是使用 PUSH 模式)。 activate_mode(PULL) 然后负责启动从 fakesrc:src 拉取数据的任务。很明显,fakesrc 需要被通知 fakesrc 即将在它的 src pad上拉取数据,即使pipeline还没有改变 fakesrc 的状态。为此,GStreamer 将首先在 fakesink:sink 的 peer 上调用 activate_mode(PULL),然后在 fakesink:sinks 上调用 activate_mode(PULL)。

简而言之,在其source pad上调用activate_mode(PULL)后,在PULL模式下运行的上游element必须在READY状态下准备好产生数据。此外,对 activate_mode(PULL) 的调用需要通过pipeline传播到 gst_pad_pull() 将到达的每个pad。在这种情况下 fakesrc ! identity ! fakesink,在identity的source pad调用 activate_mode(PULL) 也需要在PULL模式下激活其sink pad,这应该一直传播到 fakesrc。

另一方面,如果 fakesrc ! fakesink 运行在 PUSH 模式,激活顺序不同。首先, fakesink:sink 上的 activate() 函数在 fakesink:sink 上调用 activate_mode(PUSH) 。然后 fakesrc 的 pad 被激活:首先是source,然后是sink(其中 fakesrc 没有)。 fakesrc:src 的激活函数是在随后调用的。

请注意,在source pad上设置激活函数没有意义。source pad的peer是在下游,这意味着它应该首先被激活。如果它是在 PULL 模式下激活的,source pad应该已经调用了 activate_mode(PULL) ,因此不需要进一步激活。否则应该是PUSH模式,这是默认激活函数的选择。

因此,在 PUSH 情况下,默认激活函数选择 PUSH 模式,该模式调用 activate_mode(PUSH),然后将在source pad上启动任务并开始推送数据。通过这种方式,PUSH 调度更容易一些,因为它遵循pipeline中状态变化的顺序。当 fakesrc 开始推送数据时, fakesink 已经处于 PAUSED 状态,并且有一个激活的sink pad。

取消激活

当其父对象进入 READY 状态或当应用程序或element显式取消激活pad时,会发生pad 取消激活。 使用 FALSE 参数调用gst_pad_set_active() ,然后根据 pad 的当前激活模式调用 activate_mode(PUSH) 或 activate_mode(PULL) 并使用 FALSE 参数。

模式切换

从推模式更改为拉模式需要一些思考。这实际上是可能的并已实现,但尚未在此处记录。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值