Foundations
Elements and Plugins
Elements are at the core of GStreamer. In the context of plugin development, an element is an object derived from the GstElement class.
Pads
A pad is similar to a plug or jack on a physical device.
GstMiniObject, Buffers and Events
For data transport, there are two types of GstMiniObject defined: events (control) and buffers (content).
GstMiniObject 是GstBuffer
和GstEvent
的父类。
Constructing the Boilerplate(gst-template)
模板代码生成和编译
1 | $ git clone https://gitlab.freedesktop.org/gstreamer/gst-template.git |
修改 gst-plugin/meson.build
1 | # 修改前 |
修改源代码
可能是../tools/make_element的Bug,需要手动修改代码文件1
2
3
4
5
6
7
# 修改前
G_DECLARE_FINAL_TYPE (GstMyFilter, gst_my_filter,
GST, PLUGIN_TEMPLATE, GstElement)
# 修改后
G_DECLARE_FINAL_TYPE (GstMyFilter, gst_my_filter,
GST, MYFILTER, GstElement)
代码解析
1 | // gstmyfilter.h |
主要是三个初始化:类初始化,元素初始化,插件初始化
- 类初始化:指定类具有的信号,参数和虚函数,并设置全局状态
- 元素初始化:用于初始化此类型的特定实例。数据和事件处理函数设置
- 插件初始化:插件加载后立即调用,并且应根据加载的插件是否正确初始化了设置返回值。另外,在此功能中,应注册插件中任何受支持的元素类型。
1 | // gstmyfilter.c |
What are states?
一般建议编写的插件继承自sources,sinks ,filter,transformation ,专门针对音频,视频还有其他的 base classes。
只需要实现基类的start() and stop() 就行了。如果是继承例如GstElement ,必须自己处理状态变更。Demuxer or muxer没有基类,需要自己处理。
upward先处理自己,然后往上处理父类
downward先处理父类,然后再处理自己
1 | static GstStateChangeReturn |