Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het DirectX-oppervlakbufferobject is een mediabuffer waarmee een Direct3D-oppervlak wordt beheerd. Als u een exemplaar van dit object wilt maken, roept u MFCreateDXSurfaceBuffer aan en geeft u een aanwijzer door naar het DirectX-oppervlak. Met de DirectX-surfacebuffer worden de volgende interfaces weergegeven:
Er zijn verschillende manieren om toegang te krijgen tot het surface-geheugen vanuit het bufferobject:
- Aanbevolen: Bel IMFGetService::GetService op de buffer. Gebruik de service-id MR_BUFFER_SERVICE. De methode retourneert een aanwijzer naar het onderliggende Direct3D-oppervlak.
- Bel IMF2DBuffer::Lock2D. Met deze methode wordt IDirect3DSurface9::LockRect rechtstreeks op het oppervlak aangeroepen. De methode IMF2DBuffer::Unlock2D roept UnlockRect- aan.
- Bel IMFMediaBuffer::Lock. Over het algemeen wordt dit niet aanbevolen, omdat het object dwingt geheugen te kopiƫren van het Direct3D-oppervlak en vervolgens weer terug. De methode Lock2D is efficiƫnter.
Zowel Vergrendelen als Lock2D- kan mislukken als het onderliggende oppervlak niet kan worden vergrendeld. De DirectX-surfacebuffer implementeert deze twee methoden voornamelijk voor onderdelen die niet zijn ontworpen voor gebruik met Direct3D-oppervlakken.
Met de verbeterde video-renderer (EVR) worden DirectX-surfacebuffers gemaakt wanneer de decoder niet is geconfigureerd voor DirectX Video Acceleration (DXVA). Zie IMFVideoSampleAllocatorvoor meer informatie.
De Direct3D Surface verkrijgen
Ga als volgt te werk om een Direct3D-oppervlak op te halen uit een videovoorbeeld:
- Roep IMFSample::GetBufferByIndex aan met een indexwaarde van nul.
- Roep MFGetService aan en geef de MR_BUFFER_SERVICE service-id op.
In de volgende code ziet u de volgende stappen:
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;
}
Verwante onderwerpen