上一部分中,我们已经介绍了编写应用程序时,element的创建及何时加载插件动态库。在此部分中,我们将介绍Gstreamer是如何将element添加到pipeline中,并把它们连接起来的。
gst_bin_add_many
Gstreamer会调用gst_bin_add_many函数将element添加到pipeline中(不区分先后顺序)。此函数中,Gstramer实际上是调用了gst_bin_add函数将单个element添加到pipeline中的。gst_bin_add函数添加element所代表的意义是,为element设置一个parent(即所谓的bin),而一个element有且只有一个parent。如果要将一个element添加到一个正在运行中的pipeline中的话,你必须正确设置element的状态。在gst_bin_add函数中,会调用pipeline这个GstBinClass对象的add_element函数指针来将element添加到pipeline中。而add_element函数指针会在bin这个插件的gst_bin_class_init函数中进行设置。
无论是GstBin,还是GstElement,它们都继承自GstObject(GstBin继承自GstElement,这里的继承即包含父类的一个对象指针),而GstObject中会有一个类型为GstObject,名为parent的指针,所以,往bin中添加element时,会将element中的parent指针指向bin。然后将,element添加到bin的children中,并增加bin的children数量。在此函数中,还做了许多相关的设置,在此就不一一介绍了,感兴趣的同学可去看Gstreamer的源码。
gst_element_link_many
Gstreamer在调用了gst_bin_add_many函数后,只是将element添加到pipeline这个bin中,且设置element的parent为pipeline。接下来,调用Gstreamer的gst_element_link_many函数来连接各个element。gst_element_link_many函数中,实际上会调用gst

本文深入探讨Gstreamer如何通过gst_bin_add_many和gst_element_link_many将element添加到pipeline并建立连接。介绍gst_element_link内部如何寻找兼容的pad进行连接,以及处理ghost pad的情况。了解这些过程对于理解Gstreamer数据传输至关重要。
274

被折叠的 条评论
为什么被折叠?



