Share via


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:

  1. Rufen Sie IMFSample::GetBufferByIndex mit dem Indexwert 0 (null) auf.
  2. 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;
}

Medienpuffer

Videobeispiele