使用 Direct3D 轉譯目標

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

已定義 Direct3D 轉譯目標的數個媒體子類型,以搭配 VMR-7 和 VMR-9 使用。 當上游篩選建議與其中一個子類型的連線時,它會向 VMR 指出轉譯是在 Direct3D 轉譯目標上執行。 針對 VMR-7,這會是 DirectX 7 Direct3D 轉譯目標,而針對 VMR-9,這會是 DirectX 9 Direct3D 轉譯目標。 如果 VMR 處於混合模式,介面也會是 Direct3D 紋理表面。 如果 VMR 不在混合模式中,介面將會是一般 Direct3D 表面。 只有在 VMR 處於混合模式時,才支援 ARGB 像素格式。 轉譯目標子類型如下:

VMR-7 VMR-9
MEDIASUBTYPE_RGB32_D3D_DX7_RT MEDIASUBTYPE_RGB32_D3D_DX9_RT
MEDIASUBTYPE_RGB16_D3D_DX7_RT MEDIASUBTYPE_RGB16_D3D_DX9_RT
MEDIASUBTYPE_ARGB32_D3D_DX7_RT MEDIASUBTYPE_ARGB32_D3D_DX9_RT
MEDIASUBTYPE_ARGB4444_D3D_DX7_RT MEDIASUBTYPE_ARGB4444_D3D_DX9_RT
MEDIASUBTYPE_ARGB1555_D3D_DX7_RT MEDIASUBTYPE_ARGB1555_D3D_DX9_RT

 

這些類型定義于標頭檔 uuids.h 中。 MEDIASUBTYPE_RGB32媒體類型是 RGBx888 格式,MEDIASUBTYPE_RGB16媒體類型是 RGB565 格式。 如需這些像素格式的詳細資訊,請參閱 DirectX 圖形檔。

要求解除鎖定的 Surface

鎖定和解除鎖定 DirectDraw 表面是計算成本高昂的作業。 使用 Direct3D 轉譯目標媒體子類型時,上游篩選器需要解除鎖定介面,才能使用圖形硬體在介面上運作。 為了避免不必要的鎖定解除鎖定作業,VMR 支援 IMemAllocator::GetBuffer 方法的新旗標,AM_GBF_NODDSURFACELOCK,指示 VMR 不要在將範例傳遞至上游篩選之前鎖定 DirectDraw 表面。 使用此旗標時, IMediaSample::GetPointer 的呼叫將會失敗,因為沒有鎖定的指標。 若要取得 DirectDraw 介面的存取權,篩選準則必須在傳回的IMediaSample物件上呼叫QueryInterface,並要求IVMRSurface介面。 很明顯地,上游篩選準則必須確保將範例放回免費清單時,表面不會鎖定。