从playerbin创建管道
make_playerbin_pipeline()基于gst中的playbin元素,playbin元素在gstplaybin.c和gstdecodebin.c中执行。
在playerbin中创建动态管道的确是个棘手的任务,我了解得也不很透彻,只能尽可能解释清楚一些。
1. 通过首选项选择
它包括:管道源(source)/槽(sink),视频比例(video scale),音频转换/音量/缩放(convert/volume/scale)等。
这在gstplaybin.c和gstdecodebin.c中完成;它将依靠后面的解码器组合(assemble)。
Gstplaybin还添加了一些友好的用户界面(UI)功能,音频文件的视觉效果(visualisation),元信息(meta info),缓存和窗口支持等。
2.通过媒体流中的信息确定
例如,mpeg或ogg(demuxer),mp3或aac(codec),甚至音频或音频/视频/字幕等。
这在gstdecodebin.c 和gstdecodebin2.c中完成。
a typefind
在gst_decode_bin_init()中为decodebin创建typefind元素。
在gst_decode_bin_init()中注册“have_type”信号注册回调函数type_found。
每个demuxer有一种typefind方法,如gstoggdemux.c中的gst_ogg_pad_typefind()。
b close_link() and和 try_to_link_1()
每个demuxer将尝试分析数据流并为后面的管道生成(动态)源衰减器,然后递归查找兼容元素直至原始数据(“video/x-raw”、“audio/x-raw”、“text/plain”、“text/x-pango-markup”)从而形成整个管道的路径。
如果在close_pad_link()中发现一个兼容元素,该兼容元素将调用try_to_link_1()将其添加到临时管道,该元素添加到try_to_link_1()中的临时管道之后,就会调用close_link()查找另一个潜在的跟随元素。这就是递归过程,一个元素不应该出现两次。
所有元素信息来自注册表(registry):
gst_decode_bin_init()中的gst_default_registry_feature_filter()。
只有Demux/Decoder/Depayloader/Parser在解码bin中使用。
元素使用的优先级通过它们的级别(rank)定义:compare_ranks()。
如果存在某种动态(间或)衰减器,close_pad_link()和close_link()将调用dynamic_add()。
队列在demuxer源衰减器之后,解码器槽衰减器之前使用。
本文译自Moblin.org技术社区, 点击此处,查看原文