Mémoire tampon de surface DirectX

L’objet de mémoire tampon de surface DirectX est un tampon de média qui gère une surface Direct3D. Pour créer une instance de cet objet, appelez MFCreateDXSurfaceBuffer et transmettez 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 de surface à partir de l’objet buffer :

  • Recommandé : appelez IMFGetService :: GetService sur la mémoire tampon. Utilisez le _ _ service de mémoire tampon de l’identificateur de service Mr. La méthode retourne un pointeur vers la surface Direct3D sous-jacente.
  • Appelez IMF2DBuffer :: Lock2D. Cette méthode appelle IDirect3DSurface9 :: LockRect directement sur l’aire de conception. La méthode IMF2DBuffer :: Unlock2D appelle UnlockRect sur l’aire de conception.
  • Appelez IMFMediaBuffer :: Lock. En général, cela n’est pas recommandé, car il force l’objet à copier la mémoire à partir de la surface Direct3D, puis de revenir en arrière. 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 les surfaces Direct3D.

Le convertisseur vidéo amélioré (EVR) crée des mémoires tampons de surface DirectX quand 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 de vidéo, procédez comme suit :

  1. Appelez IMFSample :: GetBufferByIndex avec une valeur d’index égale à zéro.
  2. Appelez MFGetService et spécifiez l’identificateur de service de _ mémoire _ tampon Mr .

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;
}

Mémoires tampons de média

Exemples vidéo