对于gstreamer的带有sink和src pad的插件,可以利用GstBaseTransform 和 GstBaseTransformClass这两个结构体来进行插件的编写,这两个结构体定义在gst/base/gstbasetransform.h中。下面我来对这两个结构体进分析。
下面typedef语句为两个结构体取了GstBaseTransform和GstBaseTransformClass的别名。
typedef struct _GstBaseTransform GstBaseTransform;
typedef struct _GstBaseTransformClass GstBaseTransformClass;
_GstBaseTransform的定义如下:
*/
struct _GstBaseTransform {
GstElement element;
/*< protected >*/
/* source and sink pads */
GstPad *sinkpad;
GstPad *srcpad;
/* MT-protected (with STREAM_LOCK) */
gboolean have_segment;
GstSegment segment;
/* Default submit_input_buffer places the buffer here,
* for consumption by the generate_output method: */
GstBuffer *queued_buf;
/*< private >*/
GstBaseTransformPrivate *priv;
gpointer _gst_reserved[GST_PADDING_LARGE-1];
};
_GstBaseTransform 的属性数量不算多,其中我门需要关注的可能只需要关注
GstElement element;
GstPad *sinkpad;
GstPad *srcpad;
这三个参数,其中element表示为gst中的element组件,sinkpad和srcpad表示输出和输入端口。
这里面的参数都无需我们自己直接来设置,此时则需要_GstBaseTransformClass来帮忙了,们可以利用_GstBaseTransformClass提供的方法从而实现_GstBaseTransform中属性的间接设置。
_GstBaseTransformClass 结构体中也有很多属性和方法,同文件下有相应的说明,仔细理解说明,可以发现其中常用的也不多,可能用到的也就以下五个,当然也可以尝试以下其他函数的用法,尝试开发出一些高级的用法。
gboolean (*start) (GstBaseTransform *trans);
gboolean (*stop) (GstBaseTransform *trans);
gboolean (*sink_event) (GstBaseTransform *trans, GstEvent *event);
gboolean (*src_event) (GstBaseTransform *trans, GstEvent *event);
GstFlowReturn (*transform_ip) (GstBaseTransform *trans, GstBuffer *buf);
这5中方法定义的功能如其函数名:
start方法在插件开始运行时被调用
stop方法在插件运行结束时被调用
sink_event 当sink pad 事件发生时调用
src_event 当src pad事件发生时调用
transform_ip是用于插件内部处理输入buf的数据,类似的还有transform这个方法,具体用法可以多研究研究
struct _GstBaseTransformClass {
GstElementClass parent_class;
/*< public >*/
gboolean passthrough_on_same_caps;
gboolean transform_ip_on_passthrough;
/* virtual methods for subclasses */
GstCaps* (*transform_caps) (GstBaseTransform *trans,
GstPadDirection direction,
GstCaps *caps, GstCaps *filter);
GstCaps* (*fixate_caps) (GstBaseTransform *trans,
GstPadDirection direction, GstCaps *caps,
GstCaps *othercaps);
gboolean (*accept_caps) (GstBaseTransform *trans, GstPadDirection direction,
GstCaps *caps);
gboolean (*set_caps) (GstBaseTransform *trans, GstCaps *incaps,
GstCaps *outcaps);
gboolean (*query) (GstBaseTransform *trans, GstPadDirection direction,
GstQuery *query);
/* decide allocation query for output buffers */
gboolean (*decide_allocation) (GstBaseTransform *trans, GstQuery *query);
gboolean (*filter_meta) (GstBaseTransform *trans, GstQuery *query,
GType api, const GstStructure *params);
/* propose allocation query parameters for input buffers */
gboolean (*propose_allocation) (GstBaseTransform *trans, GstQuery *decide_query,
GstQuery *query);
/* transform size */
gboolean (*transform_size) (GstBaseTransform *trans,
GstPadDirection direction,
GstCaps *caps, gsize size,
GstCaps *othercaps, gsize *othersize);
gboolean (*get_unit_size) (GstBaseTransform *trans, GstCaps *caps,
gsize *size);
/* states */
gboolean (*start) (GstBaseTransform *trans);
gboolean (*stop) (GstBaseTransform *trans);
/* sink and src pad event handlers */
gboolean (*sink_event) (GstBaseTransform *trans, GstEvent *event);
gboolean (*src_event) (GstBaseTransform *trans, GstEvent *event);
GstFlowReturn (*prepare_output_buffer) (GstBaseTransform * trans,
GstBuffer *input, GstBuffer **outbuf);
/* metadata */
gboolean (*copy_metadata) (GstBaseTransform *trans, GstBuffer *input,
GstBuffer *outbuf);
gboolean (*transform_meta) (GstBaseTransform *trans, GstBuffer *outbuf,
GstMeta *meta, GstBuffer *inbuf);
void (*before_transform) (GstBaseTransform *trans, GstBuffer *buffer);
/* transform */
GstFlowReturn (*transform) (GstBaseTransform *trans, GstBuffer *inbuf,
GstBuffer *outbuf);
GstFlowReturn (*transform_ip) (GstBaseTransform *trans, GstBuffer *buf);
GstFlowReturn (*submit_input_buffer) (GstBaseTransform *trans, gboolean is_discont, GstBuffer *input);
GstFlowReturn (*generate_output) (GstBaseTransform *trans, GstBuffer **outbuf);
/*< private >*/
gpointer _gst_reserved[GST_PADDING_LARGE - 2];
};