Share via


Arbeiten mit Medienpuffern (Microsoft Media Foundation)

In diesem Thema wird beschrieben, wie Sie mithilfe der IMFMediaBuffer-Schnittstelle auf die Daten in einem Medienpuffer zugreifen. Alle Medienpuffer machen IMFMediaBuffer verfügbar, das für jeden Datentyp konzipiert ist. Unkomprimierte Videoframes sind ein Sonderfall, der im Thema Unkomprimierte Videopuffer beschrieben wird.

Puffergröße

Einem Medienpuffer sind zwei Größen zugeordnet:

  • Die maximale Länge ist die physische Größe des Arbeitsspeichers, der dem Puffer zugeordnet ist. Dieser Wert wird festgelegt, wenn der Puffer erstellt wird, und ändert sich während der Lebensdauer des Puffers nicht. Die maximale Länge gibt an, wie viele Daten im Puffer gespeichert werden können. Um die maximale Größe zu ermitteln, rufen Sie IMFMediaBuffer::GetMaxLength auf.

  • Die aktuelle Länge ist die Menge gültiger Daten, die sich derzeit im Puffer befinden. Wenn der Puffer zum ersten Mal zugeordnet wird, ist die aktuelle Länge 0 (null), da im Puffer keine gültigen Daten vorhanden sind. Wenn Sie Daten in den Puffer schreiben, müssen Sie die aktuelle Länge aktualisieren, indem Sie IMFMediaBuffer::SetCurrentLength aufrufen. Wenn Sie beispielsweise 100 Byte Daten in den Puffer schreiben, rufen Sie SetCurrentLength mit dem Wert 100 auf. Wenn Sie Daten aus einem Medienpuffer lesen, rufen Sie IMFMediaBuffer::GetCurrentLength auf, um herauszufinden, wie viele Daten sich derzeit im Puffer befinden. Lesen Sie nicht über die aktuelle Länge. Die aktuelle Länge darf niemals die maximale Länge des Puffers überschreiten.

Zugreifen auf den Pufferspeicher

Um auf den Arbeitsspeicher im Puffer zuzugreifen, rufen Sie IMFMediaBuffer::Lock auf. Diese Methode gibt einen Zeiger auf den Anfang des Speicherblocks zurück. Außerdem werden die maximale Länge und die aktuelle Länge zurückgegeben. Wenn Sie mit dem Zeiger fertig sind, rufen Sie IMFMediaBuffer::Unlock auf.

So schreiben Sie Daten in einen Medienpuffer:

  1. Rufen Sie IMFMediaBuffer::Lock auf, um einen Zeiger auf den Arbeitsspeicher zu erhalten. Die -Methode gibt auch die maximale Länge des Puffers zurück.
  2. Schreiben Sie Ihre Daten bis zur maximalen Länge des Puffers in den Arbeitsspeicher.
  3. Rufen Sie IMFMediaBuffer::SetCurrentLength auf, um die aktuelle Länge zu aktualisieren. Legen Sie die aktuelle Länge auf die Datenmenge fest, die Sie in Schritt 2 geschrieben haben.
  4. Rufen Sie IMFMediaBuffer::Unlock auf, um den Puffer zu entsperren.

So lesen Sie Daten aus einem Medienpuffer:

  1. Rufen Sie IMFMediaBuffer::Lock auf, um einen Zeiger auf den Arbeitsspeicher zu erhalten. Die -Methode gibt auch die aktuelle Länge des Puffers (die Menge der gültigen Daten im Puffer) zurück.
  2. Liest den Inhalt des Arbeitsspeichers bis zur aktuellen Länge.
  3. Rufen Sie IMFMediaBuffer::Unlock auf, um den Puffer zu entsperren.

Erstellen von Systemspeicherpuffern

Der Systemspeicherpuffer ist ein Medienpuffer, der einen Block des Systemspeichers verwaltet. Um eine instance dieses Objekts zu erstellen, rufen Sie MFCreateMemoryBuffer oder MFCreateAlignedMemoryBuffer auf, und geben Sie eine Puffergröße an. Beide Funktionen weisen einen Speicherblock zu und geben einen IMFMediaBuffer-Zeiger zurück. Der Arbeitsspeicher wird automatisch freigegeben, wenn die Verweisanzahl des Medienpuffers null erreicht und das Objekt zerstört wird.

Das folgende Beispiel zeigt, wie Sie einen Systemspeicherpuffer erstellen und in den Puffer schreiben.

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

Medienpuffer

Media Foundation Platform-APIs