CBaseAllocator 类
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
CBaseAllocator 类是实现分配器的抽象基类。 分配器公开 IMemAllocator 接口。
分配器是分配内存缓冲区的对象。 分配器维护可用缓冲区的列表。 当客户端通常 (筛选器) 请求缓冲区时,分配器将从列表中检索一个缓冲区。 客户端使用数据填充缓冲区,并可能将缓冲区传递给另一个对象。 最终释放缓冲区,分配器将其返回到可用缓冲区列表。
每个缓冲区由一个名为 媒体示例的对象封装。 媒体示例是一种将指向组件对象模型 (COM) 框架中的内存块的指针打包的方法。 媒体示例公开 IMediaSample 接口,并使用 CMediaSample 类实现。 媒体示例包含指向关联缓冲区的指针,可通过调用 IMediaSample::GetPointer 方法访问该缓冲区。 有关详细信息,请参阅 示例和分配器。
若要使用此类,请执行以下步骤:
- 调用 CBaseAllocator::SetProperties 方法可指定缓冲区要求,包括缓冲区数和每个缓冲区的大小。
- 调用 CBaseAllocator::Commit 方法来分配缓冲区。
- 调用 CBaseAllocator::GetBuffer 方法来检索媒体样本。 此方法会阻止,直到下一个示例可用。
- 完成每个示例后,对示例调用 IUnknown::Release 方法。 当样本的引用计数达到零时,不会删除该示例。 相反,该示例将返回到分配器的可用列表。
- 使用分配器后,调用 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 | 将媒体样本返回到免费媒体样本列表。 |
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|