Freigeben über


CTransInPlaceFilter-Klasse

[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.]

ctransinplacefilter-Klassenhierarchie

Die CTransInPlaceFilter -Klasse ist für direkte Transformationsfilter konzipiert, bei denen es sich um Filter handelt, die die Eingabedaten ändern, anstatt die Daten pufferübergreifend zu kopieren. Um diese Klasse zu verwenden, leiten Sie eine neue Klasse von ab CTransInPlaceFilter , und implementieren Sie die folgenden Methoden:

Diese Klasse verwendet die CTransInPlaceInputPin-Klasse als Eingabenadel und die CTransInPlaceOutputPin-Klasse für den Ausgabepin. In der Regel müssen Sie diese Pinklassen nicht überschreiben. Der Filter erstellt beide Pins in der CTransInPlaceFilter::GetPin-Methode . Wenn Sie die Pinklassen überschreiben, müssen Sie GetPin überschreiben, um Ihre benutzerdefinierten Pins zu erstellen.

Diese Klasse ist so konzipiert, dass der Eingabetyp immer mit dem Ausgabetyp übereinstimmt. Wenn möglich, verwendet der Filter für beide Pinverbindungen einen einzelnen Allocator.

Bevorzugte Medientypen

Wenn der Ausgabepin bereits angeschlossen ist, bietet der Eingabepin die bevorzugten Typen des Downstreamfilters. (Tatsächlich wird einfach das Enumeratorobjekt des nachgeschalteten Filters zurückgegeben.) Andernfalls werden keine bevorzugten Typen verwendet. Der Ausgabepin hat das gleiche Verhalten, aber umgekehrt: Wenn der Eingabestift bereits verbunden ist, bietet der Ausgabepin die bevorzugten Typen des Upstream Filters. Andernfalls hat er keine bevorzugten Typen.

Anheften von Verbindungen

Wenn ein Pin eine Verbindung herstellt, verbindet der Filter im Allgemeinen den anderen Pin erneut, um sicherzustellen, dass beide Pins denselben Medientyp und denselben Zuweisungstyp verwenden. (Der Mechanismus zum erneuten Verbinden von Pins wird unter Erneutes Verbinden von Pins beschrieben.) Zwei Szenarien sind möglich: Entweder wird zuerst der Eingabepin verbunden, oder der Ausgabepin wird zuerst verbunden.

Angenommen, der Eingabenadel stellt zuerst eine Verbindung her. Dabei werden die folgenden Schritte ausgeführt:

  1. Der Eingabenadel ruft die CheckInputType-Methode des Filters auf, um den Medientyp zu überprüfen.
  2. Der Upstream Filter wählt eine Zuweisung aus. An diesem Punkt hat der Eingabestift keine Zuweisungsanforderungen und akzeptiert jede Zuweisung für die Verbindung. Wenn der Upstream Filter eine Zuweisung anfordert, erstellt der Pin einen neuen. Aus den in Kürze beschriebenen Gründen wird diese Zuweisung nicht in der endgültigen Verbindung verwendet. Sie wird nur bereitgestellt, um diese Phase des Verbindungsprozesses abzuschließen.

Später, wenn der Ausgabepin eine Verbindung herstellt:

  1. Der Ausgabepin ruft die CheckInputType-Methode des Filters auf, um den Medientyp zu überprüfen. Außerdem wird IPin::QueryAccept für den Upstream Filter aufgerufen. Dadurch wird sichergestellt, dass der Eingabenadel seinen Medientyp entsprechend ändern kann.
  2. Der Ausgabepin ruft die CheckInputType-Methode des Filters auf, um den Medientyp zu überprüfen. Außerdem wird IPin::QueryAccept für den Upstream Filter aufgerufen. Dadurch wird sichergestellt, dass der Eingabenadel seinen Medientyp entsprechend ändern kann.
  3. Der Ausgabepin ruft die CheckInputType-Methode des Filters auf, um den Medientyp zu überprüfen. Außerdem wird IPin::QueryAccept für den Upstream Filter aufgerufen. Dadurch wird sichergestellt, dass der Eingabenadel seinen Medientyp entsprechend ändern kann.
  4. Dieses Mal gibt die GetAllocator-Methode des Eingabenadels die downstream-Zuweisung zurück, und GetAllocatorRequirements gibt die Zuordnungsanforderungen des Downstreamfilters zurück. Der Eingabenadel akzeptiert alle Zuweisungen, die der Upstream Filter wählt.
  5. Dieses Mal gibt die GetAllocator-Methode des Eingabenadels die downstream-Zuweisung zurück, und GetAllocatorRequirements gibt die Zuordnungsanforderungen des Downstreamfilters zurück. Der Eingabenadel akzeptiert alle Zuweisungen, die der Upstream Filter wählt.

Betrachten Sie nun das gegenteilige Szenario, bei dem der Ausgabepin der erste Pin ist, der verbunden werden soll.

  1. Der Ausgabepin ruft die CheckInputType-Methode des Filters auf, um den Medientyp zu überprüfen.
  2. Es wählt eine Zuweisung aus, wobei die Verwendung der Zuweisung des downstream-Filters bevorzugt wird.

Wenn der Eingabenadel dann eine Verbindung herstellt:

  1. Der Eingabenadel überprüft den Medientyp, indem CheckInputType für den Filter und QueryAccept für den Ausgabepin des Downstreamfilters aufgerufen wird.
  2. Wenn der Eingabetyp nicht mit dem Ausgabetyp übereinstimmt, verbindet der Filter den Ausgabepin erneut.
  3. Der Upstream Filter wählt eine Zuweisung aus. Die GetAllocator-Methode des Eingabenadels gibt die nachgeschaltete Zuweisung zurück, und der Eingabenadel akzeptiert die Zuweisung, die der Upstream Filter auswählt.
  4. Der Filter verwendet den gleichen Allocator für die Downstreamverbindung und überschreibt möglicherweise die ursprüngliche Downstreamzuordnung.

Diese Abfolge von Ereignissen ändert sich geringfügig, wenn einer der beteiligten Zuweisungen schreibgeschützt ist, da die downstream-Zuweisung schreibbar sein muss. In diesem Fall kann der Filter zwei separate Zuweisungen verwenden.

Weitere Informationen zur Verwendung dieser Klasse finden Sie unter Schreiben von Transformationsfiltern.

Geschützte Membervariablen Beschreibung
m_bModifiesData Gibt an, ob der Filter die Beispieldaten ändert.
Geschützte Methoden Beschreibung
Copy Kopiert ein Medienbeispiel.
InputPin Ruft einen Zeiger auf den Eingabenadel des Filters ab.
OutputPin Ruft einen Zeiger auf den Ausgabepin des Filters ab.
TypesMatch Bestimmt, ob der Eingabemedientyp mit dem Ausgabemedientyp übereinstimmt.
Verwenden vonDifferentAllocators Bestimmt, ob die Eingabe- und Ausgabepins unterschiedliche Zuweisungen verwenden.
Öffentliche Methoden Beschreibung
CTransInPlaceFilter Konstruktormethode.
GetPin Ruft eine Stecknadel ab.
GetMediaType Ruft einen bevorzugten Medientyp für den Ausgabepin ab.
DecideBufferSize Legt die Pufferanforderungen des Ausgabepins fest.
CheckTransform Überprüft, ob ein Eingabemedientyp mit einem Ausgabemedientyp kompatibel ist.
CompleteConnect Schließt eine Pinverbindung ab.
Empfangen Empfängt ein Medienbeispiel, verarbeitet es und übermittelt es an den Downstreamfilter.
Reine virtuelle Methoden Beschreibung
Transform Transformiert ein Beispiel an Ort und Stelle.

Anforderungen

Anforderung Wert
Header
Transip.h (include Streams.h)
Bibliothek
Strmbase.lib (Einzelhandelsbuilds);
Strmbasd.lib (Debugbuilds)