Freigeben über


Verarbeiten von Daten in einer DMO

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation abgelöst. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code mediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, so umgeschrieben wird, dass nach Möglichkeit die neuen APIs verwendet werden.]

In diesem Abschnitt wird erläutert, wie Sie einen Datenstrom mithilfe eines DMO verarbeiten. Die in diesem Abschnitt aufgeführten Schritte sind das Standardverhalten. Alle DMOs müssen die hier beschriebenen Methoden unterstützen. Diese Methoden verwenden separate Puffer für Eingabe und Ausgabe. Einige DMOs unterstützen auch die direkte Verarbeitung mithilfe eines einzelnen Puffers. Weitere Informationen zur direkten Verarbeitung finden Sie unter Direkte Verarbeitung.

Zuweisen von Puffern

Der Client ist für die gesamte Pufferzuordnung verantwortlich. Nachdem Sie die Medientypen auf dem DMO festgelegt haben, fragen Sie die DMO nach den Pufferanforderungen jedes Datenstroms ab. Diese können sich je nach Medientyp ändern. Rufen Sie für jeden Stream die IMediaObject::GetInputSizeInfo - oder IMediaObject::GetOutputSizeInfo-Methode auf. Diese Methoden geben die folgenden Informationen zurück:

  • Minimale Puffergröße in Byte.
  • Ausrichtungsanforderungen, falls vorhanden. Ein Puffer wird ausgerichtet, wenn die Startadresse ein Vielfaches einer angegebenen ganzen Zahl ist.
  • Die maximale Datenmenge, die der DMO für Lookahead enthält. Diese Zahl gilt nur für Eingabedatenströme. Für einige Arten von Daten (z. B. MPEG-Codierung) muss ein DMO möglicherweise im Stream vorausschauen. Der Lookahead-Wert gibt an, wie viele Eingabedaten das DMO benötigt, bevor die Ausgabe erzeugt werden kann.

Der Client muss Puffer zuordnen, die diesen Anforderungen entsprechen. Darüber hinaus kann die DMO Anforderungen darüber haben, wie der Client die Eingabedaten verpackt. Die DMO kann z. B. verlangen, dass jeder Puffer genau ein Beispiel (oder Videoframe) enthält. Um diese Anforderungen zu ermitteln, rufen Sie die IMediaObject::GetInputStreamInfo-Methode auf. Die IMediaObject::GetOutputStreamInfo-Methode gibt ähnliche Informationen zu einem Ausgabedatenstrom zurück.

Im Standardstreamingmodell übergibt der Client keine rohen Pufferzeiger an die DMO. Stattdessen wird ein einfaches COM-Objekt verwendet, das die IMediaBuffer-Schnittstelle verfügbar macht. Die IMediaBuffer-Schnittstelle fungiert als COM-Wrapper für einen Speicherblock. Da es sich um ein COM-Objekt handelt, unterstützt es die Verweiszählung, wodurch sichergestellt wird, dass Puffer nicht freigegeben werden, während sie noch verwendet werden.

Hinweis

Die IMediaBuffer-Schnittstelle dient einer Funktion ähnlich der IMediaSample-Schnittstelle in DirectShow.

 

Der Client muss das IMediaBuffer-Objekt implementieren. Weitere Informationen finden Sie unter Implementieren von IMediaBuffer.

Verarbeiten der Daten

Gehen Sie wie folgt vor, um Daten zu verarbeiten:

  1. Füllen Sie für jeden Eingabestream einen Puffer mit Eingabedaten.
  2. Rufen Sie IMediaObject::P rocessInput auf, um die einzelnen Puffer bereitzustellen.
  3. Rufen Sie IMediaObject::P rocessOutput auf, um die Daten zu verarbeiten. Diese Methode verwendet ein Array von Puffern, einen für jeden Ausgabedatenstrom.
  4. Wiederholen Sie den Vorgang, bis keine Eingabedaten mehr vorhanden sind.

Die ProcessInput-Methode akzeptiert Eingaben für jeweils einen Stream. In der Regel gibt die Methode sofort zurück, und die DMO enthält eine Verweisanzahl für das IMediaBuffer-Objekt . Das Objekt wird freigegeben, nachdem alle Daten im Puffer verarbeitet wurden oder wenn die Anwendung den DMO leert. Verwenden Sie einen Puffer erst wieder, wenn der DMO ihn freigegeben hat. Rufen Sie die IMediaObject::GetInputStatus-Methode auf, um zu bestimmen, ob ein Eingabedatenstrom mehr Daten akzeptieren kann. Diese Methode gibt das DMO_INPUT_STATUSF_ACCEPT_DATA-Flag zurück, wenn der Stream mehr Eingaben akzeptieren kann.

Die ProcessOutput-Methode generiert eine Ausgabe für alle Ausgabedatenströme gleichzeitig. Die Anwendung übergibt ein Array von DMO_OUTPUT_DATA_BUFFER Strukturen, eine für jeden Ausgabestream. Jede Struktur im Array verfügt über einen Zeiger auf ein IMediaBuffer-Objekt . Der DMO schreibt so viele Ausgabedaten wie möglich in die Puffer. Außerdem werden verschiedene Flags festgelegt, um die status des Vorgangs zu melden. Das flag DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE gibt an, dass der DMO mehr Ausgaben aus der vorhandenen Eingabe erzeugen kann. In diesem Fall kann der Client ProcessOutput erneut aufrufen. Andernfalls sollte ProcessInput mit weiteren Eingabedaten aufgerufen werden. Die DMO ändert niemals die Daten in den Eingabepuffern. Es schreibt nur in die Ausgabepuffer.

Nachdem Sie alle Daten an einen Eingabedatenstrom übermittelt haben, rufen Sie die IMediaObject::D iscontinuity-Methode auf. Die DMO akzeptiert keine weiteren Eingaben für diesen Stream, bis Sie die verbleibende Ausgabe verarbeiten (oder die DMO leeren).

Zu jedem Zeitpunkt nach Beginn des Streamings kann der DMO Eingaben empfangen oder ausgaben oder beides. Daher gibt Entweder GetInputStatus DMO_INPUT_STATUSF_ACCEPT_DATA oder ProcessOutput DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE zurück. Die Anwendung behält den Datenfluss bei, indem sie auf diese Flags testet und entsprechend ProcessInput oder ProcessOutput aufruft. Um den Datenfluss zu unterbrechen, rufen Sie die IMediaObject::Flush-Methode auf. Diese Methode bewirkt, dass der DMO alle Puffer verwirft, die er intern enthält.

Direktes Hosten einer DMO

Direkte Verarbeitung