Vyrovnávací paměť povrchu DirectX
Objekt vyrovnávací paměti povrchu DirectX je vyrovnávací paměť médií, která spravuje plochu Direct3D. Chcete-li vytvořit instanci tohoto objektu, zavolejte MFCreateDXSurfaceBuffer a předejte ukazatel na plochu DirectX. Vyrovnávací paměť povrchu DirectX zveřejňuje následující rozhraní:
Z objektu vyrovnávací paměti můžete získat přístup k paměti povrchu několika způsoby:
- Doporučeno: Volání MMFGetService::GetService do vyrovnávací paměti. Použijte identifikátor služby MR_BUFFER_SERVICE. Metoda vrátí ukazatel na podkladovou plochu Direct3D.
- Volejte MMF2DBuffer::Lock2D. Tato metoda volá IDirect3DSurface9::LockRect přímo na povrchu. Metoda MMF2DBuffer::Unlock2D volá UnlockRect na povrchu.
- Volejte MMFMediaBuffer::Lock. Obecně se to nedoporučuje, protože vynutí objekt kopírovat paměť z povrchu Direct3D a pak znovu. Metoda Lock2D je efektivnější.
Lock i Lock2D může selhat, pokud podkladová plocha není zamknutá. Vyrovnávací paměť povrchu DirectX implementuje tyto dvě metody především pro komponenty, které nejsou navrženy pro práci s povrchy Direct3D.
Vylepšený renderer videa (EVR) vytvoří vyrovnávací paměti rozhraní DirectX, pokud dekodér není nakonfigurován pro akceleraci videa DirectX (DXVA). Další informace naleznete v tématu MMFVideoSampleAllocator.
Získání zařízení Direct3D Surface
Pokud chcete získat plochu Direct3D z ukázky videa, postupujte takto:
- Volání MMFSample::GetBufferByIndex s hodnotou indexu nula.
- Volejte MFGetService a zadejte identifikátor služby MR_BUFFER_SERVICE.
Následující kód ukazuje následující kroky:
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;
}
Související témata