Delen via


DirectX Surface Buffer

Het DirectX-oppervlakbufferobject is een mediabuffer waarmee een Direct3D-oppervlak wordt beheerd. Als u een exemplaar van dit object wilt maken, roept u MFCreateDXSurfaceBuffer aan en geeft u een aanwijzer door naar het DirectX-oppervlak. Met de DirectX-surfacebuffer worden de volgende interfaces weergegeven:

Er zijn verschillende manieren om toegang te krijgen tot het surface-geheugen vanuit het bufferobject:

  • Aanbevolen: Bel IMFGetService::GetService op de buffer. Gebruik de service-id MR_BUFFER_SERVICE. De methode retourneert een aanwijzer naar het onderliggende Direct3D-oppervlak.
  • Bel IMF2DBuffer::Lock2D. Met deze methode wordt IDirect3DSurface9::LockRect rechtstreeks op het oppervlak aangeroepen. De methode IMF2DBuffer::Unlock2D roept UnlockRect- aan.
  • Bel IMFMediaBuffer::Lock. Over het algemeen wordt dit niet aanbevolen, omdat het object dwingt geheugen te kopiĆ«ren van het Direct3D-oppervlak en vervolgens weer terug. De methode Lock2D is efficiĆ«nter.

Zowel Vergrendelen als Lock2D- kan mislukken als het onderliggende oppervlak niet kan worden vergrendeld. De DirectX-surfacebuffer implementeert deze twee methoden voornamelijk voor onderdelen die niet zijn ontworpen voor gebruik met Direct3D-oppervlakken.

Met de verbeterde video-renderer (EVR) worden DirectX-surfacebuffers gemaakt wanneer de decoder niet is geconfigureerd voor DirectX Video Acceleration (DXVA). Zie IMFVideoSampleAllocatorvoor meer informatie.

De Direct3D Surface verkrijgen

Ga als volgt te werk om een Direct3D-oppervlak op te halen uit een videovoorbeeld:

  1. Roep IMFSample::GetBufferByIndex aan met een indexwaarde van nul.
  2. Roep MFGetService aan en geef de MR_BUFFER_SERVICE service-id op.

In de volgende code ziet u de volgende stappen:

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

mediabuffers

videovoorbeelden