DirectX Surface Buffer
Das DirectX-Oberflächenpufferobjekt ist ein Medienpuffer, der eine Direct3D-Oberfläche verwaltet. Um eine instance dieses Objekts zu erstellen, rufen Sie MFCreateDXSurfaceBuffer auf, und übergeben Sie einen Zeiger auf die DirectX-Oberfläche. Der DirectX-Oberflächenpuffer macht die folgenden Schnittstellen verfügbar:
Es gibt mehrere Möglichkeiten, über das Pufferobjekt auf den Oberflächenspeicher zuzugreifen:
- Empfohlen: Rufen Sie IMFGetService::GetService im Puffer auf. Verwenden Sie den Dienstbezeichner MR_BUFFER_SERVICE. Die -Methode gibt einen Zeiger auf die zugrunde liegende Direct3D-Oberfläche zurück.
- Rufen Sie IMF2DBuffer::Lock2D auf. Diese Methode ruft IDirect3DSurface9::LockRect direkt auf der Oberfläche auf. Die IMF2DBuffer::Unlock2D-Methode ruft UnlockRect auf der Oberfläche auf.
- Rufen Sie IMFMediaBuffer::Lock auf. Dies wird im Allgemeinen nicht empfohlen, da das Objekt gezwungen wird, Speicher von der Direct3D-Oberfläche und dann wieder zurück zu kopieren. Die Lock2D-Methode ist effizienter.
Sowohl Lock als auch Lock2D können fehlschlagen, wenn die zugrunde liegende Oberfläche nicht gesperrt werden kann. Der DirectX-Oberflächenpuffer implementiert diese beiden Methoden hauptsächlich für Komponenten, die nicht für die Verwendung mit Direct3D-Oberflächen konzipiert sind.
Der erweiterte Videorenderer (EvR) erstellt DirectX-Oberflächenpuffer, wenn der Decoder nicht für die DirectX-Videobeschleunigung (DXVA) konfiguriert ist. Weitere Informationen finden Sie unter IMFVideoSampleAllocator.
Abrufen des Direct3D Surface
Gehen Sie wie folgt vor, um eine Direct3D-Oberfläche aus einem Videobeispiel abzurufen:
- Rufen Sie IMFSample::GetBufferByIndex mit dem Indexwert 0 (null) auf.
- Rufen Sie MFGetService auf, und geben Sie den MR_BUFFER_SERVICE Dienstbezeichner an.
Diese Schritte sind im folgenden Code dargestellt:
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;
}
Zugehörige Themen