directshow sdk学习笔记:CMemAllocator与CMediaSample

来源:互联网 发布:阿里软件下载 编辑:程序博客网 时间:2024/06/16 11:07
  

    在directshow的示例中我们发现所有的Filter都继承于CUnknown,但CMediaSample则直接继承于IMediaSample2接口,而未继承自CUnknown。这是因为CUnknown类提供了COM件聚合能力,从CUnknown继承的Filter可以被嵌套,通过delegate的方式为容器提供该Filter所能提供的功能。而CMediaSample只是用于传送媒体数据,不存在被嵌套的可能,因此无需从CUnknown继承。

         由于直接继承自接口,CMediaSample不能利用combase.h提供的DECLARE_IUNKNOWN宏来实现IUnknown接口函数的声明与实现,必须手工编写这IUnknown接口函数的声明与实现。CMediaSample继承自IMediaSample2,而IMediaSample2又继承自IMediaSample,因此CMediaSample同时实现了IMediaSample及IMediaSample2,这在CMediaSample的QueryInterface里得到了体现。CMediaSample的AddRef()是标准的AddRef实现方式,值得注意的是其Release实现方式,在引用计数降为零,不是象标准Release实现那样,释放自已,而是调用其所属IMemAllocator引用对象m_pAllocator的ReleaseBuffer,将本MediaSample放入IMemAllocator对象的空闲缓冲池。CMediaSample实例对象的创建是由CMemAllocator完成的,其释放也是由CMemAllocator完成的,需要注意的是其包含的CMemSample的释放不是CMemAllocator的DeCommit进行的,实际是通过调用CMemAllocator类的析构函数中的ReallyFree完成的。

原创粉丝点击