Arbeta med mediebuffertar (Microsoft Media Foundation)
Det här avsnittet beskriver hur du använder IMFMediaBuffer-gränssnittet för att komma åt data i en mediebuffert. Alla mediebuffertar exponerar IMFMediaBuffer, som är avsedd för vilken typ av data som helst. Okomprimerade videoramar är ett specialfall som beskrivs i avsnittet okomprimerade videobuffertar.
Buffertstorlek
En mediebuffert har två storlekar som är associerade med den:
Den maximala längden är den fysiska storleken på det minne som allokeras för bufferten. Det här värdet anges när bufferten skapas och ändras inte under buffertens livslängd. Den maximala längden anger hur mycket data som kan lagras i bufferten. Om du vill hitta den maximala storleken anropar du IMFMediaBuffer::GetMaxLength.
Den aktuella längden är mängden giltiga data som för närvarande finns i bufferten. När bufferten först allokeras är den aktuella längden noll, eftersom det inte finns några giltiga data i bufferten. Om du skriver data till bufferten måste du uppdatera den aktuella längden genom att anropa IMFMediaBuffer::SetCurrentLength. Om du till exempel skriver 100 byte data till bufferten anropar du SetCurrentLength med värdet 100. Om du läser data från en mediebuffert anropar du IMFMediaBuffer::GetCurrentLength för att ta reda på hur mycket data som för närvarande finns i bufferten. Läs inte förbi den aktuella längden. Den aktuella längden får aldrig överskrida buffertens maximala längd.
Komma åt buffertminnet
Om du vill komma åt minnet i bufferten anropar du IMFMediaBuffer::Lås. Den här metoden returnerar en pekare till början av minnesblocket. Den returnerar också den maximala längden och den aktuella längden. När du är klar med pekaren anropar du IMFMediaBuffer::Unlock.
Så här skriver du data till en mediebuffert:
- Anropa IMFMediaBuffer::Lock för att få en pekare till minnet. Metoden returnerar också buffertens maximala längd.
- Skriv dina data till minnet, upp till buffertens maximala längd.
- Anropa IMFMediaBuffer::SetCurrentLength för att uppdatera den aktuella längden. Ange den aktuella längden lika med mängden data som du skrev i steg 2.
- Ring IMFMediaBuffer::Lås upp för att låsa upp bufferten.
Så här läser du data från en mediebuffert:
- Anropa IMFMediaBuffer::Lock för att få en pekare till minnet. Metoden returnerar också buffertens aktuella längd (mängden giltiga data i bufferten).
- Läs innehållet i minnet, upp till aktuell längd.
- Ring IMFMediaBuffer::Lås upp för att låsa upp bufferten.
Skapa systemminnesbuffertar
Systemminnesbufferten är en mediebuffert som hanterar ett block med systemminne. Om du vill skapa en instans av det här objektet anropar du MFCreateMemoryBuffer eller MFCreateAlignedMemoryBuffer och anger en buffertstorlek. Båda funktionerna allokerar ett minnesblock och returnerar en IMFMediaBuffer pekare. Minnet frigörs automatiskt när mediebuffertens referensantal når noll och objektet förstörs.
I följande exempel visas hur du skapar en systemminnesbuffert och skriver till bufferten.
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;
}
Relaterade ämnen