Partager via


Traitement centré sur les filtres

Si un filtre utilise un traitement centré sur le filtre, alors par défaut AVStream appelle la routine de rappel AVStrMiniFilterProcess fournie par le mini-pilote lorsqu'il y a des trames de données disponibles sur chaque instance de broche. Les minidrivers peuvent modifier ce comportement par défaut en définissant le membre Indicateurs de la structure KSPIN_DESCRIPTOR_EX .

Pour implémenter un traitement centré sur le filtre, fournissez un pointeur vers une routine de rappel AVStrMiniFilterProcess fournie par minidriver dans le membre Process de la structure KSFILTER_DISPATCH . Définissez le membre Processus de KSPIN_DISPATCH sur NULL.

AVStream appelle AVStrMiniFilterProcess uniquement lorsque toutes les conditions suivantes sont remplies :

  • Les images sont disponibles sur les broches qui nécessitent le traitement des images. Les minidrivers peuvent modifier le comportement de traitement en définissant des drapeaux dans le membre Flags de KSPIN_DESCRIPTOR_EX. Portez une attention particulière aux combinaisons des indicateurs mutuellement exclusifs KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING et KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. Le minidriver peut également modifier l’ensemble de connecteurs qui nécessitent des trames en utilisant les routines KsPinAttachAndGate ou KsPinAttachOrGate.

  • Le nombre d'instances d'épingle est égal ou supérieur au membre InstancesNecessary de la structure KSPIN_DESCRIPTOR_EX. Le membre ClientState de la structure KSPIN spécifie l’énumérateur KSSTATE particulier auquel la broche est actuellement définie. Une fois InstancesNécessaires atteintes, des broches supplémentaires dans l’état KSSTATE_STOP ne bloqueront pas le fonctionnement du filtre.

  • Le nombre requis d’instances de pins est atteint (comme spécifié par le membre InstancesNecessary de la structure KSPIN_DESCRIPTOR_EX .

  • Le minidriver n’a pas refermé la passerelle de contrôle de processus du filtre à l’aide des fonctions KSGATEXxx.

Dans la routine de rappel AVStrMiniFilterProcess, le minidriver reçoit un pointeur vers un tableau de structures KSPROCESSPIN_INDEXENTRY. AVStream trie le tableau de structures KSPROCESSPIN_INDEXENTRY par ID de broche.

Les exemples de code suivants illustrent comment utiliser les structures des broches de processus. Le code est extrait de l’exemple AVStream Filter-Centric Simulated Capture Driver (Avssamp), qui montre comment écrire un pilote de capture centré sur le filtre. Le code source et une description de cet exemple sont inclus dans le téléchargement des exemples du Kit de pilotes Windows.

Le minidriver reçoit un tableau de structures KSPROCESSPIN_INDEXENTRY dans son dispatcheur de filtrage de processus. Dans cet exemple, le minidriver extrait la première structure KSPROCESSPIN de la structure KSPROCESSPIN_INDEXENTRY d’index VIDEO_PIN_ID :

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

Le minidriver ne doit pas référencer ProcessPinsIndex [n]. Pins [0] avant de vérifier que le membre Count de ProcessPinsIndex [n] est au moins un, ou que le membre InstancesNecessary de la structure KSPIN_DESCRIPTOR_EX contenue dans Pins [0] est au moins un. (Si ce dernier est vrai, la présence de la broche est assurée.)

Ensuite, pour spécifier l’épingle sur laquelle capturer des images, la routine de rappel AVStrMiniFilterProcess transmet un pointeur à une structure KSPROCESSPIN à CaptureFrame, une routine de capture fournie par le fournisseur :

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

La routine de capture peut ensuite copier vers ou à partir du membre de données de la structure KSPROCESSPIN. Il peut également mettre à jour les membres BytesUsed et Terminate de cette structure, comme dans l’exemple suivant :

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

Le minidriver peut également accéder à la structure d’en-tête de flux correspondante au pointeur de flux actuel et à la broche :

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

La plupart des minidrivers qui utilisent un traitement centré sur le filtre utilisent le pointeur de flux uniquement pour accéder à l'en-tête du flux. Dans le modèle centré sur le filtre, AVStream manipule le pointeur de flux en interne. Par conséquent, les minidrivers doivent procéder avec prudence s’ils manipulent le pointeur de flux dans un pilote centré sur le filtre.