Práce s vyrovnávacími paměťmi médií (Microsoft Media Foundation)
Toto téma popisuje, jak používat rozhraní IMFMediaBuffer pro přístup k datům ve vyrovnávací paměti médií. Všechny vyrovnávací paměti médií zveřejňují MMFMediaBuffer, který je určen pro jakýkoli typ dat. Nekomprimované video snímky jsou speciálním případem, který je popsán v tématu Nekomprimované video buffery.
Velikost vyrovnávací paměti
Vyrovnávací paměť médií má dvě přidružené velikosti:
maximální délka představuje fyzickou velikost paměti, která je přidělena vyrovnávací paměti. Tato hodnota se nastaví při vytvoření vyrovnávací paměti a během životnosti vyrovnávací paměti se nezmění. Maximální délka udává, kolik dat lze uložit do vyrovnávací paměti. K určení maximální velikosti použijte IMFMediaBuffer::GetMaxLength.
aktuální délka je množství platných dat, která jsou aktuálně v bufferu. Při prvním přidělení vyrovnávací paměti je aktuální délka nula, protože v vyrovnávací paměti nejsou platná data. Pokud zapíšete data do bufferu, musíte aktualizovat aktuální délku voláním IMFMediaBuffer::SetCurrentLength. Pokud například do vyrovnávací paměti zapíšete 100 bajtů dat, zavolejte SetCurrentLength s hodnotou 100. Pokud čtete data z vyrovnávací paměti médií, zavolejte IMFMediaBuffer::GetCurrentLength, abyste zjistili, kolik dat je aktuálně ve vyrovnávací paměti. Nepřekračujte aktuální délku čtení. Aktuální délka nesmí překročit maximální délku vyrovnávací paměti.
Přístup k vyrovnávací paměti
Chcete-li získat přístup k paměti ve vyrovnávací paměti, zavolejte IMFMediaBuffer::Lock. Tato metoda vrátí ukazatel na začátek bloku paměti. Vrátí také maximální délku a aktuální délku. Až skončíte s používáním ukazatele, zavolejte IMFMediaBuffer::Unlock.
Zápis dat do vyrovnávací paměti médií:
- Zavolejte IMFMediaBuffer::Lock k získání ukazatele na paměť. Metoda vrátí také maximální délku vyrovnávací paměti.
- Zapište data do paměti až do maximální délky vyrovnávací paměti.
- Volání IMFMediaBuffer::SetCurrentLength pro aktualizaci aktuální délky. Nastavte aktuální délku rovnu množství dat, která jste napsali v kroku 2.
- Zavolejte IMFMediaBuffer::Unlock pro odemčení vyrovnávací paměti.
Číst data z datového bufferu médií:
- Chcete-li volat IMFMediaBuffer::Lock, je nutné získat ukazatel na paměť. Metoda také vrátí aktuální délku vyrovnávací paměti (množství platných dat ve vyrovnávací paměti).
- Přečtěte si obsah paměti až do aktuální délky.
- Zavolejte IMFMediaBuffer::Unlock k odemknutí vyrovnávací paměti.
Vytváření vyrovnávacích pamětí systému
Systémová vyrovnávací paměť je mediální vyrovnávací paměť, která spravuje blok systémové paměti. Chcete-li vytvořit instanci tohoto objektu, zavolejte MFCreateMemoryBuffer nebo MFCreateAlignedMemoryBuffer a zadejte velikost vyrovnávací paměti. Obě funkce přidělují blok paměti a vracejí IMFMediaBuffer ukazatel. Paměť se automaticky uvolní, když referenční počet vyrovnávací paměti média dosáhne nuly a objekt je zničen.
Následující příklad ukazuje, jak vytvořit vyrovnávací paměť systému a zapisovat do vyrovnávací paměti.
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;
}
Související témata