Gstreamer中元件四种状态

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。

  • ALWAYS Pad与element一起创建;
  • REQUEST Pad在需要的时候创建,如连接两个element时;
  • SOMETIMES Pad一般由element根据处理的数据类型选择性地创建。

你可能感兴趣的:(视频处理,gstreamer)