【扩展信息:VC++学习笔记(四) 】
摘要:数据总是存在内存块中的字节集合,每个buffer都被封装在一个叫做media sample的com组件,它引出了imediasample接口.这个sample一般都有一个叫做内存分配器(alloctor)的com对象来创建,这个对象具有imemallocator接口.每一个pin之间的连接都要指定一个allocator,有时也有几个连接同用一个allocator. 每一个allocator都要创建一个media sample池,并且给每一个sample分配一个内存buffer.每当一个filter需要一个buffer来填充数据,它就通过allocator的函数imemallocator::getbuffer.来获得一个sample.如果分配器allocator正好有空闲的sample,getbuffer立即返回一个指向该sample的指针.如果没有空闲的sample,该方法就阻塞,直到有一个sample可用为止.当该函数返回一个sample时,filter就将数据填充到buffer里,设置好标识,然后就将sample传递给下一个filter.当一个renderfilter接收到一个sample时,它就检查该sample的时间戳,直到fliter graph的参考时钟表明该数据可用播放,filter就开始播放该数据.当数据播放完毕,filter释放sample,直到所有的filter都释放对该sample的引用,该sample的引用计数为0时,这个sample才返回到sample池. 有时也许数据流的上游对buffer的填充比播放要快,即使这样,render filter也要按照时间戳播放数据,这样sample池中的sample数量就少,从而填充的速度减慢.上面描述了在流中只有一个allocator的情景,实际上,在每条数据流中总是有好几个allocator,当一个sample被释放的时候,也许此时有好几个allocator都在等着该sample,这就有新的问题了,也许有的alloctor永远都不能被分配sample,陷入互锁状态.下面的图就演示了这种情形,decoder有数据需要压缩,因此它在等待renderer释放sample,但是,parser也在请求sample,它在等待decoder释放sample.具体参加help2 传输(transports)为了在过滤器图表中传送媒体数据,directshow过滤器需要支持一些协议,称之为传输协议(transport).相连的过滤器必须支持同样的传输协议,否则不能交换媒体数据.... 下一页