DirectX-ytbuffert
DirectX-ytbuffertobjektet är en mediebuffert som hanterar en Direct3D-yta. Om du vill skapa en instans av det här objektet anropar du MFCreateDXSurfaceBuffer och skickar en pekare till DirectX-ytan. DirectX-ytbufferten exponerar följande gränssnitt:
Det finns flera sätt att komma åt ytminnet från buffertobjektet:
- Rekommenderas: Anropa IMFGetService::GetService på bufferten. Använd tjänstidentifieraren MR_BUFFER_SERVICE. Metoden returnerar en pekare till den underliggande Direct3D-ytan.
- Ring IMF2DBuffer::Lock2D. Den här metoden anropar IDirect3DSurface9::LockRect direkt på ytan. Metoden IMF2DBuffer::Unlock2D anropar UnlockRect på ytan.
- Ring IMFMediaBuffer::Lås. Detta rekommenderas vanligtvis inte eftersom det tvingar objektet att kopiera minne från Direct3D-ytan och sedan tillbaka igen. Metoden Lock2D är effektivare.
Både Lås och Lock2D kan misslyckas om den underliggande ytan inte är låsbar. DirectX-ytbufferten implementerar dessa två metoder främst för komponenter som inte är utformade för att fungera med Direct3D-ytor.
Den förbättrade videoåtergivningen (EVR) skapar DirectX-ytbuffertar när avkodaren inte har konfigurerats för DirectX Video Acceleration (DXVA). Mer information finns i IMFVideoSampleAllocator.
Hämta Direct3D-ytan
Om du vill hämta en Direct3D-yta från ett videoexempel gör du följande:
- Anropa IMFSample::GetBufferByIndex med ett indexvärde på noll.
- Anropa MFGetService och ange MR_BUFFER_SERVICE tjänstidentifierare.
Följande kod visar följande steg:
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;
}
Relaterade ämnen