Freigeben über


CDynamicOutputPin-Klasse

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

Die CDynamicOutputPin -Klasse implementiert einen Ausgabenadel, der dynamische Verbindungsherstellungen und Formatänderungen unterstützt.

Diese Klasse leitet sich von der CBaseOutputPin-Klasse ab und implementiert die IPinFlowControl-Schnittstelle . Es unterstützt mehrere Vorgänge, die für die Erstellung dynamischer Diagramme wichtig sind:

  • Dynamische Wiederherstellung der Verbindung: Der Pin kann die Verbindung trennen und erneut verbinden, während der Filter noch aktiv ist (angehalten oder ausgeführt).
  • Dynamische Formatänderung: Der Pin kann einen neuen Medientyp aushandeln, während der Filter noch aktiv ist, ohne erneut eine Verbindung herzustellen.
  • Ablaufsteuerung: Der besitzereigene Filter (oder eine Anwendung) kann den Datenfluss vom Pin blockieren, ohne den Filter zu beenden.

Weitere Informationen finden Sie unter Dynamische Grapherstellung.

Der Pin weist drei mögliche Zustände auf: blockiert, entsperrt und ausstehend. Im Ausstehenden Zustand wartet der Pin auf den Abschluss eines Vorgangs für einen anderen Thread, bevor der Pin in den blockierten Zustand wechselt. Während der Pin blockiert ist, kann der Filter keine Daten über den Pin übermitteln oder die Verbindung des Pins ändern.

Um mehrere Threads zu koordinieren, muss der Besitzerfilter bestimmte Regeln befolgen. (Weitere Informationen zu Threads im Filterdiagramm finden Sie unter Threads und kritische Abschnitte.) Zunächst muss der Streamingthread immer die CDynamicOutputPin::StartUsingOutputPin-Methode aufrufen, bevor eine der folgenden Methoden aufgerufen wird:

Anschließend muss die CDynamicOutputPin::StopUsingOutputPin-Methode aufgerufen werden.

Zweitens darf der Anwendungsthread keine der Methoden in der vorherigen Liste aufrufen. Drittens darf der Streamingthread die Klassenmethoden nicht aufrufen, mit denen der Pin blockiert oder aufgehoben wird. Diese Methoden sind : CDynamicOutputPin::Block, CDynamicOutputPin::SynchronousBlockOutputPin, CDynamicOutputPin::AsynchronousBlockOutputPin und CDynamicOutputPin::UnblockOutputPin.

Diese Regeln stellen sicher, dass der Anwendungsthread den Pin nicht blockieren kann, während der Streamingthread ihn verwendet, und umgekehrt. Nachdem der Streamingthread StartUsingOutputPin aufgerufen hat, wird der Pin erst blockiert, wenn der Streamingthread StopUsingOutputPin aufruft. Wenn der Pin hingegen blockiert ist, wartet StartUsingOutputPin , bis der Pin aufgehoben wird.

Um den Aufruf von StopUsingOutputPin zu vermeiden, können Sie die CAutoUsingOutputPin-Klasse verwenden. Es ruft StopUsingOutputPin automatisch auf, wenn es außerhalb des Bereichs geht.

Wenn der besitzende Filter das Filterdiagramm verknüpft oder verlässt (in seiner IBaseFilter::JoinFilterGraph-Methode ), muss er die CDynamicOutputPin::SetConfigInfo-Methode des Pins aufrufen.

Geschützte Membervariablen Beschreibung
m_BlockStateLock Kritischer Abschnitt, der den Blockierungszustand schützt.
m_hUnblockOutputPinEvent Ereignis, das signalisiert wird, wenn der Pin nicht blockiert wird.
m_hNotifyCallerPinBlockedEvent Ereignis, das signalisiert wird, wenn der Pin erfolgreich blockiert oder der Benutzer einen ausstehenden Block abbricht.
m_BlockState Blockierungszustand.
m_dwBlockCallerThreadID Der Bezeichner des Threads, der zuletzt die IPinFlowControl::Block-Methode an diesem Pin aufgerufen hat.
m_dwNumOutstandingOutputPinUsers Anzahl der Streamingthreads, die diesen Pin verwenden.
m_hStopEvent Ereignis, das signalisiert wird, wenn der Filter angehalten wird oder die Pin Daten leert.
m_pGraphConfig Zeiger auf die IGraphConfig-Schnittstelle , um dynamische Verbindungen durchzuführen.
m_bPinUsesReadOnlyAllocator Flag, das angibt, ob Die Beispiele aus dem Zuteilungsstift schreibgeschützt sind.
Geschützte Methoden Beschreibung
SynchronousBlockOutputPin Blockiert den Pin; wird erst zurückgegeben, wenn der Pin blockiert ist.
AsynchronousBlockOutputPin Blockiert den Pin; kann zurückgegeben werden, bevor der Pin blockiert wird.
UnblockOutputPin Hebt die Blockierung des Pins auf.
BlockOutputPin Blockiert den Pin.
WaitEvent Wartet, bis das angegebene Ereignis signalisiert wird.
Öffentliche Methoden Beschreibung
CDynamicOutputPin Konstruktormethode.
~CDynamicOutputPin Destruktormethode.
SetConfigInfo Gibt den IGraphConfig-Zeiger und das Stoppereignis an.
DeliverBeginFlush Fordert den verbundenen Eingabenadel an, um einen Löschvorgang zu starten.
DeliverEndFlush Fordert den verbundenen Eingabenadel an, um einen Löschvorgang zu beenden.
Inaktiv Benachrichtigt den Pin, dass der Filter beendet wurde.
Aktiv Benachrichtigt den Pin, dass der Filter jetzt aktiv ist.
CompleteConnect Schließt eine Verbindung mit einem Eingabenadel ab. Virtuellen.
StartUsingOutputPin Ruft Zugriff auf die Pin für einen Streamingvorgang ab. Virtuellen.
StopUsingOutputPin Gibt den Zugriff auf den Pin nach einem Streamingvorgang frei. Virtuellen.
StreamingThreadUsingOutputPin Bestimmt, ob ein Thread einen Streamingvorgang am Pin ausführt. Virtuellen.
ChangeOutputFormat Ändert dynamisch den Medientyp für die Verbindung und liefert neue Segmentinformationen.
ChangeMediaType Ändert dynamisch den Medientyp für die Verbindung.
DynamicReconnect Führt eine dynamische erneute Verbindung mit einem neuen Medientyp aus.
IPin-Methoden Beschreibung
Trennen Unterbricht die aktuelle Pinverbindung.
IPinFlowControl-Methoden Beschreibung
Block Blockiert oder hebt die Blockierung des Datenflusses aus dem Pin auf.

Anforderungen

Anforderung Wert
Header
Amfilter.h (streams.h einschließen)
Bibliothek
Strmbase.lib (Einzelhandelsbuilds);
Strmbasd.lib (Debugbuilds)