CBaseAllocator 类

cbaseallocator class hierarchy

CBaseAllocator 类是实现分配器的抽象基类。 分配器公开 IMemAllocator 接口。

分配器是分配内存缓冲区的对象。 分配器维护可用缓冲区的列表。 当客户端通常 (筛选器) 请求缓冲区时,分配器将从列表中检索一个。 客户端使用数据填充缓冲区,并将缓冲区传递给另一个对象。 最终释放缓冲区,分配器将其返回到可用缓冲区列表。

每个缓冲区由称为 媒体示例的对象封装。 媒体示例是将指针打包到组件对象模型 (COM) 框架中的内存块的方法。 媒体示例公开 IMediaSample 接口,并使用 CMediaSample 类实现。 媒体示例包含指向关联缓冲区的指针,可通过调用 IMediaSample::GetPointer 方法访问该缓冲区。 有关详细信息,请参阅 示例和分配器

若要使用此类,请执行以下步骤:

  1. 调用 CBaseAllocator::SetProperties 方法以指定缓冲区要求,包括缓冲区数和每个缓冲区的大小。
  2. 调用 CBaseAllocator::Commit 方法以分配缓冲区。
  3. 调用 CBaseAllocator::GetBuffer 方法来检索媒体示例。 此方法会阻止下一个示例可用。
  4. 完成每个示例后,对示例调用 IUnknown::Release 方法。 当样本的引用计数达到零时,不会删除该示例。 相反,该示例将返回到分配器的可用列表。
  5. 使用分配器完成后,调用 CBaseAllocator::D ecommit 方法释放缓冲区的内存。

Commit 方法调用虚拟方法 CBaseAllocator::Alloc,该方法为缓冲区分配内存。 Decommit 方法调用纯虚拟方法 CBaseAllocator::Free,该方法释放内存。 派生类必须重写这两种方法。

CMemAllocator 基类派生自 CBaseAllocator。 筛选器基类使用 CMemAllocator 类。

受保护的成员变量 说明
m_lFree 指向可用 (免费) 媒体示例列表的指针。
m_hSem 当样本可用时发出信号的信号灯。
m_lWaiting 等待样本的线程计数。
m_lCount 要提供的缓冲区数。
m_lAllocated 当前分配的缓冲区数。
m_lSize 每个缓冲区的大小。
m_lAlignment 每个缓冲区的对齐方式。
m_lPrefix 每个缓冲区的前缀。
m_bChanged 指示缓冲区要求是否已更改的标志。
m_bCommitted 指示分配器是否已提交标志。
m_bDecommitInProgress 指示取消提交操作是否正在进行的标志。
m_pNotify 指向回调接口的指针,该接口在发布示例时调用。
m_fEnableReleaseCallback 指示是否启用发布回调的标志。
受保护的方法 说明
Alloc 为缓冲区分配内存。 虚拟。
公共方法 说明
CBaseAllocator 构造函数方法。
~ CBaseAllocator 析构函数方法。
SetNotify 已过时。
GetFreeCount 检索未使用的媒体样本数。
NotifySample 释放正在等待示例的任何线程。
SetWaiting 递增等待线程的计数。
纯虚拟方法 说明
自由 释放所有缓冲区内存。
IMemAllocator 方法 说明
SetProperties 指定要分配的缓冲区数以及每个缓冲区的大小。
GetProperties 检索分配器将创建的缓冲区数和缓冲区属性。
提交 为缓冲区分配内存。
取消提交 取消提交缓冲区。
GetBuffer 检索包含缓冲区的媒体示例。
ReleaseBuffer 将媒体示例返回到免费媒体示例列表。

要求

要求 Value
标头
Amfilter.h (包括 Streams.h)

Strmbase.lib (零售版) ;
Strmbasd.lib (调试生成)

另请参阅

提供自定义分配器