Udostępnij przez


Bufor powierzchni DirectX

Obiekt buforu powierzchni DirectX jest buforem multimedialnym, który zarządza powierzchnią Direct3D. Aby utworzyć wystąpienie tego obiektu, wywołaj MFCreateDXSurfaceBuffer i przekaż wskaźnik do powierzchni DirectX. Bufor powierzchni DirectX uwidacznia następujące interfejsy:

Istnieje kilka sposobów uzyskiwania dostępu do pamięci powierzchni z obiektu buforu:

  • Zalecane: wywołaj IMFGetService::GetService w buforze. Użyj identyfikatora usługi MR_BUFFER_SERVICE. Metoda zwraca wskaźnik do bazowej powierzchni Direct3D.
  • Wywołaj IMF2DBuffer::Lock2D. Ta metoda wywołuje IDirect3DSurface9::LockRect bezpośrednio na powierzchni. Metoda IMF2DBuffer::Unlock2D wywołuje UnlockRect na powierzchni.
  • Wywołaj IMFMediaBuffer::Zablokuj. Ogólnie nie jest to zalecane, ponieważ wymusza kopiowanie pamięci z powierzchni Direct3D, a następnie z powrotem. Metodalock2Djest wydajniejsza.

Zarówno lock, jak i Lock2D mogą zakończyć się niepowodzeniem, jeśli nie można zablokować podstawowej powierzchni. Bufor powierzchni DirectX implementuje te dwie metody przede wszystkim dla składników, które nie są przeznaczone do pracy z powierzchniami Direct3D.

Ulepszony moduł renderowania wideo (EVR) tworzy powierzchni DirectX, gdy dekoder nie jest skonfigurowany do przyspieszania wideo DirectX (DXVA). Aby uzyskać więcej informacji, zobacz IMFVideoSampleAllocator.

Uzyskiwanie powierzchni Direct3D

Aby uzyskać powierzchnię Direct3D z przykładu wideo, wykonaj następujące czynności:

  1. Wywołaj IMFSample::GetBufferByIndex z wartością indeksu o wartości zero.
  2. Wywołaj MFGetService i określ identyfikator usługi MR_BUFFER_SERVICE.

Poniższy kod przedstawia następujące kroki:

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

multimediów

przykłady wideo