AVStream Splitters
Un minidriver AVStream peut utiliser la fonctionnalité de pilote de classe AVStream pour fractionner un flux de données en plusieurs copies lorsque le flux passe par une broche donnée. Ce processus de fractionnement peut être utile si votre pilote doit copier un flux d’entrée pour produire deux flux de sortie identiques.
Pour ce faire, définissez KSPIN_FLAG_SPLITTER dans le membre Flags de la structure KSPIN_DESCRIPTOR_EX de la broche. Lorsque cet indicateur est défini sur une broche, la broche agit comme un séparateur automatique. AVStream copie automatiquement toutes les données nécessaires pour fractionner le flux.
Dans les versions ultérieures à DirectX8.0, l’indicateur KSPIN_FLAG_SPLITTER fonctionne pour les broches des filtres centrés sur les filtres et les filtres centrés sur les broches . Les versions antérieures prennent en charge cet indicateur uniquement pour les broches sur les filtres centrés sur les filtres.
Le diagramme suivant montre la configuration d’un filtre dans lequel la broche d’entrée divise un flux en deux broches de sortie. Les filtres en aval de cette broche de sortie modifient les données en place.
Les images arrivent sur la broche d’entrée et sont placées dans la file d’attente d’entrée. Le minidriver interagit uniquement avec la file d’attente d’entrée et la file d’attente de sortie pour l’épingle d’origine. AVStream copie automatiquement les données de la file d’attente de la première broche vers la file d’attente de la deuxième broche.
Par souci de simplicité, ce diagramme ne montre pas comment les trames sont fournies à la broche de sortie. Pour fournir des images à la broche de sortie, pour instance, un demandeur et un allocateur peuvent être associés à chaque file d’attente et appartenant à cette section de canal. Les images peuvent également provenir d’un filtre en aval.
Dans la structure KSFILTER_DISPATCH , le minidriver spécifie un pointeur vers une routine de rappel AVStrMiniFilterProcess fournie par le fournisseur. Cette routine de rappel est l’endroit où le minidriver reçoit un pointeur vers une structure de KSPROCESSPIN_INDEXENTRY contenant le tableau de structures KSPROCESSPIN illustrées ci-dessous.
Ce diagramme montre comment le minidriver fait la distinction entre les deux broches de sortie dans la liste des broches de processus :
Dans ce diagramme, db fait référence au membre DelegateBranch de la structure KSPROCESSPIN et CS fait référence au membre CopySource . Les membres DelegateBranch et CopySource de la broche d’entrée et de la première broche de sortie sont NULL. Cela indique que le minidriver est responsable de la gestion des images sur ces broches.
La deuxième broche de sortie, cependant, a un CopySource qui pointe vers la première broche de sortie. Cela indique que la deuxième broche de sortie se trouve dans un canal distinct de la première broche de sortie et qu’AVStream copie automatiquement toutes les données placées dans la file d’attente de la première broche de sortie dans la file d’attente de la deuxième broche de sortie.
Des cas de fractionnement plus complexes peuvent se produire lorsque deux broches de sortie sont intégrées dans le même canal. Un minidriver peut inclure deux broches de sortie basées sur un séparateur dans le même canal, par exemple, tant que les filtres en aval ne modifient pas les données envoyées à partir de ces broches. Étant donné que les données ne sont pas modifiées, les broches de sortie sont considérées comme en lecture seule ; les deux filtres en aval reçoivent les mêmes mémoires tampons.
Il est également possible que certains filtres en aval qui s’attachent automatiquement à la broche de fractionnement modifient les données alors que d’autres ne le font pas.
Dans ce cas, la disposition du filtre peut être similaire au diagramme suivant, qui représente un filtre qui contient trois instances de la broche de sortie fractionnée :
Les épingles A et B sont affectées au même canal, car les filtres en aval ne modifient pas les données ; les filtres en aval de A et B reçoivent les mêmes pointeurs de mémoire tampon.
Le minidriver interagit uniquement avec la file d’attente d’entrée et une file d’attente de sortie unique. AVStream copie automatiquement à partir de la file d’attente A/B et de la file d’attente C. Il crée également un objet de fractionnement qui envoie les mêmes trames de données via les broches A et B (notez que les en-têtes de flux diffèrent).
Le tableau des structures KSPROCESSPIN est le suivant :
La seule broche avec laquelle le minidriver doit interagir dans des circonstances normales est l’épingle A.
Pour simplifier les diagrammes ci-dessus, les demandeurs et les allocateurs ont été omis des diagrammes. Les diagrammes sont destinés à illustrer uniquement le processus de fractionnement d’images.