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 interfaces siguientes:
- IMFMediaBuffer
- IMF2DBuffer
- IMFGetService
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 al método 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 direct3D y, a continuación, de nuevo. El método Lock2D es más eficaz.
Tanto bloqueo como Lock2D pueden producir un error si la superficie subyacente no se puede bloquear. El búfer de superficie de DirectX implementa estos dos métodos principalmente para los componentes que no están diseñados para trabajar 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 la aceleración de vídeo DirectX (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:
- Llame a IMFSample::GetBufferByIndex con un valor de índice de cero.
- Llame a MFGetService y especifique el identificador de servicio MR_BUFFER_SERVICE.
En el código siguiente se muestran 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;
}
Temas relacionados