Utilisation des exemples de supports
Cette rubrique explique comment utiliser l’interface IMFSample pour manipuler des exemples d’objets multimédias. Pour obtenir une vue d’ensemble générale des exemples de supports, consultez Media Samples.
Pour créer un nouvel exemple de support, appelez la fonction MFCreateSample . Initialement, la liste de mémoires tampons de l’exemple est vide. Pour ajouter une mémoire tampon à la fin de la liste, appelez IMFSample :: AddBuffer.
Le code suivant montre comment créer un exemple et y ajouter une mémoire tampon.
HRESULT CreateMediaSample(DWORD cbData, IMFSample **ppSample)
{
HRESULT hr = S_OK;
IMFSample *pSample = NULL;
IMFMediaBuffer *pBuffer = NULL;
hr = MFCreateSample(&pSample);
if (SUCCEEDED(hr))
{
hr = MFCreateMemoryBuffer(cbData, &pBuffer);
}
if (SUCCEEDED(hr))
{
hr = pSample->AddBuffer(pBuffer);
}
if (SUCCEEDED(hr))
{
*ppSample = pSample;
(*ppSample)->AddRef();
}
SafeRelease(&pSample);
SafeRelease(&pBuffer);
return hr;
}
La méthode recommandée pour récupérer les mémoires tampons à partir de l’exemple consiste à appeler IMFSample :: ConvertToContiguousBuffer. Cette méthode retourne une seule mémoire tampon continguous.
Pour itérer au sein des mémoires tampons de la liste, commencez par appeler IMFSample :: GetBufferCount. Cette méthode retourne le nombre de mémoires tampons. Appelez ensuite IMFSample :: GetBufferByIndex et spécifiez l’index de la mémoire tampon à récupérer. Les mémoires tampons sont indexées à partir de zéro.
Le code suivant montre comment itérer au sein des mémoires tampons dans un exemple.
IMFMediaBuffer *pBuffer = NULL;
DWORD cBuffers = 0;
hr = pSample->GetBufferCount(&cBuffers);
if (SUCCEEDED(hr))
{
for (DWORD i = 0; i < cBuffers; i++)
{
hr = pSample->GetBufferByIndex(i, &pBuffer);
// Use buffer (not shown).
SafeRelease(&pBuffer);
if (FAILED(hr))
{
break;
}
}
}
Les exemples ont un horodatage et une durée. L’horodatage indique le moment où les données de l’exemple doivent être rendues, par rapport à l’horloge de présentation. La durée correspond à la durée pendant laquelle les données doivent être rendues. En général, le composant qui génère les données définit l’horodatage et la durée initiaux. Ces valeurs peuvent être modifiées par la session multimédia. Pour définir l’horodatage, appelez IMFSample :: SetSampleTime. Pour définir la durée, appelez IMFSample :: SetSampleDuration.
Les exemples peuvent également avoir des attributs, qui contiennent des informations supplémentaires sur l’exemple. Pour obtenir la liste des exemples d’attributs, consultez exemples d’attributs. Pour définir et récupérer des attributs, utilisez l' interface IMFAttributes, qui hérite de IMFSample .