接收和传送示例

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

以下伪代码演示如何实现 IMemInput::Receive 方法:

HRESULT CMyInputPin::Receive(IMediaSample *pSample)
{
    CAutoLock cObjectLock(&m_csReceive);

    // Perhaps the filter needs to wait on something.
    WaitForSingleObject(m_hSomeEventThatReceiveNeedsToWaitOn, INFINITE);

    // Before using resources, make sure it is safe to proceed. Do not
    // continue if the base-class method returns anything besides S_OK.
    hr = CBaseInputPin::Receive(pSample);
    if (hr != S_OK) 
    {
        return hr;
    }

    /* It is safe to use resources allocated in Active and Pause. */

    // Deliver sample(s), via your output pin(s).
    for (each output pin)
        pOutputPin->Deliver(pSample);

    return hr;
}

Receive 方法保存流式处理锁,而不是筛选器锁。 筛选器可能需要等待某个事件,然后才能处理数据,此处由对 WaitForSingleObject 的调用所示。 并非每个筛选器都需要执行此操作。 CBaseInputPin::Receive 方法验证某些常规流式处理条件。 如果筛选器已停止,则返回VFW_E_WRONG_STATE;如果正在刷新筛选器,则返回S_FALSE,依此类推。 除 S_OK 以外的任何返回代码都指示 Receive 方法应立即返回而不是处理示例。

处理示例后,通过调用 CBaseOutputPin::D eliver 将其传递到下游筛选器。 此帮助程序方法在下游输入引脚上调用 IMemInputPin::Receive 。 筛选器可能会将示例传送到多个引脚。