DirectX Surface Buffer
DirectX 介面緩衝區對像是管理 Direct3D 介面的媒體緩衝區。 若要建立此對象的實例,請呼叫 MFCreateDXSurfaceBuffer 並傳入 DirectX 介面的指標。 DirectX 介面緩衝區會公開下列介面:
有數種方式可從緩衝區物件存取表面記憶體:
- 建議:在緩衝區上呼叫 IMFGetService::GetService。 使用服務識別碼 MR_BUFFER_SERVICE。 方法會傳回基礎 Direct3D 介面的指標。
- 呼叫 IMF2DBuffer::Lock2D。 此方法會直接在介面上呼叫 IDirect3DSurface9::LockRect。 IMF2DBuffer::Unlock2D 方法會在表面上呼叫 UnlockRect。
- 呼叫 IMFMediaBuffer::Lock。 一般而言,不建議這麼做,因為它會強制物件從 Direct3D 介面複製記憶體,然後再返回一次。 Lock2D 方法更有效率。
如果基礎介面無法鎖定,Lock 和 Lock2D 都可能會失敗。 DirectX 介面緩衝區會實作這兩種方法,主要是針對未設計來搭配 Direct3D 介面使用的元件。
增強式視訊轉譯器 (EVR) 會在譯碼器未針對 DirectX 視訊加速 (DXVA) 設定時,建立 DirectX 表面緩衝區。 如需詳細資訊,請參閱 IMFVideoSampleAllocator。
取得 Direct3D Surface
若要從影片範例取得 Direct3D 表面,請執行下列動作:
- 呼叫 IMFSample::GetBufferByIndex,其索引值為零。
- 呼叫 MFGetService,並指定 MR_BUFFER_SERVICE 服務標識符。
下列程式代碼顯示下列步驟:
HRESULT GetD3DSurfaceFromSample(IMFSample *pSample, IDirect3DSurface9 **ppSurface)
{
*ppSurface = NULL;
IMFMediaBuffer *pBuffer = NULL;
HRESULT hr = pSample->GetBufferByIndex(0, &pBuffer);
if (SUCCEEDED(hr))
{
hr = MFGetService(pBuffer, MR_BUFFER_SERVICE, IID_PPV_ARGS(ppSurface));
pBuffer->Release();
}
return hr;
}
相關主題