Utilisation de mémoires tampons multimédias (Microsoft Media Foundation)
Cette rubrique explique comment utiliser l’interface IMFMediaBuffer pour accéder aux données d’une mémoire tampon multimédia. Toutes les mémoires tampons multimédias exposent IMFMediaBuffer, qui est conçu pour n’importe quel type de données. Les images vidéo non compressées sont un cas particulier, décrit dans la rubrique Mémoires tampons vidéo non compressées.
Taille de la mémoire tampon
Deux tailles sont associées à une mémoire tampon de média :
La longueur maximale est la taille physique de la mémoire allouée pour la mémoire tampon. Cette valeur est définie lors de la création de la mémoire tampon et ne change pas pendant la durée de vie de la mémoire tampon. La longueur maximale indique la quantité de données pouvant être stockées dans la mémoire tampon. Pour trouver la taille maximale, appelez IMFMediaBuffer::GetMaxLength.
La longueur actuelle correspond à la quantité de données valides qui se trouvent actuellement dans la mémoire tampon. Lorsque la mémoire tampon est allouée pour la première fois, la longueur actuelle est égale à zéro, car il n’y a pas de données valides dans la mémoire tampon. Si vous écrivez des données dans la mémoire tampon, vous devez mettre à jour la longueur actuelle en appelant IMFMediaBuffer::SetCurrentLength. Par exemple, si vous écrivez 100 octets de données dans la mémoire tampon, appelez SetCurrentLength avec la valeur 100. Si vous lisez des données à partir d’une mémoire tampon multimédia, appelez IMFMediaBuffer::GetCurrentLength pour connaître la quantité de données présentement dans la mémoire tampon. Ne lisez pas au-delà de la longueur actuelle. La longueur actuelle ne peut jamais dépasser la longueur maximale de la mémoire tampon.
Accès à la mémoire tampon
Pour accéder à la mémoire dans la mémoire tampon, appelez IMFMediaBuffer::Lock. Cette méthode retourne un pointeur vers le début du bloc de mémoire. Elle retourne également la longueur maximale et la longueur actuelle. Lorsque vous avez terminé d’utiliser le pointeur, appelez IMFMediaBuffer::Unlock.
Pour écrire des données dans une mémoire tampon multimédia :
- Appelez IMFMediaBuffer::Lock pour obtenir un pointeur vers la mémoire. La méthode retourne également la longueur maximale de la mémoire tampon.
- Écrivez vos données dans la mémoire, jusqu’à la longueur maximale de la mémoire tampon.
- Appelez IMFMediaBuffer::SetCurrentLength pour mettre à jour la longueur actuelle. Définissez la longueur actuelle sur la quantité de données que vous avez écrite à l’étape 2.
- Appelez IMFMediaBuffer::Unlock pour déverrouiller la mémoire tampon.
Pour lire des données à partir d’une mémoire tampon multimédia :
- Appelez IMFMediaBuffer::Lock pour obtenir un pointeur vers la mémoire. La méthode retourne également la longueur actuelle de la mémoire tampon (la quantité de données valides dans la mémoire tampon).
- Lisez le contenu de la mémoire, jusqu’à la longueur actuelle.
- Appelez IMFMediaBuffer::Unlock pour déverrouiller la mémoire tampon.
Création de mémoires tampons système
La mémoire tampon système est une mémoire tampon multimédia qui gère un bloc de mémoire système. Pour créer une instance de cet objet, appelez MFCreateMemoryBuffer ou MFCreateAlignedMemoryBuffer et spécifiez une taille de mémoire tampon. Les deux fonctions allouent un bloc de mémoire et retournent un pointeur IMFMediaBuffer . La mémoire est automatiquement libérée lorsque le nombre de références de la mémoire tampon multimédia atteint zéro et que l’objet est détruit.
L’exemple suivant montre comment créer une mémoire tampon système et écrire dans la mémoire tampon.
HRESULT CreateSystemMemoryBuffer(
BYTE *pSrc,
DWORD cbData,
IMFMediaBuffer **ppBuffer
)
{
HRESULT hr = S_OK;
BYTE *pData = NULL;
IMFMediaBuffer *pBuffer = NULL;
// Create the media buffer.
hr = MFCreateMemoryBuffer(
cbData, // Amount of memory to allocate, in bytes.
&pBuffer
);
// Lock the buffer to get a pointer to the memory.
if (SUCCEEDED(hr))
{
hr = pBuffer->Lock(&pData, NULL, NULL);
}
if (SUCCEEDED(hr))
{
memcpy_s(pData, cbData, pSrc, cbData);
}
// Update the current length.
if (SUCCEEDED(hr))
{
hr = pBuffer->SetCurrentLength(cbData);
}
// Unlock the buffer.
if (pData)
{
hr = pBuffer->Unlock();
}
if (SUCCEEDED(hr))
{
*ppBuffer = pBuffer;
(*ppBuffer)->AddRef();
}
return hr;
}
Rubriques connexes