Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das DirectX-Oberflächenpufferobjekt ist ein Medienpuffer, der eine Direct3D-Oberfläche verwaltet. Rufen Sie zum Erstellen einer Instanz dieses Objekts MFCreateDXSurfaceBuffer auf, und übergeben Sie einen Zeiger an die DirectX-Oberfläche. Der DirectX-Oberflächenpuffer macht die folgenden Schnittstellen verfügbar:
Es gibt mehrere Möglichkeiten, auf den Oberflächenspeicher aus dem Pufferobjekt zuzugreifen:
- Empfohlen: Rufen Sie IMFGetService::GetService- für den 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::Lockauf. Im Allgemeinen wird dies 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 Sperren als auch Lock2D- können fehlschlagen, wenn die zugrunde liegende Oberfläche nicht gesperrt werden kann. Der DirectX-Oberflächenpuffer implementiert diese beiden Methoden in erster Linie für Komponenten, die nicht für die Verwendung von 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 einem Indexwert von Null auf.
- Rufen Sie MFGetService- auf, und geben Sie den MR_BUFFER_SERVICE Dienstbezeichner an.
Der folgende Code zeigt die folgenden Schritte:
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;
}
Verwandte Themen