Dela via


DirectX-ytbuffert

DirectX-ytbuffertobjektet är en mediebuffert som hanterar en Direct3D-yta. Om du vill skapa en instans av det här objektet anropar du MFCreateDXSurfaceBuffer och skickar en pekare till DirectX-ytan. DirectX-ytbufferten exponerar följande gränssnitt:

Det finns flera sätt att komma åt ytminnet från buffertobjektet:

  • Rekommenderas: Anropa IMFGetService::GetService på bufferten. Använd tjänstidentifieraren MR_BUFFER_SERVICE. Metoden returnerar en pekare till den underliggande Direct3D-ytan.
  • Ring IMF2DBuffer::Lock2D. Den här metoden anropar IDirect3DSurface9::LockRect direkt på ytan. Metoden IMF2DBuffer::Unlock2D anropar UnlockRect på ytan.
  • Ring IMFMediaBuffer::Lås. Detta rekommenderas vanligtvis inte eftersom det tvingar objektet att kopiera minne från Direct3D-ytan och sedan tillbaka igen. Metoden Lock2D är effektivare.

Både Lås och Lock2D kan misslyckas om den underliggande ytan inte är låsbar. DirectX-ytbufferten implementerar dessa två metoder främst för komponenter som inte är utformade för att fungera med Direct3D-ytor.

Den förbättrade videoåtergivningen (EVR) skapar DirectX-ytbuffertar när avkodaren inte har konfigurerats för DirectX Video Acceleration (DXVA). Mer information finns i IMFVideoSampleAllocator.

Hämta Direct3D-ytan

Om du vill hämta en Direct3D-yta från ett videoexempel gör du följande:

  1. Anropa IMFSample::GetBufferByIndex med ett indexvärde på noll.
  2. Anropa MFGetService och ange MR_BUFFER_SERVICE tjänstidentifierare.

Följande kod visar följande steg:

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

mediebuffertar

videoexempel