共用方式為


DMO 包裝函式篩選

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

DMO 包裝函式篩選器可讓 DirectShow 應用程式在篩選圖形內使用 DirectX 媒體物件 (DMO) 。 篩選會包裝 DMO 並處理使用 DMO 的所有詳細資料,例如將資料傳入 DMO 和從 DMO 傳遞。 此外,篩選會匯總 DMO,讓應用程式可以查詢 DMO 公開的任何 COM 介面篩選。

標籤
篩選介面 IBaseFilterIDMOWrapperFilterIPersistStream
輸入釘選媒體類型 請參閱備註
輸入針腳介面 IMemInputPinIPinIQualityControl
輸出釘選媒體類型 請參閱備註
輸出針腳介面 IAMStreamConfigIAMVideoCompressionIMediaPositionIMediaSeekingIPinIQualityControl
篩選 CLSID CLSID_DMOWrapperFilter
屬性頁 CLSID 沒有屬性頁
可執行檔 Qasf.dll
優點 請參閱備註
篩選類別 請參閱備註

 

備註

限制

DMO 包裝函式具有下列限制:

  • 它不支援具有零輸入、多個輸入或零輸出的 DMO。 (它支援具有一個輸入和多個輸出的 DMO。)
  • 它不支援自訂傳輸。 所有資料傳輸都是透過 IMemInputPin 介面來完成。
  • 它不會使用 IMediaObjectInPlace 介面;所有處理都是使用 IMediaObject 方法完成。

釘選

針對 DMO 上的每個輸入資料流程,篩選準則會建立對應的輸入針腳。 針對每個輸出資料流程,它會建立對應的輸出釘選。 每個針腳支援的媒體類型取決於 DMO

編碼器介面

如果 DMO 是視訊編碼器或音訊編碼器,輸出針腳會公開 IAMStreamConfig 介面。 如果 DMO 是視訊編碼器,輸出針腳也會公開 IAMVideoCompression 介面。 在這兩種情況下,如果 DMO 支援 介面,則針腳會委派給 DMO。 否則,針腳會提供自己的實作。

串流

篩選準則會使用 IMemInputPin 介面來處理所有串流。 它不支援 IAsyncReader 連線 。 只有在從上游 (接收資料時,篩選才會在 DMO 上呼叫 IMediaObject::P rocessOutput ,包括串流結束通知) 。 因此,它不支援具有零輸入資料流程的 DMO。

尋求

所有搜尋要求都會透過 DMO 包裝函式上的第一個輸入針腳傳遞至上游篩選。 對於多輸出 DMO,這表示上游篩選可能會在應用程式搜尋圖形時收到多個搜尋要求。

優點

DirectShow 會將預設值指派給所有 DMO MERIT_NORMAL + 0x800。 此值介於 MERIT_NORMALMERIT_PREFERRED之間。 解碼器篩選通常具有 MERIT_NORMAL價值。 因此,篩選圖形管理員通常會在解碼器篩選上選取 DMO 解碼器。 若要覆寫預設優點值,請在 HKEY_CLASSES_ROOT\CLSID 中將登錄專案新增至 DMO 的登錄機碼。 包含名稱為 「要得」的 DWORD 值,其值指定了優點。

類別

DMO 包裝函式篩選不會單獨出現在任何類別中。 包裝 DMO 時,它會出現在對應至 DMO 類別目錄的 DirectShow 類別中,其名稱為 DMO。

緩衝區

DMO 包裝函式篩選器會將媒體緩衝區傳遞至 DMO,以公開 IMediaBuffer 介面。

在 Windows Vista 或更新版本中,媒體緩衝區也會公開 IServiceProvider 介面。 DMO 可以使用這個介面來取得與緩衝區相關聯之媒體範例的指標。 使用服務識別碼 IID_IMediaSample。 影片 DMO 可以使用媒體範例的 IMediaSample2 介面,在範例上設定交錯旗標。 下列程式碼示範如何取得媒體範例的指標:

IServiceProvider *pSp = NULL;
IMediaSample2 *pSample2 = NULL;
HRESULT hr = S_OK;

hr = pBuffer->QueryInterface(IID_IServiceProvider, (void**)&pSp);
if (SUCCEEDED(hr))
{
    hr = pSp->QueryService(
        IID_IMediaSample,  // Service identifier.
        IID_IMediaSample2, // Interface identifier.
        (void**)&pSample2
        );
    if (SUCCEEDED(hr))
    {
        // Set flags (not shown).
        pSample2->Release();
    }
    pSp->Release();
}

如需每個範例交錯旗標的詳細資訊,請參閱 AM_SAMPLE2_PROPERTIES 結構

品質控制

如果 DMO 公開 IDMOQualityControl 介面,篩選準則會將其輸出針腳上的 IQualityControl::Notify 呼叫轉譯為 DMO 上的 IDMOQualityControl::SetNow 呼叫。 SetNowrtNow參數會計算為Quality結構的TimeStampLate成員的總和。

在 GraphEdit 中使用 Fiter

在 GraphEdit 中,DMO 包裝函式篩選器不會出現在自己的名稱下。 相反地,每個已註冊的 DMO 都會列在適當的篩選類別之下。 當您透過 [ 插入篩選] 對話方塊新增 DMO 時,GraphEdit 會建立 DMO 包裝函式篩選,並將其設定為使用該 DMO。

DirectShow 篩選

DirectX 媒體物件