Gstreamer中,元件有四种状态,每种状态都有其特定的意义。
这四种状态为:
1)GST_STATE_NULL: 默认状态,该状态将会回收所有被该元件占用的资源。
2)GST_STATE_READY: 准备状态,元件会得到所有所需的全局资源,这些全局资源将被通过该元件的数据流所使用。
例如打开设备、分配缓存等。但在这种状态下,数据流仍未开始被处 理,
所以数据流的位置信息应该自动置0。
如果数据流先前被打开过,它应该被关闭,并且其位置信息、特性信息应该被重新置为初始状态。
3)GST_STATE_PAUSED: 在这种状态下,元件已经对流开始了处理,但此刻暂停了处理。
因此该状态下元件可以修改流的位置信息,读取或者处理流数据,以及一旦状态变为 PLAYING,流可以重放数据流。这种情况下,时钟是禁止运行的。
总之,PAUSED 状态除了不能运行时钟外,其它与 PLAYING 状态一模一样。
处于 PAUSED 状态的元件会很快变换到 PLAYING 状态。
举例来说,视频或音频输出元件会等待数据的到来,并将它们压入队列。
一旦状态改变,元件就会处理接收到的数据。同样,视频接收元件能够播放数据的第 一帧。
(因为这并不会影响时钟)。自动加载器(Autopluggers)可以对已经加载进管道的插件进行这种状态转换。
其它更多的像codecs或者 filters这种元件不需要在这个状态上做任何事情。
4)GST_STATE_PLAYING: PLAYING 状态除了当前运行时钟外,其它与 PAUSED 状态一模一样。
你可以通过函数gst_element_set_state()来改变一个元件的状态。
你如果显式地改变一个元件的状态,GStreamer可能会使它在内部经过一些中间状态。
例如你将一个元件从 NULL 状态设置为 PLAYING 状态,
GStreamer在其内部会使得元件经历过 READY 以及 PAUSED 状态。
状态切换:
VOID_PENDING <---> NULL <---> READY <---> PAUSED <---> PLAYING
Element的状态切换可能不是一步达成。如果切换前后的状态不相邻,则需要分多步走,每一步只能跳到相邻的状态。
Pad类型:
有三种类型的Pad: ALWAYS,REQUEST和 SOMETIMES。