QueryAccept (Downstream)

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

Dieser Mechanismus ermöglicht es einem Ausgabenadel, dem nachgeschalteten Peer ein neues Format vorzuschlagen. Das neue Format darf keine größere Puffergröße erfordern. Der Ausgabenadel führt Folgendes aus:

  1. Ruft IPin::QueryAccept oder IPinConnection::D ynamicQueryAccept auf dem Downstream-Pin auf, um zu überprüfen, ob die andere Pin den neuen Medientyp akzeptieren kann (siehe Abbildung, Schritt A).

  2. Wenn der Rückgabewert aus Schritt 1 S_OK ist, fügt die Pin den Medientyp an das nächste Beispiel an. Dazu wird zunächst IMemAllocator::GetBuffer aufgerufen, um das Beispiel (B) abzurufen. Anschließend wird IMediaSample::SetMediaType aufgerufen, um den Medientyp an dieses Beispiel (C) anzufügen. Durch Anfügen des Medientyps an das Beispiel gibt der Filter an, dass sich das Format ab diesem Beispiel geändert hat.

  3. Der Pin liefert das Beispiel (D).

  4. Wenn der Downstreamfilter das Beispiel empfängt, ruft er IMediaSample::GetMediaType auf, um den neuen Medientyp abzurufen.

    queryaccept (downstream)

Alle Pins unterstützen die QueryAccept -Methode. Diese Methode ist jedoch etwas mehrdeutig, da ein Rückgabewert von S_OK nicht immer garantiert, dass Sie das Format ändern können, während das Diagramm aktiv ist. Einige Filter geben möglicherweise S_OK zurück, lehnen die Änderung jedoch ab, wenn das Diagramm aktiv ist. Die DynamicQueryAccept-Methode , die von einigen Eingabenadeln unterstützt wird, definiert explizit S_OK, damit der Pin formate ändern kann, während er aktiv ist. Wenn ein Eingabenadel die IPinConnection-Schnittstelle unterstützt, sollten Sie DynamicQueryAccept statt QueryAcceptaufrufen.

In den meisten Fällen lässt dieser Mechanismus keine drastischen Änderungen am Format zu, z. B. das Ändern der Bittiefe. Eine Situation, in der er verwendet werden kann, ist, wenn ein Videodecoder palettenwechselt. Die grundlegenden Details des Formats bleiben identisch, z. B. die Bilddimensionen und die Bittiefe, aber der neue Medientyp weist einen anderen Satz von Paletteneinträgen auf.

Hinweis zur Implementierung

In den DirectShow-Basisklassen ruft CBasePin::QueryAccept die CheckMediaType-Methode auf, die auch während der anfänglichen Pinverbindung aufgerufen wird. Bei einem Transformationsfilter sollte die CheckMediaType-Methode des Eingabenadels immer überprüfen, ob der Ausgabepin verbunden ist und wenn ja, ob der Eingabemedientyp mit dem Ausgabemedientyp kompatibel ist. Daher ist diese Implementierung wahrscheinlich für QueryAcceptgültig. Andernfalls sollten Sie überschreiben QueryAccept , um alle erforderlichen zusätzlichen Überprüfungen durchzuführen. Beachten Sie außerdem, dass die CTransformFilter-Klasse diese Logik innerhalb der CheckInputType - und CheckTransform-Methoden kapselt. Die CTransInPlaceFilter-Klasse hingegen ruft QueryAccept immer den nächsten Upstream- oder Downstreamfilter auf.

Die CBaseInputPin::Receive-Methode überprüft im eingehenden Beispiel auf einen Medientyp, und wenn vorhanden, ruft CheckMediaType auf. Es aktualisiert jedoch nicht den m_mt Member des Pins, der den aktuellen Medientyp enthält. Wenn Ihr Filter das Beispiel verarbeitet, sollten Sie das Beispiel auf einen Medientyp überprüfen. Wenn ein neuer Typ vorhanden ist, müssen Sie ihn wahrscheinlich speichern, indem Sie Entweder SetMediaType an Ihrer Pin aufrufen oder den Wert von m_mt direkt festlegen. Andererseits speichert die CVideoTransformFilter-Klasse , die für Videotransformationsfilter konzipiert ist, den Medientyp, wenn er sich ändert. Ausführliche Informationen finden Sie im Quellcode für CVideoTransformFilter::Receive in der DirectShow-Basisklassenbibliothek.

In einigen Fällen können Sie einfach den QueryAccept Aufruf nachgelagert übergeben, dann den Medientyp an das Ausgabebeispiel anfügen und den Nachstromfilter die Formatänderung verarbeiten lassen.