Trabajar con búferes multimedia (Microsoft Media Foundation)

En este tema se describe cómo usar la interfaz IMFMediaBuffer para acceder a los datos de un búfer multimedia. Todos los búferes multimedia exponen IMFMediaBuffer, que está diseñado para cualquier tipo de datos. Los fotogramas de vídeo sin comprimir son un caso especial, que se describe en el tema Búferes de vídeo sin comprimir.

Tamaño del búfer

Un búfer multimedia tiene dos tamaños asociados:

  • La longitud máxima es el tamaño físico de la memoria asignada para el búfer. Este valor se establece cuando se crea el búfer y no cambia durante la vigencia del búfer. La longitud máxima indica la cantidad de datos que se pueden almacenar en el búfer. Para encontrar el tamaño máximo, llame a IMFMediaBuffer::GetMaxLength.

  • La longitud actual es la cantidad de datos válidos que se encuentran actualmente en el búfer. Cuando se asigna por primera vez el búfer, la longitud actual es cero, porque no hay datos válidos en el búfer. Si escribe datos en el búfer, debe actualizar la longitud actual llamando a IMFMediaBuffer::SetCurrentLength. Por ejemplo, si escribe 100 bytes de datos en el búfer, llame a SetCurrentLength con el valor 100. Si lee datos de un búfer multimedia, llame a IMFMediaBuffer::GetCurrentLength para averiguar la cantidad de datos que hay actualmente en el búfer. No lea más allá de la longitud actual. La longitud actual nunca puede superar la longitud máxima del búfer.

Acceso a la memoria del búfer

Para acceder a la memoria del búfer, llame a IMFMediaBuffer::Lock. Este método devuelve un puntero al inicio del bloque de memoria. También devuelve la longitud máxima y la longitud actual. Cuando haya terminado de usar el puntero, llame a IMFMediaBuffer::Unlock.

Para escribir datos en un búfer multimedia:

  1. Llame a IMFMediaBuffer::Lock para obtener un puntero a la memoria. El método también devuelve la longitud máxima del búfer.
  2. Escriba los datos en la memoria, hasta la longitud máxima del búfer.
  3. Llame a IMFMediaBuffer::SetCurrentLength para actualizar la longitud actual. Establezca la longitud actual igual a la cantidad de datos que escribió en el paso 2.
  4. Llame a IMFMediaBuffer::Unlock para desbloquear el búfer.

Para leer datos de un búfer multimedia:

  1. Llame a IMFMediaBuffer::Lock para obtener un puntero a la memoria. El método también devuelve la longitud actual del búfer (la cantidad de datos válidos en el búfer).
  2. Lea el contenido de la memoria, hasta la longitud actual.
  3. Llame a IMFMediaBuffer::Unlock para desbloquear el búfer.

Creación de búferes de memoria del sistema

El búfer de memoria del sistema es un búfer multimedia que administra un bloque de memoria del sistema. Para crear una instancia de este objeto, llame a MFCreateMemoryBuffer o MFCreateAlignedMemoryBuffer y especifique un tamaño de búfer. Ambas funciones asignan un bloque de memoria y devuelven un puntero IMFMediaBuffer . La memoria se libera automáticamente cuando el recuento de referencias del búfer multimedia alcanza cero y el objeto se destruye.

En el ejemplo siguiente se muestra cómo crear un búfer de memoria del sistema y escribir en el búfer.

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

Búferes multimedia

API de media Foundation Platform