Punteros de flujo de borde inicial y final

De forma predeterminada, cada cola de AVStream contiene un puntero de flujo de borde inicial . El borde inicial apunta a nuevos fotogramas a medida que llegan a la cola. En concreto, el borde inicial apunta inicialmente al primer fotograma para llegar a la cola y no se mueve hasta que el minidriver lo mueve. AVStream crea el borde inicial, que luego existe durante la vigencia de la cola. Los minidrivers pueden manipular el borde inicial mediante funciones proporcionadas por Microsoft.

Cuando llega un nuevo fotograma a una cola, AVStream establece el borde inicial para que apunte a este fotograma, siempre que el borde inicial aún no apunte a un marco.

Para obtener un puntero al puntero de flujo perimetral inicial, el minidriver llama a KsPinGetLeadingEdgeStreamPointer.

El minidriver es responsable de avanzar el borde inicial en todas las situaciones, pero las dos situaciones resumidas en la tabla siguiente.

Situación Comportamiento de AVStream

Un marco llega a una cola vacía previamente.

AVStream establece el borde inicial para que apunte a este marco.

El borde inicial apunta a un marco. Se cancela el IRP correspondiente a este marco.

AVStream avanza hacia el borde inicial. El borde inicial apunta ahora a un marco más reciente.

Consulte Introducción a los punteros de flujo Para obtener más información sobre cómo avanzar los punteros de flujo.

Especificar un puntero de flujo perimetral final

Los minidrivers pueden especificar que una cola tiene un puntero de flujo perimetral final. El borde final suele indicar el marco más antiguo de interés para el minidriver. Para especificar un borde final, establezca la marca KSPIN_FLAG_DISTINCT_TRAILING_EDGE en el miembro Flags de la estructura KSPIN_DESCRIPTOR_EX pertinente. A continuación, llame a KsPinGetTrailingEdgeStreamPointer para obtener un puntero al puntero de flujo perimetral final.

Cuando avanza el borde final, el recuento de referencias en el marco al que apuntaba anteriormente cae a cero y se completa el marco. Si el marco es el último contenido en su IRP, un pin receptor completa el IRP al autor de la llamada; Un pin de origen envía el IRP al pin al que está conectado.

Mantenimiento de una ventana de marco

Como resultado de las reglas de recuento de referencias de fotogramas descritas en Introducción a los punteros de flujo, un marco entre el borde inicial y final permanece en la cola hasta que se cancele, incluso si un puntero de flujo no hace referencia al marco. Por lo tanto, un minidriver puede usar los punteros de borde inicial y final para mantener una ventana de trabajo de varios marcos contiguos. Los marcos de la ventana pueden estar esperando procesamiento o relleno, por ejemplo.

En el diagrama siguiente, los fotogramas más antiguos están en la parte inferior. Los nuevos marcos llegan a la parte superior. El número de cada fotograma es el recuento de referencias de ese fotograma. Cuando los punteros de secuencia avanzan, se mueven hacia arriba en este diagrama.

diagrama que ilustra los punteros de flujo de avstream que hacen referencia a las colas de patillas.

La cola situada más a la izquierda muestra cómo el minidriver puede usar un borde final para crear un conjunto de marcos de trabajo. Cada fotograma entre el borde inicial y final tiene un recuento de referencias de uno a pesar de que ningún puntero de secuencia haga referencia a estos fotogramas.

La cola central es un ejemplo de clonación de punteros de flujo. El controlador se ha clonado repetidamente y, a continuación, avanzado el borde inicial, como se describe en los pasos del proceso de anclaje de AVStream DMA Services.

La cola situada más a la derecha muestra cómo el minidriver puede mantener el recuento de referencias de un marco detrás del borde final mediante un clon de puntero de secuencia.