Partager via


Traitement centré sur les filtres

Si un filtre utilise un traitement centré sur les filtres, AVStream appelle par défaut la routine de rappel AVStrMiniFilterProcess fournie par minidriver lorsque des trames de données sont disponibles sur chaque broche instance. Les minidrivers peuvent modifier ce comportement par défaut en définissant le membre Flags de la structure KSPIN_DESCRIPTOR_EX .

Pour implémenter un traitement centré sur les filtres, fournissez un pointeur vers une routine de rappel AVStrMiniFilterProcess fournie par minidriver dans le membre Processus de la structure KSFILTER_DISPATCH . Définissez le membre Process 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 des images pour que le traitement se produise. Les minidrivers peuvent modifier le comportement de traitement en définissant des indicateurs dans le membre Indicateurs de KSPIN_DESCRIPTOR_EX. Prêtez 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 des broches qui nécessitent des images via l’utilisation des routines KsPinAttachAndGate ou KsPinAttachOrGate .

  • Le nombre d’instances de broche 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 sur lequel la broche est actuellement définie. Une fois instances Inutile remplies, des broches supplémentaires dans l’état KSSTATE_STOP n’empêchent pas le traitement des filtres.

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

  • Le minidriver n’a pas fermé la porte 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 classe le tableau de structures KSPROCESSPIN_INDEXENTRY par ID de broche.

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

Le minidriver reçoit un tableau de structures KSPROCESSPIN_INDEXENTRY dans sa répartition du processus de filtre. 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]. Épingle [0] avant de vérifier que le membre Count de ProcessPinsIndex [n] en est au moins un , ou que le membre InstancesNecessary de la structure KSPIN_DESCRIPTOR_EX contenue dans Pins [0] en est au moins un. (Si ce dernier a la valeur true, l’épingle est garantie d’exister.)

Ensuite, pour spécifier l’épingle sur laquelle capturer des images, la routine de rappel AVStrMiniFilterProcess transmet un pointeur vers une structure KSPROCESSPIN vers 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 Data 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 correspondant au pointeur et à la broche de flux actuels :

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

La plupart des mini-drivers qui utilisent un traitement centré sur les filtres utilisent le pointeur de flux uniquement pour l’accès en-tête de flux. Dans le modèle centré sur les filtres, 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.