gstreamer源码分析

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值