What are states?
状态描述元素实例是否初始化、是否准备好传输数据以及当前是否正在处理数据。在GStreamer中定义了四种状态:
GST_STATE_NULL 是元素的默认状态。在这种状态下,它没有分配任何运行时资源,没有加载任何运行时库,显然它不能处理数据。
GST_STATE_READY 是元素可以进入的下一个状态。在READY状态下,元素分配了所有默认资源(运行时库、运行时内存)。然而,它还没有分配或定义任何特定于流的东西。当从NULL到READY状态(GST_STATE_CHANGE_NULL_TO_READY)时,元素应该分配任何非流特定的资源,并且应该加载运行时可加载的库(如果有的话)。当进行相反的操作时(从READY到NULL, GST_STATE_CHANGE_READY_TO_NULL),元素应该卸载这些库并释放所有已分配的资源。这种资源的例子是硬件设备。请注意,文件通常是流,因此这些文件应被视为特定于流的资源;因此,不应该在这种状态下分配它们。
GST_STATE_PAUSED 是元素准备接受和处理数据的状态。对于大多数元素,这种状态与PLAYING相同。此规则的唯一例外是接收元素。Sink元素只接受一个数据缓冲区,然后阻塞。在这一点上,管道是“预卷”,并准备立即呈现数据。
GST_STATE_PLAYING 是元素可以处于的最高状态。对于大多数元素来说,这种状态与暂停状态完全相同,它们接受并处理带有数据的事件和缓冲区。只有sink元素需要区分暂停状态和播放状态。在播放状态下,接收器元素实际渲染传入数据,例如输出音频到声卡或渲染视频图像到图像接收器。
Managing filter state
如果可能的话,您的元素应该从一个新的基类(预制基类)派生。对于不同类型的源、汇和过滤器/转换元素,有现成的通用基类。除此之外,音频和视频元素以及其他元素还存在专门的基类。