Buffer superficie DirectX
L'oggetto buffer della superficie DirectX è un buffer multimediale che gestisce una superficie Direct3D. Per creare un'istanza di questo oggetto, chiamare MFCreateDXSurfaceBuffer e passare un puntatore alla superficie DirectX. Il buffer della superficie DirectX espone le interfacce seguenti:
Esistono diversi modi per accedere alla memoria di superficie dall'oggetto buffer:
- Consigliato: chiamare IMFGetService::GetService nel buffer. Usare l'identificatore del servizio MR_BUFFER_SERVICE. Il metodo restituisce un puntatore alla superficie Direct3D sottostante.
- Chiamare IMF2DBuffer::Lock2D. Questo metodo chiama IDirect3DSurface9::LockRect direttamente sulla superficie. Il metodo IMF2DBuffer::Unlock2D chiama UnlockRect sulla superficie.
- Chiama IMFMediaBuffer::Lock. In genere questo non è consigliato, perché forza l'oggetto a copiare memoria dalla superficie Direct3D e quindi di nuovo. Il metodo Lock2D è più efficiente.
Sia Lockche Lock2D possono avere esito negativo se la superficie sottostante non è bloccabile. Il buffer della superficie DirectX implementa questi due metodi principalmente per i componenti che non sono progettati per funzionare con le superfici Direct3D.
Il renderer video avanzato (EVR) crea buffer di superficie DirectX quando il decodificatore non è configurato per l'accelerazione video DirectX (DXVA). Per altre informazioni, vedere IMFVideoSampleAllocator.
Recupero della superficie Direct3D
Per ottenere una superficie Direct3D da un esempio video, eseguire le operazioni seguenti:
- Chiamare IMFSample::GetBufferByIndex con un valore di indice pari a zero.
- Chiamare MFGetService e specificare l'identificatore del servizio MR_BUFFER_SERVICE .
Il codice seguente illustra questi passaggi:
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;
}
Argomenti correlati