Pointeurs de flux de bord de début et de fin

Par défaut, chaque file d’attente AVStream contient un pointeur de flux de bord de pointe . Le bord d’avant pointe vers de nouvelles images à mesure qu’elles arrivent dans la file d’attente. Plus précisément, le bord d’avant pointe initialement vers le premier cadre pour arriver dans la file d’attente et ne se déplace pas tant que le minidriver ne le déplace pas. AVStream crée le bord d’avant-plan, qui existe alors pendant la durée de vie de la file d’attente. Les minidrivers peuvent manipuler le bord d’avant-garde à l’aide de fonctions fournies par Microsoft.

Lorsqu’une nouvelle image arrive dans une file d’attente, AVStream définit le bord d’entrée pour qu’il pointe vers ce cadre, à condition que le bord d’entrée ne pointe pas déjà vers une image.

Pour obtenir un pointeur vers le pointeur de flux de bord de pointe, le minidriver appelle KsPinGetLeadingEdgeStreamPointer.

Le minidriver est responsable de l’avancement du bord d’avance dans toutes les situations sauf dans les deux situations résumées dans le tableau suivant.

Situation Comportement d’AVStream

Une image arrive dans une file d’attente précédemment vide.

AVStream définit le bord d’entrée pour qu’il pointe vers ce cadre.

Le bord d’avant pointe vers un cadre. L’IRP correspondant à ce frame est annulé.

AVStream avance en pointe. Le bord d’avant pointe maintenant vers un cadre plus récent.

Pour plus d’informations sur l’avancement des pointeurs de flux, consultez Présentation des pointeurs de flux.

Spécification d’un pointeur de flux de bord de fin

Les minidrivers peuvent spécifier qu’une file d’attente a un pointeur de flux de bord de fin. Le bord de fin indique généralement le cadre le plus ancien d’intérêt pour le minidriver. Pour spécifier un bord de fin, définissez l’indicateur KSPIN_FLAG_DISTINCT_TRAILING_EDGE dans le membre Indicateurs de la structure KSPIN_DESCRIPTOR_EX appropriée. Appelez ensuite KsPinGetTrailingEdgeStreamPointer pour obtenir un pointeur vers le pointeur de flux de bord de fin.

Lorsque le bord de fin avance, le nombre de références sur le cadre vers lequel il a précédemment pointé tombe à zéro et l’image se termine. Si le cadre est le dernier contenu dans son IRP, une broche récepteur termine l’IRP à l’appelant ; une broche source envoie l’IRP à la broche à laquelle il est connecté.

Maintenance d’une fenêtre Frame

En raison des règles de nombre de références d’images décrites dans Présentation des pointeurs de flux, une trame entre le bord de début et le bord de fin reste dans la file d’attente jusqu’à ce qu’elle soit annulée, même si la trame n’est pas référencée par un pointeur de flux. Par conséquent, un minidriver peut utiliser les pointeurs de bord de début et de fin pour maintenir une fenêtre de travail de plusieurs cadres contigus. Les cadres de la fenêtre peuvent être en attente de traitement ou de remplissage, par exemple.

Dans le diagramme suivant, les images les plus anciennes se trouvent en bas. De nouvelles images arrivent en haut. Le nombre dans chaque image est le nombre de références pour cette image. Lorsque les pointeurs de flux avancent, ils se déplacent vers le haut dans ce diagramme.

diagramme illustrant les pointeurs de flux avstream référençant des files d’attente de broches.

La file d’attente la plus à gauche montre comment le minidriver peut utiliser un bord de fin pour créer un ensemble de cadres de travail. Chaque image comprise entre le bord de début et le bord de fin a un nombre de références d’un, bien qu’aucun pointeur de flux ne référence ces images.

La file d’attente du milieu est un exemple de clonage de pointeurs de flux. Le pilote a cloné à plusieurs reprises, puis avancé le bord de pointe, comme décrit dans les étapes du processus d’épingle dans AVStream DMA Services.

La file d’attente la plus à droite montre comment le minidriver peut conserver le nombre de références pour une image derrière le bord de fin à l’aide d’un clone de pointeur de flux.