Arbeiten mit MFT-Medienpuffern und -beispielen
Codec-MFTs übergeben Mediendaten mithilfe von Medienpuffern und -beispielen hin und her.
Ein Medienpuffer ist ein COM-Objekt, das einen Speicherblock verwaltet, der in der Regel Mediendaten enthält. Wenn Daten an oder aus einem MFT übergeben werden, werden sie immer in Form eines Medienpuffers übergeben.
Alle Medienpuffer machen die IMFMediaBuffer-Schnittstelle verfügbar. Diese Schnittstelle ist für jeden Datentyp konzipiert. Puffer, die Videodaten enthalten, machen häufig auch IMF2DBuffer verfügbar.
Ein Medienpuffer hat eine maximale Größe, d. h. die Menge des für den Puffer zugewiesenen Arbeitsspeichers. Um die maximale Größe zu ermitteln, rufen Sie IMFMediaBuffer::GetMaxLength auf. Zu jedem Zeitpunkt hat ein Medienpuffer auch eine aktuelle Länge, d. h. die Menge der gültigen Daten im Puffer, die von null Bytes bis zur maximalen Größe reicht. Rufen Sie zum Abrufen der aktuellen Länge IMFMediaBuffer::GetCurrentLength auf. Wenn der Puffer erstellt wird, ist die aktuelle Länge null. Wenn Sie Daten in den Puffer schreiben, rufen Sie IMFMediaBuffer::SetCurrentLength auf, um die aktuelle Länge zu aktualisieren.
Um auf den Arbeitsspeicher im Puffer zuzugreifen, rufen Sie IMFMediaBuffer::Lock auf. Diese Methode gibt einen Zeiger auf den Anfang des Speicherblocks zurück. Wenn Sie mit dem Zeiger fertig sind, rufen Sie IMFMediaBuffer::Unlock auf. Die Lock-Methode ist kein Threadsynchronisierungsmechanismus. Sie garantiert nicht, dass andere Threads nicht auf den Puffer zugreifen können. Die Lock-Methode wird verwendet, um sicherzustellen, dass der Arbeitsspeicher, auf den zugegriffen wird, gültig bleibt, bis Sie die Unlock-Methode aufrufen.
Ein Medienbeispielobjekt (im Kontext des Media Foundation SDK) ist ein Objekt, das eine sortierte Liste von 0 oder mehr Puffern enthält. Medienbeispiele machen die IMFSample-Schnittstelle verfügbar.
Um ein neues Beispiel zu erstellen, rufen Sie die MFCreateSample-Funktion auf. Anfangs ist die Pufferliste des Beispiels leer. Um am Ende der Liste einen Puffer hinzuzufügen, rufen Sie IMFSample::AddBuffer auf.
Zugehörige Themen