提供自訂配置器
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
本節說明如何為篩選提供自訂配置器。 只會描述 IMemInputPin 連線,但 IAsyncReader 連線的步驟很類似。
首先,定義配置器的 C++ 類別。 配置器可以從其中一個標準配置器類別、 CBaseAllocator 或 CMemAllocator衍生,或者您可以建立全新的配置器類別。 如果您建立新的類別,它必須公開 IMemAllocator 介面。
其餘步驟取決於配置器屬於輸入針腳或篩選上的輸出針腳。 輸入針腳在配置器交涉階段扮演與輸出針腳不同的角色,因為輸出針腳最終會選取配置器。
提供輸入針腳的自訂配置器
若要提供輸入針腳的配置器,請覆寫輸入針腳的 CBaseInputPin::GetAllocator 方法。 在此方法中,檢查 m_pAllocator 成員變數。 如果此變數為非Null,表示已為此連線選取配置器,因此 GetAllocator 方法必須傳回該配置器的指標。 如果 m_pAllocator 為 Null,表示尚未選取配置器,因此 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 方法。 不過,請注意,這可以防止您的輸出針腳與特定篩選連線,因為其他篩選準則可能也需要自己的自訂配置器。 第三個選項是切換順序:先試用您的自訂配置器,然後再回到其他篩選的配置器。
相關主題