Freigeben über


QueryAccept (Downstream)

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

Mit diesem Mechanismus kann ein Ausgabepin ein neues Format für den nachgeschalteten Peer vorschlagen. Das neue Format darf keine größere Puffergröße erfordern. Die Ausgabenadel führt die folgenden Aktionen aus:

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

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

  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, um zu bedeuten, dass die Pin Formate ändern kann, während sie aktiv sind. Wenn eine Eingabenadel die IPinConnection- Schnittstelle unterstützt, sollten Sie DynamicQueryAccept- anstelle von QueryAcceptaufrufen.

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

Implementierungshinweis

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 der Eingabenadel immer überprüfen, ob die Ausgabenadel verbunden ist, und falls ja, ob der Eingabemedientyp mit dem Ausgabemedientyp kompatibel ist. Daher wird diese Implementierung wahrscheinlich für QueryAcceptgültig sein. Andernfalls sollten Sie QueryAccept außer Kraft setzen, um zusätzliche Überprüfungen durchzuführen, die erforderlich sind. Beachten Sie außerdem, dass die CTransformFilter Klasse diese Logik innerhalb der CheckInputType- und CheckTransform- Methoden kapselt. Die CTransInPlaceFilter- Klasse ruft dagegen immer QueryAccept für den nächsten upstream- oder downstream-Filter auf.

Die CBaseInputPin::Receive-Methode sucht nach einem Medientyp im eingehenden Beispiel, und wenn vorhanden, wird CheckMediaTypeaufgerufen. Es aktualisiert jedoch nicht das m_mt Mitglied des Pins, das 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 Der Pin aufrufen oder den Wert von m_mt direkt festlegen. Andererseits speichert die CVideoTransformFilter Klasse, die für Videotransformationsfilter entwickelt wurde, den Medientyp, wenn sie geändert wird. 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 nachgeschalteten Filter die Formatänderung behandeln lassen.