Mémoire tampon Surface DirectX
L’objet mémoire tampon de surface DirectX est une mémoire tampon multimédia qui gère une surface Direct3D. Pour créer une instance de cet objet, appelez MFCreateDXSurfaceBuffer et passez un pointeur vers la surface DirectX. La mémoire tampon de surface DirectX expose les interfaces suivantes :
Il existe plusieurs façons d’accéder à la mémoire surface à partir de l’objet de mémoire tampon :
- Recommandé : Appelez IMFGetService::GetService sur la mémoire tampon. Utilisez l’identificateur de service MR_BUFFER_SERVICE. La méthode retourne un pointeur vers la surface Direct3D sous-jacente.
- Appelez IMF2DBuffer::Lock2D. Cette méthode appelle IDirect3DSurface9::LockRect directement sur la surface. La méthode IMF2DBuffer::Unlock2D appelle UnlockRect sur la surface.
- Appelez IMFMediaBuffer::Lock. En règle générale, cela n’est pas recommandé, car cela force l’objet à copier la mémoire à partir de la surface Direct3D, puis à revenir à nouveau. La méthode Lock2D est plus efficace.
Lock et Lock2D peuvent échouer si la surface sous-jacente n’est pas verrouillable. La mémoire tampon de surface DirectX implémente ces deux méthodes principalement pour les composants qui ne sont pas conçus pour fonctionner avec des surfaces Direct3D.
Le convertisseur vidéo amélioré (EVR) crée des mémoires tampons de surface DirectX lorsque le décodeur n’est pas configuré pour l’accélération vidéo DirectX (DXVA). Pour plus d’informations, consultez IMFVideoSampleAllocator.
Obtention de la surface Direct3D
Pour obtenir une surface Direct3D à partir d’un exemple vidéo, procédez comme suit :
- Appelez IMFSample::GetBufferByIndex avec une valeur d’index de zéro.
- Appelez MFGetService et spécifiez l’identificateur de service MR_BUFFER_SERVICE .
Le code suivant illustre ces étapes :
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;
}
Rubriques connexes