我们首先进入stream文件夹,当然其中有很多文件,其实mplayer的文件命名很有规律,比如stream模块,那么这个模块总的入口就应当在stream.c文件中。
stream模块包含有很多种数据输入类型,这是对所有可能的输入数据流的抽象,比如读取本地文件被抽象以及实现都在stream_file.c文件中,当然可以想象还有stream_ftp.c等类似的文件,关于其他输入类型此处暂且不表,这里仅仅浅谈本地文件的stream抽象,以及如何融合到stream.c中,这样对应用层有统一的入口。
首先我们从全局入手,这就不得不说说auto_open_streams结构体,所有的文件归档在数据结构auto_open_streams中,当然就包含我们这里要谈的file了,所有支持的数据输入类型都能在这里找到,要是添加一种新的输入类型,应该在此入手吧,没有深入理解过,姑且如此认为吧,呵呵。
在stream.c文件中有相当的一些接口,这些包含了操作数据流所需要的所有接口,个人感觉mplayer对stream模块的这层接口的处理不是很美观,当然这与stream模块的层次定位也有相当的关系,因为我们能在main.c中看到对stream模块接口的调用,而在demux中也包含有对此调用,这就说明了stream模块的层次定位是比较含糊的,他既跟demux处于同一层次,又处于demux之下,不晓得这是mplayer的大师们故意所为还是...... 哪些是被demux调用,哪些被上层应用层调用,其实我们根据接口的第一个参数就能分辨。
那接下来就简单说说stream_file,这个文件中最重要的莫过于结构体stream_info_t了,因为这个结构体的具体实现过程就是对各种数据流的实现过程。这个结构体也就不做过多介绍了,当然不得不提open成员,因为比如在stream_file中open_f函数,在这个函数中初始化了当天stream的所有成员,套用一句老话,就是万事俱备只欠东风,就等着别人调用他啦!
既然提到了stream,那就不得不说说结构体stream_t了,这个结构体包含了所有对数据流的所有属性,具体的就不一一表述了。
说到这里,是不是有种感觉,其实stream模块是分成2层的,说白了是不是可以理解为stream_t这个结构体维护了一个层次,strea_info_t而又维护了一层了,stream_info_t面相app,也就是最上面的应用层,而stream_t面相的是stream_info_t以及其他模块,比如demux 模块。
这似乎又印证和解释了我们上面讲到的对stream模块的层次疑问。
恩,暂时就谈这么多吧,stream剩下的部分后面继续研究。