gstreamer 核心源码source创建和识别typefind原理浅析(一) .
来源:互联网 发布:存钱不如存人 知乎 编辑:程序博客网 时间:2024/06/11 14:48
一般情况下,用户打开一个多媒体文件,gstreamer首先需要知道文件的类型,然后创建相应的解码器来解析这个文件,最终实现播放这个文件。
一个实现流程实例如下:
(1) app程序通知gstreamer会根据uri、文件路径,创建相应类型的src组件,一般为filesrc组件(element))
(2) 接着根据插件名创建type_find组件
(3) 将filesrc element与typefind element连接link起来,添加到一个gstbin(pipeline)中
(4) 当app用户打开文件后,接着通知 gstreamer去切换状态。
case GST_STATE_CHANGE_READY_TO_PAUSED:
if (!gst_element_pads_activate (element, TRUE)) {
result = GST_STATE_CHANGE_FAILURE;
}
注意:When changing states, a bin will set the state on all of its children in
sink-to-source order.说明,状态切换先发生在typefind组件上。
(5)gst_element_pads_activate (element, TRUE)函数里接着调用 iter = gst_element_iterate_src_pads (element);
res =
iterator_activate_fold_with_resync (iter,
(GstIteratorFoldFunction) activate_pads, &active);
接着
(6)接着activate_pads函数调用gst_pad_set_active,接着调用(GST_PAD_ACTIVATEFUNC (pad)) (pad)(该宏由gsttypefindelement在实例初始化时
gst_pad_set_activate_function (typefind->sink,
GST_DEBUG_FUNCPTR (gst_type_find_element_activate)); 即GST_PAD_ACTIVATEFUNC (pad) = gst_type_find_element_activate)所以实际是调用gst_type_find_element_activate()函数,
(7)在static gboolean gst_type_find_element_activate (GstPad * pad)函数里:
/* 1 */
if (!gst_pad_check_pull_range (pad) || !gst_pad_activate_pull (pad, TRUE)) {
start_typefinding (typefind);
return gst_pad_activate_push (pad, TRUE);
}
typefind会先activate在pull mode,最后调用XX_XX_get_range函数
即:gst_pad_check_pull_range 会调用pad上的函数指针,最终会调用到basesrc的check_get_range虚函数。即:
先调用gst_base_src_pad_check_get_range----》
接着调用gst_base_src_check_get_range----》
( bclass->check_get_range ) 这里调用::gst_base_src_default_check_get_range----》
然后调用gst_base_src_start--》
( bclass = GST_BASE_SRC_GET_CLASS (basesrc);
if (bclass->start)
result = bclass->start (basesrc);
else
result = TRUE; )
在filesrc组件里,对start函数进行了覆盖,即调用gst_file_src_start。
(8)Filesrc最终会调用open函数打开文件。接着src组件状态也发生切换,创建一个task,最后把文件信息推送给typefind;
(9) typefind会从src读取一部分数据然后送出typefind_callback,在callback里面创建合适的plugin.
未完待续,会接着补充。
如需转载,请注明出处:本博客链接http://blog.csdn.net/acs713/article/details/7742976
- 相见恨晚之gstreamer 核心源码source创建和识别typefind原理浅析(一)
- gstreamer 核心源码source创建和识别typefind原理浅析(一) .
- gstreamer 核心源码source创建和识别typefind原理浅析(一)
- gstreamer核心源码走读typefind原理浅析(二) .
- 相见恨晚之gstreamer核心源码走读typefind原理和对象关系浅析(三) .
- gstreamer核心源码走读typefind原理和对象关系浅析(三)
- 相见恨晚之gstreamer核心源码走读typefind原理浅析(二)
- LeakCanary核心原理源码浅析
- ThreadPoolExecutor核心实现原理和源码解析<一>
- Gradle 庖丁解牛(构建生命周期核心委托对象创建源码浅析)
- 浅析SSH核心原理(二)
- 浅析SSH核心原理(二)
- 浅析SSH核心原理(二)
- Socket浅析通信原理和java编程(一)
- struts2源码浅析(一)
- zookeeper源码浅析(一)
- Rxjava2源码浅析(一)
- gstreamer 总结(一)
- 服务器相关
- CF-358D-Dima and Hares【T^T+*^*】
- iOS 如何选择delegate、notification、KVO?
- jbpm4.4学习心得1---数据表存储
- nyoj-722 数独(深搜,哈希)
- gstreamer 核心源码source创建和识别typefind原理浅析(一) .
- 11.20数据结构----图的存储结构
- xcode5编译过的xib 如何在xcode4.6下打开
- JAVA/JSP/Servlet获取当前工程路径-绝对路径
- UVA 10209 Is This Integration ?
- show engine innodb status显示信息不全?
- 解释:主存、辅存、Cache、RAM、SRAM、DRAM、ROM、PROM、EPROM、EEPROM、CDROM、Flash Memory。
- 近期任务
- gstreamer核心源码走读typefind原理浅析(二) .