Partilhar via


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:

  1. Chame IMFSample::GetBufferByIndex com um valor de índice igual a zero.
  2. 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;
}

Buffers de mídia

Exemplos de vídeo