GstElement主要功能: 提供状态机,事件总线,时间,衬垫 ,上下文等功能。
1、主要数据结构
/**
* GstElement:
* @state_lock: 在gst_element_set_state()使用 锁住状态
* @state_cond: 通知状态变化
* @state_cookie: 被用检测 gst_element_set_state()和gst_element_get_state()调用
* @target_state: 被设置的目标状态
* @current_state: 当前状态
* @next_state: 元件的下一个状态,当未定义情况的值为GST_STATE_VOID_PENDING
* @pending_state: 最终被设置的状态 ,当未定义情况 的值为 GST_STATE_VOID_PENDING
* @last_return:设置状态的返回值
* @bus:元件的GstBus事件总线,由pipeline指定
* @clock: 元件的时钟, 由pipeline指定
* @base_time: 起始时间点
* @start_time: 最近一次PAUSE运行的时间
* @numpads:元件GstPad的数量
* @pads: :元件GstPad的列表
* @numsrcpads: Source 元件GstPad的数量
* @srcpads: Source 元件GstPad的 列表
* @numsinkpads: Sink 元件GstPad的数量
* @sinkpads: Sink 元件GstPad的 列表
* @pads_cookie: 添加或者删除更新cookie值
* @contexts: 上下文列表
*
* GStreamer元件的虚拟基类
*/
struct _GstElement
{
GstObject object;
/*< public >*/ /* with LOCK */
GRecMutex state_lock;
/* element state */
GCond state_cond;
guint32 state_cookie;
GstState target_state;
GstState current_state;
GstState next_state;
GstState pending_state;
GstStateChangeReturn last_return;
GstBus * bus;
/* allocated clock */
GstClock * clock;
GstClockTimeDiff base_time; /* NULL/READY: 0 - PAUSED: current time - PLAYING: difference to clock */
GstClockTime start_time;
/* element pads, these lists can only be iterated while holding
* the LOCK or checking the cookie after each LOCK. */
guint16 numpads;
GList * pads;
guint16 numsrcpads;
GList * srcpads;
guint16 numsinkpads;
GList * sinkpads;
guint32 pads_cookie;
/* with object LOCK */
GList * contexts;
/*< private >*/
gpointer _gst_reserved[ GST_PADDING - 1];
};
2、主要函数
/**
* GstElementClass:
* @parent_class: 父类结构体
* @metadata: 这个类元数据
* @elementfactory: 创建元件的工厂类
* @padtemplates: GstPadTemplates的列表
* @numpadtemplates: GstPadTemplates的数量
* @pad_templ_cookie:检测 GstPadTemplates是否有变化
* @request_new_pad: 创建一个新的请求型GstPad
* @release_pad: 当一个请求型的GstPad被释放调用
* @get_state: 获取元件的状态
* @set_state: 设置 元件的状态
* @change_state: set_state会被同时调用
* @set_bus: 设置事件总线
* @provide_clock: 获取时钟
* @set_clock: 设置时钟
* @send_event: 发送事件给元件调用函数
* @query: 发送query给元件调用函数
* @state_changed: 一个新的状态时被调用
* @post_message:发送一个消息时被调用.并 链接到父类的处理程序,以将其发布在总线上。
* @set_context: 设置一个上下文时被调用
*
* GStreamer element class. Override the vmethods to implement the element
* functionality.
*/
struct _GstElementClass
{
GstObjectClass parent_class;
/*< public >*/
/* the element metadata */
gpointer metadata;
/* factory that the element was created from */
GstElementFactory * elementfactory;
/* templates for our pads */
GList * padtemplates;
gint numpadtemplates;
guint32 pad_templ_cookie;
/*< private >*/
/* signal callbacks */
void(* pad_added) ( GstElement * element, GstPad * pad);
void(* pad_removed) ( GstElement * element, GstPad * pad);
void(* no_more_pads) ( GstElement * element);
/*< public >*/
/* virtual methods for subclasses */
/* request/release pads */
/* FIXME 2.0 harmonize naming with gst_element_request_pad */
GstPad* (* request_new_pad) ( GstElement * element, GstPadTemplate * templ,
const gchar* name, const GstCaps * caps);
void(* release_pad) ( GstElement * element, GstPad * pad);
/* state changes */
GstStateChangeReturn(* get_state) ( GstElement * element, GstState * state,
GstState * pending, GstClockTime timeout);
GstStateChangeReturn(* set_state) ( GstElement * element, GstState state);
GstStateChangeReturn(* change_state) ( GstElement * element, GstStateChange transition);
void(* state_changed) ( GstElement * element, GstState oldstate,
GstState newstate, GstState pending);
/* bus */
void(* set_bus) ( GstElement * element, GstBus * bus);
/* set/get clocks */
GstClock* (* provide_clock) ( GstElement * element);
gboolean(* set_clock) ( GstElement * element, GstClock * clock);
/* query functions */
gboolean(* send_event) ( GstElement * element, GstEvent * event);
gboolean(* query) ( GstElement * element, GstQuery * query);
gboolean(* post_message) ( GstElement * element, GstMessage * message);
void(* set_context) ( GstElement * element, GstContext * context);
/*< private >*/
gpointer _gst_reserved[ GST_PADDING_LARGE - 2];
};
类的基本函数
gst_element_class_init()
gst_element_init()
gst_element_base_class_init()
gst_element_constructed()
gst_element_dispose()
gst_element_finalize()
扩展函数
gst_element_change_state_func()
gst_element_get_state_func()
gst_element_set_state_func()
gst_element_set_clock_func()
gst_element_set_bus_func()
gst_element_post_message_default()
gst_element_set_context_default()
gst_element_default_send_event()
gst_element_default_query()
gst_element_class_get_request_pad_template()
gst_element_call_async_func()
3、重要函数解析
3.1、默认的发送事件的函数 gst_element_send_event()
3.2、默认的查询函数 gst_element_query()
3.3、往总线BUS发送事件 gst_element_post_message()