流状态
本文档描述了流状态消息的设计和用例。
当流线程的状态发生变化时,STREAM_STATUS 消息会发布到总线上。此消息的目的是允许应用程序与流线程属性进行交互,例如要使用的线程优先级或线程池。
要求和场景
我们满足以下要求:
- 将要创建流线程时会通知应用程序。应用程序可以建议自定义 GstTaskPool。
- 当流线程的状态改变时通知应用程序。这对于想要可视化流线程状态(播放/暂停/停止)的 GUI 应用程序可能感兴趣
- 当流线程被销毁时通知应用程序。
我们允许以下场景:
- element需要特定(内部)流线程来操作,或者应用程序可以为element创建/指定线程。
- element允许应用程序在线程上配置优先级。
用例
- 提高 udp 接收流线程的优先级
.--------. .-------. .------. .-------.
| udpsrc | | depay | | adec | | asink |
| src->sink src->sink src->sink |
'--------' '-------' '------' '-------'
-
当从 READY 到 PAUSED 状态时,udpsrc 将需要一个流线程来将数据推送到 depayloader。它将发布一条 STREAM_STATUS 消息,指示其对流线程的需求。
-
应用程序通常会使用同步的处理方式对总线上的 STREAM_STATUS 消息做出反应。
-
应用程序可以使用自定义 GstTaskPool 配置 GstTask 来管理流线程,或者它可以忽略将使element使用其默认 GstTaskPool 的消息。
-
应用程序可以对 ENTER/LEAVE 流状态消息做出反应,以在线程启动/停止之前配置线程。这可用于配置线程优先级。
-
在 GstTask 更改状态(启动/暂停/停止)之前,会发布一条 STREAM_STATUS 消息,应用程序可以使用该消息来跟踪正在运行的流线程。
消息
现有的 STREAM_STATUS 消息将在(选定的)element中进一步定义和实现。消息中将包含以下字段:
-
type,GST_TYPE_STREAM_STATUS_TYPE:
-
一组控制线程生命周期的类型: GST_STREAM_STATUS_TYPE_CREATE:将创建一个新的流线程。应用程序有机会配置自定义线程。 GST_STREAM_STATUS_TYPE_ENTER:流线程即将第一次进入循环。 GST_STREAM_STATUS_TYPE_LEAVE:流线程即将离开它的循环。 GST_STREAM_STATUS_TYPE_DESTROY:流线程被销毁
-
一组用于控制线程状态的类型: GST_STREAM_STATUS_TYPE_START:启动流线程 GST_STREAM_STATUS_TYPE_PAUSE:暂停流线程 GST_STREAM_STATUS_TYPE_STOP:停止流线程
-
-
owner: GST_TYPE_ELEMENT: 线程的所有者element。消息源将包含将由该线程生成数据的pad(或pad之一)。如果此线程不在pad产生数据,则消息源也将包含所有者。这个想法是应用程序应该能够从element/pad 看到这个线程在应用程序的上下文中具有什么功能并适当地配置线程。
-
object:G_TYPE,GstTask/GThread:控制此流线程的 GstTask/GThread。
-
flow-return: GstFlowReturn: 线程状态改变的状态码。创建和启动线程时,这通常是 GST_FLOW_OK ,但当它们停止时,它包含停止的原因代码。
-
reason:G_TYPE_STRING:描述线程启动/停止/暂停的原因的字符串。如果没有给出原因,可以为 NULL。
EVENT
FIXME