Sdílet prostřednictvím


Vyrovnávací paměť povrchu DirectX

Objekt vyrovnávací paměti povrchu DirectX je vyrovnávací paměť médií, která spravuje plochu Direct3D. Chcete-li vytvořit instanci tohoto objektu, zavolejte MFCreateDXSurfaceBuffer a předejte ukazatel na plochu DirectX. Vyrovnávací paměť povrchu DirectX zveřejňuje následující rozhraní:

Z objektu vyrovnávací paměti můžete získat přístup k paměti povrchu několika způsoby:

  • Doporučeno: Volání MMFGetService::GetService do vyrovnávací paměti. Použijte identifikátor služby MR_BUFFER_SERVICE. Metoda vrátí ukazatel na podkladovou plochu Direct3D.
  • Volejte MMF2DBuffer::Lock2D. Tato metoda volá IDirect3DSurface9::LockRect přímo na povrchu. Metoda MMF2DBuffer::Unlock2D volá UnlockRect na povrchu.
  • Volejte MMFMediaBuffer::Lock. Obecně se to nedoporučuje, protože vynutí objekt kopírovat paměť z povrchu Direct3D a pak znovu. Metoda Lock2D je efektivnější.

Lock i Lock2D může selhat, pokud podkladová plocha není zamknutá. Vyrovnávací paměť povrchu DirectX implementuje tyto dvě metody především pro komponenty, které nejsou navrženy pro práci s povrchy Direct3D.

Vylepšený renderer videa (EVR) vytvoří vyrovnávací paměti rozhraní DirectX, pokud dekodér není nakonfigurován pro akceleraci videa DirectX (DXVA). Další informace naleznete v tématu MMFVideoSampleAllocator.

Získání zařízení Direct3D Surface

Pokud chcete získat plochu Direct3D z ukázky videa, postupujte takto:

  1. Volání MMFSample::GetBufferByIndex s hodnotou indexu nula.
  2. Volejte MFGetService a zadejte identifikátor služby MR_BUFFER_SERVICE.

Následující kód ukazuje následující kroky:

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

vyrovnávací paměti médií

ukázky videa