CBaseAllocator 类

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

cbaseallocator 类层次结构

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 检索分配器将创建的缓冲区数和缓冲区属性。
Commit 为缓冲区分配内存。
取消提交 取消提交缓冲区。
GetBuffer 检索包含缓冲区的媒体示例。
ReleaseBuffer 将媒体样本返回到免费媒体样本列表。

要求

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

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

另请参阅

提供自定义分配器