Classe CDynamicOutputPin
[La fonctionnalité associée à cette page, DirectShow, est une fonctionnalité héritée. Il a été remplacé par MediaPlayer, IMFMediaEngine et Audio/Video Capture dans Media Foundation. Ces fonctionnalités ont été optimisées pour Windows 10 et Windows 11. Microsoft recommande vivement au nouveau code d’utiliser MediaPlayer, IMFMediaEngine et La capture audio/vidéo dans Media Foundation au lieu de DirectShow, lorsque cela est possible. Microsoft suggère que le code existant qui utilise les API héritées soit réécrit pour utiliser les nouvelles API si possible.]
La CDynamicOutputPin
classe implémente une broche de sortie qui prend en charge les reconnexions dynamiques et les modifications de format.
Cette classe dérive de la classe CBaseOutputPin et implémente l’interface IPinFlowControl . Il prend en charge plusieurs opérations importantes pour la création de graphiques dynamiques :
- Reconnexion dynamique : le code pin peut se déconnecter et se reconnecter tant que le filtre est toujours actif (en pause ou en cours d’exécution).
- Changement de format dynamique : l’épingle peut négocier un nouveau type de média tant que le filtre est toujours actif, sans se reconnecter.
- Contrôle de flux : le filtre propriétaire (ou une application) peut bloquer le flux de données à partir de la broche sans arrêter le filtre.
Pour plus d’informations, consultez Génération de graphiques dynamiques.
La broche a trois états possibles : bloqué, débloqué et en attente. Dans l’état en attente , la broche attend qu’une opération se termine sur un autre thread, avant que le broche passe à l’état bloqué. Lorsque la broche est bloquée, le filtre ne peut pas fournir de données via la broche, ni modifier la connexion de la broche.
Pour se coordonner entre plusieurs threads, le filtre propriétaire doit suivre certaines règles. (Pour plus d’informations sur les threads dans le graphe de filtres, consultez Threads et sections critiques.) Tout d’abord, le thread de streaming doit toujours appeler la méthode CDynamicOutputPin::StartUsingOutputPin avant d’appeler l’une des méthodes suivantes :
- CDynamicOutputPin::ChangeOutputFormat
- CDynamicOutputPin::ChangeMediaType
- CDynamicOutputPin::D ynamicReconnect
- CBaseOutputPin::D eliver
- CBaseOutputPin::D eliverEndOfStream
- CBaseOutputPin::D eliverNewSegment
- IMemInputPin::Receive
- IMemInputPin::ReceiveMultiple
- IPin::EndOfStream
- IPin::NewSegment
Ensuite, il doit appeler la méthode CDynamicOutputPin::StopUsingOutputPin .
Deuxièmement, le thread d’application ne doit appeler aucune des méthodes de la liste précédente. Troisièmement, le thread de streaming ne doit pas appeler les méthodes de classe qui bloquent ou débloquent l’épingle. Ces méthodes sont : CDynamicOutputPin::Block, CDynamicOutputPin::SynchronousBlockOutputPin, CDynamicOutputPin::AsynchroneBlockOutputPin et CDynamicOutputPin::UnblockOutputPin.
Ces règles garantissent que le thread d’application ne peut pas bloquer la broche pendant que le thread de streaming l’utilise, et vice versa. Une fois que le thread de streaming a appelé StartUsingOutputPin, le code pin ne bloque pas tant que le thread de streaming n’appelle pas StopUsingOutputPin. À l’inverse, si la broche est bloquée, StartUsingOutputPin attend que la broche soit débloquée.
Pour éviter d’oublier d’appeler StopUsingOutputPin, vous pouvez utiliser la classe CAutoUsingOutputPin . Il appelle automatiquement StopUsingOutputPin lorsqu’il sort de l’étendue.
Lorsque le filtre propriétaire joint ou quitte le graphe de filtre (dans sa méthode IBaseFilter::JoinFilterGraph ), il doit appeler la méthode CDynamicOutputPin::SetConfigInfo de la broche.
Variables membres protégées | Description |
---|---|
m_BlockStateLock | Section critique qui protège l’état de blocage. |
m_hUnblockOutputPinEvent | Événement signalé lorsque la broche n’est pas bloquée. |
m_hNotifyCallerPinBlockedEvent | Événement signalé lorsque l’épingle a réussi à bloquer ou que l’utilisateur annule un bloc en attente. |
m_BlockState | État de blocage. |
m_dwBlockCallerThreadID | Identificateur du thread qui a appelé la dernière méthode IPinFlowControl::Block sur cette broche. |
m_dwNumOutstandingOutputPinUsers | Nombre de threads de streaming utilisant cette broche. |
m_hStopEvent | Événement signalé lorsque le filtre s’arrête ou que la broche vide les données. |
m_pGraphConfig | Pointeur vers l’interface IGraphConfig pour effectuer des reconnexions dynamiques. |
m_bPinUsesReadOnlyAllocator | Indicateur qui spécifie si les exemples de l’allocateur de la broche sont en lecture seule. |
Méthodes protégées | Description |
SynchronousBlockOutputPin | Bloque la broche ; ne retourne pas tant que la broche n’est pas bloquée. |
AsynchroneBlockOutputPin | Bloque la broche ; peut revenir avant que l’épingle ne soit bloquée. |
UnblockOutputPin | Débloque l’épingle. |
BlockOutputPin | Bloque l’épingle. |
WaitEvent | Attend que l’événement spécifié soit signalé. |
Méthodes publiques | Description |
CDynamicOutputPin | Méthode du constructeur. |
~CDynamicOutputPin | Méthode de destructeur. |
SetConfigInfo | Spécifie le pointeur IGraphConfig et l’événement stop. |
DeliverBeginFlush | Demande à la broche d’entrée connectée de commencer une opération de vidage. |
DeliverEndFlush | Demande à la broche d’entrée connectée de mettre fin à une opération de vidage. |
Inactif | Avertit l’épingle que le filtre s’est arrêté. |
Actif | Avertit la broche que le filtre est maintenant actif. |
CompleteConnect | Termine une connexion à une broche d’entrée. Virtuel. |
StartUsingOutputPin | Obtient l’accès à la broche pour une opération de diffusion en continu. Virtuel. |
StopUsingOutputPin | Libère l’accès à l’épingle après une opération de diffusion en continu. Virtuel. |
StreamingThreadUsingOutputPin | Détermine si un thread effectue une opération de diffusion en continu sur la broche. Virtuel. |
ChangeOutputFormat | Modifie dynamiquement le type de média pour la connexion et fournit de nouvelles informations de segment. |
ChangeMediaType | Modifie dynamiquement le type de média pour la connexion. |
DynamicReconnect | Effectue une reconnexion dynamique avec un nouveau type de média. |
Méthodes IPin | Description |
Déconnecter | Interrompt la connexion de broche actuelle. |
Méthodes IPinFlowControl | Description |
Bloc | Bloque ou débloque le flux de données à partir de l’épingle. |
Configuration requise
Condition requise | Valeur |
---|---|
En-tête |
|
Bibliothèque |
|