Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.
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;
}