Aushandeln von Zuteilungen

[Das dieser Seite zugeordnete Feature DirectShow ist ein Legacyfeature. Es wurde durch MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation ersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code nach Möglichkeit MediaPlayer, IMFMediaEngine und Audio/Video Capture in Media Foundation anstelle von DirectShow verwendet. Microsoft schlägt vor, vorhandenen Code, der die Legacy-APIs verwendet, um nach Möglichkeit die neuen APIs zu verwenden.]

Wenn zwei Pins verbunden sind, benötigen sie einen Mechanismus für den Austausch von Mediendaten. Dieser Mechanismus wird als Transport bezeichnet. Im Allgemeinen ist die DirectShow-Architektur neutral zu Transporten. Zwei Filter können zustimmen, eine Verbindung mit jedem Transport herzustellen, der von beiden unterstützt wird.

Der häufigste Transport ist der lokale Speichertransport, bei dem sich die Mediendaten in Standard Arbeitsspeicher befinden. Es gibt zwei Varianten des lokalen Speichertransports: das Pushmodell und das Pullmodell. Im Pushmodell pusht der Quellfilter Daten an den Downstreamfilter, wobei die IMemInputPin-Schnittstelle auf dem Eingabenadel des Downstreamfilters verwendet wird. Im Pullmodell fordert der downstream-Filter Daten aus dem Quellfilter an, wobei die IAsyncReader-Schnittstelle auf dem Ausgabepin des Quellfilters verwendet wird. Weitere Informationen zu diesen beiden Datenflussmodellen finden Sie unter Datenfluss im Filterdiagramm.

Beim lokalen Speichertransport wird das Objekt, das für die Zuweisung von Speicherpuffern verantwortlich ist, als Allocator bezeichnet. Ein Allocator unterstützt die IMemAllocator-Schnittstelle . Beide Pins teilen sich einen einzelnen Zuteilungsgeber. Beide Pins können einen Zuteilungsgeber bereitstellen, aber der Ausgabepin wählt den zu verwendenden Zuteilungsgeber aus.

Der Ausgabenadel legt auch die Zuteilungseigenschaften fest, die bestimmen, wie viele Puffer vom Zuteilungsgeber erstellt werden, die Größe der einzelnen Puffer und die Speicherausrichtung. Der Ausgabenadel kann für die Pufferanforderungen auf den Eingabenadel verschoben werden.

In einer IMemInputPin-Verbindung funktioniert die Zuordnungsverhandlung wie folgt:

  1. Optional ruft der Ausgabenadel IMemInputPin::GetAllocatorRequirements auf. Diese Methode ruft die Pufferanforderungen des Eingabenadels ab, z. B. die Speicherausrichtung. Im Allgemeinen sollte der Ausgabenadel die Anforderung des Eingabenadels berücksichtigen, es sei denn, es gibt einen guten Grund dafür.
  2. Optional ruft der Ausgabenadel IMemInputPin::GetAllocator auf. Diese Methode fordert einen Zuteilungsgeber vom Eingabenadel an. Der Eingabenadel stellt einen oder gibt einen Fehlercode zurück.
  3. Der Ausgabenadel wählt einen Zuteilungsstift aus. Es kann eine vom Eingabenadel bereitgestellte verwenden oder eine eigene erstellen.
  4. Der Ausgabenadel ruft IMemAllocator::SetProperties auf, um die Zuordnungseigenschaften festzulegen. Der Zuweisungsgeber berücksichtigt jedoch möglicherweise nicht die angeforderten Eigenschaften. (Dies kann beispielsweise der Fall sein, wenn der Eingabenadel den Zuteilungsgeber bereitstellt.) Der Zuteilungsgeber gibt die tatsächlichen Eigenschaften als Ausgabeparameter in der SetProperties-Methode zurück.
  5. Der Outpin ruft IMemInputPin::NotifyAllocator auf, um den Eingabenadel der Auswahl zu informieren.
  6. Der Eingabenadel sollte IMemAllocator::GetProperties aufrufen, um zu überprüfen, ob die Zuordnungseigenschaften akzeptabel sind.
  7. Der Ausgabenadel ist für das Commit und Aufheben der Zuweisung verantwortlich. Dies tritt auf, wenn das Streaming gestartet und beendet wird.

In einer IAsyncReader-Verbindung funktioniert die Zuordnungsverhandlung wie folgt:

  1. Der Eingabenadel ruft IAsyncReader::RequestAllocator am Ausgabenadel auf. Der Eingabenadel gibt die Pufferanforderungen an und stellt optional einen Zuteilungsgeber bereit.
  2. Der Ausgabenadel wählt einen Zuteilungsstift aus. Es kann die vom Eingabenadel bereitgestellte verwenden, falls vorhanden, oder eine eigene erstellen.
  3. Der Ausgabenadel gibt den Zuteilungsgeber als ausgehenden Parameter in der RequestAllocator-Methode zurück. Der Eingabenadel sollte die Zuordnungseigenschaften überprüfen.
  4. Der Eingabenadel ist für das Commit und Aufheben der Zuweisung verantwortlich.
  5. Während des Aushandlungsprozesses für die Zuordnung kann bei beiden Pins jederzeit ein Fehler bei der Verbindung auftreten.
  6. Wenn der Ausgabepin den Zuteilungsgeber des Eingabenadels verwendet, kann er diese Zuweisung nur verwenden, um Beispiele an diesen Eingabenadel zu übermitteln. Der Besitzerfilter darf nicht den Zuteilungsgeber verwenden, um Beispiele an andere Pins zu übermitteln.

Bereitstellen einer benutzerdefinierten Zuordnung