Buffer de superfície DirectX
O objeto de buffer de superfície DirectX é um buffer de mídia que gerencia uma superfície Direct3D. Para criar uma instância desse objeto, chame MFCreateDXSurfaceBuffer e passe um ponteiro para a superfície do DirectX. O buffer de superfície do DirectX expõe as seguintes interfaces:
Há várias maneiras de acessar a memória de superfície a partir do objeto buffer:
- Recomendado: Chame IMFGetService::GetService no buffer. Use o identificador de serviço MR_BUFFER_SERVICE. O método retorna um ponteiro para a superfície Direct3D subjacente.
- Ligue IMF2DBuffer::Lock2D. Este método chama IDirect3DSurface9::LockRect diretamente na superfície. O método IMF2DBuffer::Unlock2D chama UnlockRect na superfície.
- Ligue IMFMediaBuffer::Lock. Geralmente, isso não é recomendado, porque força o objeto a copiar a memória da superfície do Direct3D e depois novamente. O método Lock2D é mais eficiente.
Tanto de bloqueio quanto Lock2D podem falhar se a superfície subjacente não puder ser bloqueada. O buffer de superfície do DirectX implementa esses dois métodos principalmente para componentes que não foram projetados para trabalhar com superfícies Direct3D.
O renderizador de vídeo avançado (EVR) cria buffers de superfície DirectX quando o decodificador não está configurado para DirectX Video Acceleration (DXVA). Para obter mais informações, consulte IMFVideoSampleAllocator.
Obtendo o Direct3D Surface
Para obter uma superfície Direct3D de um exemplo de vídeo, faça o seguinte:
- Chame IMFSample::GetBufferByIndex com um valor de índice zero.
- Chame MFGetService e especifique o identificador de serviço MR_BUFFER_SERVICE.
O código a seguir mostra essas etapas:
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;
}
Tópicos relacionados