gstpad:
//pad链接涉及的api
linkfunc() => gst_pad_set_link_function()
unlinkfunc()
queryfunc()
//激活pad时涉及的api
activatefunc()
activatemodefunc()
//数据传输涉及的api
chainfunc() => gst_pad_set_chain_function()
chainlistfunc()
getrangefunc() => gst_pad_set_getrange_function()
eventfunc() => gst_pad_send_event()使用
基础类:
basesrc
basesink
元素链接过程分析:(获取可以相连的pad(查询pad的caps是否一致),再进行连接)
gst_element_link (GstElement * src, GstElement * dest)
gst_element_link_pads_full()
srcpads = GST_ELEMENT_PADS (src); //获取所有的srcpads
destpads = GST_ELEMENT_PADS (dest); //获取所有的destpads
temp = gst_element_get_compatible_pad (dest, srcpad, NULL); //获得gstpad
srccaps = gst_pad_query_caps (src, NULL); //查询caps
sinkcaps = gst_pad_query_caps (sink, NULL); //查询caps
pad_link_maybe_ghosting (srcpad, temp, flags) //指针指向对方的pad,并调用linkfunc()函数
激活pad过程分析:
数据的传输过程分析:
PUSH模式:
gst_pad_push(GstPad * pad, GstBuffer * buffer)
gst_pad_chain_data_unchecked (peer(对方的pad), type, data);
chainfunc (pad, parent, GST_BUFFER_CAST (data)); //对方pad的chainfunc()函数
chainlistfunc (pad, parent, GST_BUFFER_LIST_CAST (data));
bclass->render (basesink, GST_BUFFER_CAST (obj));
PULL模式:
gst_pad_pull_range(GstPad * pad, guint64 offset, guint size, GstBuffer ** buffer)
gst_pad_get_range_unchecked (peer(对方的pad), offset, size, &res_buf);
getrangefunc (pad, parent, offset, size, &res_buf); //对方pad的getrangefunc()函数
bclass->create();
READY状态:
open操作,打开video节点或者编解码器,或者什么都不做
PAUSE状态:
激活pad,其实就是调用pad的activatefunc()
gst_element_pads_activate (element, TRUE)
activate_pads()
gst_pad_set_active (pad, *active)
(GST_PAD_ACTIVATEFUNC (pad)) (pad, parent);
PLAYING状态:
PLAYING与PAUSED状态的差别,简单的说就是时钟是运行的,数据是流动的
gst_base_src_loop() //启动线程
gst_base_src_negotiate(src) //重新进行协商
bclass->negotiate (basesrc) => gst_v4l2src_negotiate() //设置了v4l2设备的format
gst_base_src_prepare_allocation (basesrc, caps) //申请内存资源等
bclass->decide_allocation (basesrc, query) => gst_v4l2src_decide_allocation()
gst_base_src_get_range() //获取buf数据
bclass->create(src, offset, length, &res_buf) => gst_v4l2src_create() //获取数据
gst_pad_push (pad, buf) //将buf推送到下游element