Búfer de Superficie de DirectX

El objeto de búfer de superficie de DirectX es un búfer multimedia que administra una superficie de Direct3D. Para crear una instancia de este objeto, llame a MFCreateDXSurfaceBuffer y pase un puntero a la superficie de DirectX. El búfer de superficie de DirectX expone las siguientes interfaces:

Hay varias maneras de acceder a la memoria expuesta desde el objeto de búfer:

  • Recomendado: llame a IMFGetService::GetService en el búfer. Use el identificador de servicio MR_BUFFER_SERVICE. El método devuelve un puntero a la superficie de Direct3D subyacente.
  • Llame a IMF2DBuffer::Lock2D. Este método llama a IDirect3DSurface9::LockRect directamente en la superficie. El método IMF2DBuffer::Unlock2D llama a UnlockRect en la superficie.
  • Llame a IMFMediaBuffer::Lock. Por lo general, esto no se recomienda, ya que obliga al objeto a copiar memoria de la superficie de Direct3D y, a continuación, de nuevo. El método Lock2D es más eficaz.

Tanto Lockcomo Lock2D pueden producir un error si la superficie subyacente no es bloqueable. El búfer de superficie de DirectX implementa estos dos métodos principalmente para los componentes que no están diseñados para funcionar con superficies de Direct3D.

El representador de vídeo mejorado (EVR) crea búferes de superficie de DirectX cuando el descodificador no está configurado para directX Video Acceleration (DXVA). Para obtener más información, vea IMFVideoSampleAllocator.

Obtención de la superficie direct3D

Para obtener una superficie de Direct3D de un ejemplo de vídeo, haga lo siguiente:

  1. Llame a IMFSample::GetBufferByIndex con un valor de índice de cero.
  2. Llame a MFGetService y especifique el identificador del servicio MR_BUFFER_SERVICE .

El siguiente código muestra estos pasos:

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

Búferes multimedia

Ejemplos de vídeo