Bekerja dengan Buffer Media (Microsoft Media Foundation)

Topik ini menjelaskan cara menggunakan antarmuka IMFMediaBuffer untuk mengakses data dalam buffer media. Semua buffer media mengekspos IMFMediaBuffer, yang dirancang untuk semua jenis data. Bingkai video yang tidak dikompresi adalah kasus khusus, yang dijelaskan dalam topik Buffer Video Yang Tidak Dikompresi.

Ukuran Buffer

Buffer media memiliki dua ukuran yang terkait dengannya:

  • Panjang maksimum adalah ukuran fisik memori yang dialokasikan untuk buffer. Nilai ini diatur ketika buffer dibuat dan tidak berubah selama masa pakai buffer. Panjang maksimum menunjukkan berapa banyak data yang dapat disimpan dalam buffer. Untuk menemukan ukuran maksimum, panggil IMFMediaBuffer::GetMaxLength.

  • Panjang saat ini adalah jumlah data valid yang saat ini berada di buffer. Ketika buffer pertama kali dialokasikan, panjang saat ini adalah nol, karena tidak ada data yang valid dalam buffer. Jika Anda menulis data apa pun ke buffer, Anda harus memperbarui panjang saat ini dengan memanggil IMFMediaBuffer::SetCurrentLength. Misalnya, jika Anda menulis 100 byte data ke dalam buffer, panggil SetCurrentLength dengan nilai 100. Jika Anda membaca data dari buffer media, panggil IMFMediaBuffer::GetCurrentLength untuk mengetahui berapa banyak data yang saat ini ada di buffer. Jangan membaca melewati panjang saat ini. Panjang saat ini tidak pernah dapat melebihi panjang maksimum buffer.

Mengakses Memori Buffer

Untuk mengakses memori di buffer, panggil IMFMediaBuffer::Lock. Metode ini mengembalikan penunjuk ke awal blok memori. Ini juga mengembalikan panjang maksimum dan panjang saat ini. Bila Anda sudah selesai menggunakan penunjuk, panggil IMFMediaBuffer::Unlock.

Untuk menulis data ke dalam buffer media:

  1. Panggil IMFMediaBuffer::Lock untuk mendapatkan pointer ke memori. Metode ini juga mengembalikan panjang maksimum buffer.
  2. Tulis data Anda ke dalam memori, hingga panjang maksimum buffer.
  3. Panggil IMFMediaBuffer::SetCurrentLength untuk memperbarui panjang saat ini. Atur panjang saat ini sama dengan jumlah data yang Anda tulis di langkah 2.
  4. Panggil IMFMediaBuffer::Buka kunci untuk membuka kunci buffer.

Untuk membaca data dari buffer media:

  1. Panggil IMFMediaBuffer::Lock untuk mendapatkan pointer ke memori. Metode ini juga mengembalikan panjang buffer saat ini (jumlah data yang valid dalam buffer).
  2. Baca isi memori, hingga panjang saat ini.
  3. Panggil IMFMediaBuffer::Buka kunci untuk membuka kunci buffer.

Membuat Buffer Memori Sistem

Buffer memori sistem adalah buffer media yang mengelola blok memori sistem. Untuk membuat instans objek ini, panggil MFCreateMemoryBuffer atau MFCreateAlignedMemoryBuffer dan tentukan ukuran buffer. Kedua fungsi mengalokasikan blok memori dan mengembalikan penunjuk IMFMediaBuffer . Memori secara otomatis dirilis ketika jumlah referensi buffer media mencapai nol dan objek dihancurkan.

Contoh berikut menunjukkan cara membuat buffer memori sistem dan menulis ke buffer.

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;
}

Buffer Media

API Platform Media Foundation