Condividi tramite


Buffer superficie DirectX

L'oggetto buffer della superficie DirectX è un buffer multimediale che gestisce una superficie Direct3D. Per creare un'istanza di questo oggetto, chiamare MFCreateDXSurfaceBuffer e passare un puntatore alla superficie DirectX. Il buffer della superficie DirectX espone le interfacce seguenti:

Esistono diversi modi per accedere alla memoria di superficie dall'oggetto buffer:

  • Consigliato: chiamare IMFGetService::GetService nel buffer. Usare l'identificatore del servizio MR_BUFFER_SERVICE. Il metodo restituisce un puntatore alla superficie Direct3D sottostante.
  • Chiamare IMF2DBuffer::Lock2D. Questo metodo chiama IDirect3DSurface9::LockRect direttamente sulla superficie. Il metodo IMF2DBuffer::Unlock2D chiama UnlockRect sulla superficie.
  • Chiama IMFMediaBuffer::Lock. In genere questo non è consigliato, perché forza l'oggetto a copiare memoria dalla superficie Direct3D e quindi di nuovo. Il metodo Lock2D è più efficiente.

Sia Lockche Lock2D possono avere esito negativo se la superficie sottostante non è bloccabile. Il buffer della superficie DirectX implementa questi due metodi principalmente per i componenti che non sono progettati per funzionare con le superfici Direct3D.

Il renderer video avanzato (EVR) crea buffer di superficie DirectX quando il decodificatore non è configurato per l'accelerazione video DirectX (DXVA). Per altre informazioni, vedere IMFVideoSampleAllocator.

Recupero della superficie Direct3D

Per ottenere una superficie Direct3D da un esempio video, eseguire le operazioni seguenti:

  1. Chiamare IMFSample::GetBufferByIndex con un valore di indice pari a zero.
  2. Chiamare MFGetService e specificare l'identificatore del servizio MR_BUFFER_SERVICE .

Il codice seguente illustra questi passaggi:

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;
}

Buffer multimediali

Esempi di video