gstreamer的collectpad源码分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gstreamer的collectpad源码分析
1. 背景:
gstreamer的collectpad是一类特殊的pad,这类pad工作于收集模式,用于管理控制若干个pad组成的pad集合的数据同步处理。大部分的合成器(muxer)均使用collectpad 来收集音视频数据,并根据可重载的收集条件判断函数对不同pad之间的数据进行处理(或同步)。
由于collectpad中大部分处理函数均可重载(set_func),因此本文只讨论默认的处理函数。
2. 默认流程:
collectpad的简单流程如下图:
不同的pad工作与不同的线程中,当某一个pad有数据到来时,会对所有pad进行判断,看看是否可以满足收集条件,如果满足收集条件就向对应的element推送数据。如果不满足收集条件,就会将该线程挂起,等待其他线程的数据。
当某个pad处于挂起时,其他pad收到数据后,一样会对收集条件进行判断,如果满足条件,会将所有pad的数据推送至element,同时广播条件变量,唤醒所有挂起中的其他pad(线程)。
简单的函数调用关系如下:
3. 数据结构:
数据结构如下:一个_GstCollectPads中维护了一个_GstCollectData的链表,每个pad对应一个_GstCollectData,其中记录了pad中的数据的时间戳,buffer,已经对应pad的状态(如锁、等待等标志位),GstCollectPadsPrivate中则记录了collectpad中注册的各种事件回调函数,这里的回调函数都有接口可以进行重载。此外,GstCollectPadsPrivate还维护了线程间同步用的锁和条件变量。
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
/**
* GstCollectPads:
* @data: (element-type GstBase.CollectData): #GList of #GstCollectData managed
* by this #GstCollectPads.
*
* Collectpads object.
*/
struct _GstCollectPads {
/* 基类。*/
GstObject object;
/*< public >*/ /* with LOCK and/or STREAM_LOCK */
/* 所有PAD的集合。*/
/*
* GstCollectData:
* @collect: owner #GstCollectPads
* @pad: #GstPad managed by this data
* @buffer: currently queued buffer.
* @pos: position in the buffer
* @segment: last segment received.
* @dts: the signed version of the DTS converted to running time. To access
* this memeber, use %GST_COLLECT_PADS_DTS macro. (Since 1.6)
*
* Structure used by the collect_pads.
struct _GstCollectData
{
/* with STREAM_LOCK of @collect */
/* 指向回collectpad。*/
GstCollectPads *collect;
GstPad *pad;
GstBuffer *buffer;
guint pos;
GstSegment segment;
/*< private >*/
/* state: bitfield for easier extension;
* eos, flushing, new_segment, waiting */
GstCollectPadsStateFlags state;
GstCollectDataPrivate *priv;
union {
struct {
/*< public >*/
gint64 dts;
/*< private >*/
} abi;
gpointer _gst_reserved[GST_PADDING];
} ABI;
};
*/
GSList *data; /* list of CollectData items */
/*< private >*/
GRecMutex stream_lock; /* used to serialize collection among several streams */
GstCollectPadsPrivate *priv;
gpointer _gst_reserved[GST_PADDING];
};
4. 代码分析:
4.1 主入口函数:
主入口函数gst_collect_pads_chain,不同pad工作于不同线程中。代码分析如下:[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
/* For each buffer we receive we check if our collected condition is reached