附带有sink 和src pad的 gstreamer plugins的简单源码分析(一)

对于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];
};

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值