共用方式為


提供自訂配置器

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

本節說明如何為篩選提供自訂配置器。 只會描述 IMemInputPin 連線,但 IAsyncReader 連線的步驟很類似。

首先,定義配置器的 C++ 類別。 配置器可以從其中一個標準配置器類別、 CBaseAllocatorCMemAllocator衍生,或者您可以建立全新的配置器類別。 如果您建立新的類別,它必須公開 IMemAllocator 介面。

其餘步驟取決於配置器屬於輸入針腳或篩選上的輸出針腳。 輸入針腳在配置器交涉階段扮演與輸出針腳不同的角色,因為輸出針腳最終會選取配置器。

提供輸入針腳的自訂配置器

若要提供輸入針腳的配置器,請覆寫輸入針腳的 CBaseInputPin::GetAllocator 方法。 在此方法中,檢查 m_pAllocator 成員變數。 如果此變數為非Null,表示已為此連線選取配置器,因此 GetAllocator 方法必須傳回該配置器的指標。 如果 m_pAllocatorNull,表示尚未選取配置器,因此 GetAllocator 方法應該傳回輸入針腳慣用配置器的指標。 在此情況下,請建立自訂配置器的實例,並傳回其 IMemAllocator 指標。 下列程式碼示範如何實作 GetAllocator 方法:

STDMETHODIMP CMyInputPin::GetAllocator(IMemAllocator **ppAllocator)
{
    CheckPointer(ppAllocator, E_POINTER);
    if (m_pAllocator)  
    {
        // We already have an allocator, so return that one.
        *ppAllocator = m_pAllocator;
        (*ppAllocator)->AddRef();
        return S_OK;
    }

    // No allocator yet, so propose our custom allocator. The exact code
    // here will depend on your custom allocator class definition.
    HRESULT hr = S_OK;
    CMyAllocator *pAlloc = new CMyAllocator(&hr);
    if (!pAlloc)
    {
        return E_OUTOFMEMORY;
    }
    if (FAILED(hr))
    {
        delete pAlloc;
        return hr;
    }

    // Return the IMemAllocator interface to the caller.
    return pAlloc->QueryInterface(IID_IMemAllocator, (void**)ppAllocator);
}

當上游篩選選取配置器時,它會呼叫輸入針腳的 IMemInputPin::NotifyAllocator 方法。 覆寫 CBaseInputPin::NotifyAllocator 方法來檢查配置器屬性。 在某些情況下,如果輸入針腳不是您的自訂配置器,輸入針腳可能會拒絕配置器,但這可能會造成整個針腳連線失敗。

提供輸出針腳的自訂配置器

若要提供輸出針腳的配置器,請覆寫 CBaseOutputPin::InitAllocator 方法來建立配置器的實例:

HRESULT MyOutputPin::InitAllocator(IMemAllocator **ppAllocator)
{
    HRESULT hr = S_OK;
    CMyAllocator *pAlloc = new CMyAllocator(&hr);
    if (!pAlloc)
    {
        return E_OUTOFMEMORY;
    }

    if (FAILED(hr))
    {
        delete pAlloc;
        return hr;
    }

    // Return the IMemAllocator interface.
    return pAlloc->QueryInterface(IID_IMemAllocator, (void**)ppAllocator);
}

根據預設, CBaseOutputPin 類別會先從輸入針腳要求配置器。 如果配置器不適合,輸出針腳會建立自己的配置器。 若要強制連線使用自訂配置器,請覆寫 CBaseOutputPin::D ecideAllocator 方法。 不過,請注意,這可以防止您的輸出針腳與特定篩選連線,因為其他篩選準則可能也需要自己的自訂配置器。 第三個選項是切換順序:先試用您的自訂配置器,然後再回到其他篩選的配置器。

交涉配置器