Buffer de Superfície do 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 da superfície do objeto de 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.
- Chame IMF2DBuffer::Lock2D. Esse método chama IDirect3DSurface9::LockRect diretamente na superfície. O método IMF2DBuffer::Unlock2D chama UnlockRect na superfície.
- Chame IMFMediaBuffer::Lock. Geralmente, isso não é recomendado, pois força o objeto a copiar a memória da superfície direct3D e, em seguida, voltar novamente. O método Lock2D é mais eficiente.
Lock eLock2D poderão falhar se a superfície subjacente não for bloqueável. O buffer de superfície DirectX implementa esses dois métodos principalmente para componentes que não foram projetados para funcionar com superfícies Direct3D.
O EVR (renderizador de vídeo avançado) cria buffers de superfície DirectX quando o decodificador não está configurado para a DXVA (Aceleração de Vídeo DirectX). 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 igual a 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