DirectShow 过滤器之间数据交互
2021-02-24
174
0
过滤器通过pin连接,连接的两个PIN在在上游过滤器叫做输出pin,下游过滤器的叫做输入pin。
数据从上游过滤器传递给下游过滤器通过这两个上游过滤器的输出pin到下游过滤器的输出pin实现。
通常,下游过滤器通过IMemInputPin::Receive来接收来自上游过滤器输出pin发送的数据。
上下游过滤器之间进行数据交互可以通过在推上分配内存来实现:可以使用DirectDraw surface, GDI memory 或者其它可以进行内存分配的方法。这种进行内存分配的对象叫做分配器(allocator),在DirectShow中可以通过其提供的COMM对象 IMemAllocator来实现。
在流开始之前,分配器创建一个内存池。在流传输期间,上游过滤器用数据填充内存并将其传递给下游过滤器。但是上游过滤器不向下游过滤器提供缓存的原始指针。相反,它使用称为media samples的COM对象(类型为IMediaSample),分配器创建这些对象来管理缓存。
media samples的内容包括:
- 指向底层缓冲区的指针
- 时间戳:渲染器过滤器使用该时间安排渲染
- 各种flag:上一个media samples数据中是否有break.
- 媒体类型(可选):为过滤器提供了一种在流中更改格式的方法。
当过滤器使用缓存时,它保存sample的引用计数。分配器使用引用计数来确定何时可以重用缓冲区。这可以防止筛选器覆盖另一个筛选器仍在使用的缓冲区。在每个过滤器释放样本之前,sample不会返回到分配器的可用samples池。
https://docs.microsoft.com/zh-cn/windows/win32/directshow/samples-and-allocators
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936