Sdílet prostřednictvím


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í:

  1. Zavolejte IMFMediaBuffer::Lock k získání ukazatele na paměť. Metoda vrátí také maximální délku vyrovnávací paměti.
  2. Zapište data do paměti až do maximální délky vyrovnávací paměti.
  3. 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.
  4. Zavolejte IMFMediaBuffer::Unlock pro odemčení vyrovnávací paměti.

Číst data z datového bufferu médií:

  1. 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).
  2. Přečtěte si obsah paměti až do aktuální délky.
  3. 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;
}

vyrovnávací paměti médií

rozhraní API platformy Media Foundation