CBaseInputPin.Receive 方法

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

方法 Receive 接收流中的下一个媒体示例。 此方法实现 IMemInputPin::Receive 方法。

语法

HRESULT Receive(
   IMediaSample *pSample
);

参数

pSample

指向示例 IMediaSample 接口的指针。

返回值

返回 HRESULT 值。 可能的值包括下表中列出的值。

返回代码 说明
S_OK
成功。
S_FALSE
Pin 当前正在刷新;示例被拒绝。
E_POINTER
NULL 指针参数。
VFW_E_INVALIDMEDIATYPE
媒体类型无效。
VFW_E_RUNTIME_ERROR
发生运行时错误。
VFW_E_WRONG_STATE
引脚已停止。

备注

上游输出引脚调用此方法将示例传送到输入引脚。 输入引脚必须执行以下操作之一:

  • 在返回之前处理示例。
  • 返回并处理工作线程中的示例。
  • 拒绝示例。

如果引脚使用工作线程来处理示例,请在此方法中向示例添加引用计数。 方法返回后,上游引脚释放示例。 当样本的引用计数达到零时,样本将返回到分配器以供重复使用。

此方法是同步的,可以阻止。 如果方法可能会阻止,则引脚的 CBaseInputPin::ReceiveCanBlock 方法应返回S_OK。

在基类中,此方法执行以下步骤:

  1. 调用 CBaseInputPin::CheckStreaming 方法以验证引脚现在可以处理示例。 例如,如果不能,则如果引脚已停止,则方法将失败。
  2. 检索示例属性并检查格式是否已更改, (请参阅下面的) 。
  3. 如果格式已更改,该方法将调用 CBasePin::CheckMediaType 方法,以确定新格式是否可接受。
  4. 如果不接受新格式,该方法将调用 CBasePin::EndOfStream 方法,发布EC_ERRORABORT事件,并返回错误代码。
  5. 假设没有错误,该方法将返回S_OK。

测试格式更改,如下所示:

  • 如果示例支持 IMediaSample2 接口,检查AM_SAMPLE2_PROPERTIES结构的 dwSampleFlags 成员。 如果存在AM_SAMPLE_TYPECHANGED标志,则表示格式已更改。
  • 否则,如果示例不支持 IMediaSample2,请调用 IMediaSample::GetMediaType 方法。 如果方法返回非 NULL 值,则格式已更改。

在基类中,此方法不处理示例。 派生类必须重写此方法才能执行处理。 (这完全取决于 filter。) 派生类应调用基类方法,以检查前面所述的错误。

要求

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

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

另请参阅

CBaseInputPin 类