CBaseInputPin.Receive 方法

该方法 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
引脚已停止。

注解

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

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

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

此方法是同步的,可以阻止。 如果该方法可能会阻止,则 pin 的 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.) 派生类应调用基类方法,以检查前面所述的错误。

要求

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

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

另请参阅

CBaseInputPin 类