Canalizaciones y circuitos AVStream
Una canalización es un conjunto de filtros AVStream que comparten un asignador común.
En la ilustración siguiente se muestra una canalización compuesta por tres filtros AVStream: un filtro de origen, un filtro de transformación en lugar y un filtro de representador.
En este ejemplo, KSProxy (no se muestra) ha elegido un asignador, representado por el bloque Alloc en el diagrama.
AVStream crea un objeto de solicitante interno asociado al filtro de origen. En el diagrama, el solicitante aparece como Req. El minidriver especifica en el miembro AllocatorFraming de KSPIN_DESCRIPTOR_EX el tipo de memoria y la cantidad de memoria continua que se va a asignar a un marco. En consecuencia, el solicitante obtiene fotogramas del asignador y los pasa al siguiente componente del circuito.
Los datos del filtro de origen fluyen a un filtro de transformación implementado por otro controlador AVStream.
Por último, los datos fluyen al filtro del representador implementado por un tercer filtro AVStream.
Dado que todas las patillas de este grafo son patillas AVStream, AVStream usa sus propias interfaces de transporte internas en lugar de enviar IRP mediante IoCallDriver, lo que reduce la latencia y mejora el rendimiento.
En concreto, cuando la aplicación hace que el grafo pase a KSSTATE_ACQUIRE (por ejemplo, cuando el usuario hace clic en Reproducir en GraphEdit), AVStream conecta directamente las colas de filtros, como se muestra anteriormente.
Por lo tanto, los fotogramas enviados de bajada vuelven al solicitante, donde se pueden reciclar cuando se completa la representación. Esta ruta de acceso de datos de AVStream es un circuito.
Considere un segundo ejemplo, que se muestra en la ilustración siguiente, en la que el filtro de transformación no es un filtro AVStream, pero sigue siendo un filtro en modo kernel.
Como en el primer ejemplo, este ejemplo incluye tres filtros: un origen avStream, una transformación KS (esto podría ser un controlador que usa KS directamente o un minidriver bajo la clase stream) y un representador avStream.
Al igual que en la primera ilustración, los pines se interconectan primero. Sin embargo, cuando el gráfico de filtro pasa a KSSTATE_ACQUIRE, el filtro Kernel Streaming 1.0 no admite la interfaz de transporte de AVStream. Como resultado, AVStream no omite las patillas; en su lugar, debe usar E/S para mover datos entre filtros.
En concreto, cuando un marco sale de la cola del filtro de origen, AVStream llama a IoCallDriver. En esta llamada, el parámetro Irp contiene el marco que se va a pasar desde el pin de salida del origen al filtro de transformación.
Cuando el pin de entrada del representador recibe el IRP, el pin coloca el IRP en la cola. Cuando el controlador del representador completa un marco, devuelve el marco al pin de entrada del representador, como se muestra en el segundo ejemplo.
AVStream ahora llama a IoCompleteRequest para devolver el fotograma ascendente. El pin de salida del filtro de origen recibe una notificación de finalización. La rutina de devolución de llamada del proceso de anclaje del minidriver puede llamar a KsStreamPointerUnlock y mover fotogramas de vuelta al solicitante para reciclarse en el circuito.
Considere un ejemplo final en el que el origen del marco está en modo de usuario. (Como alternativa, el destino final del fotograma podría estar en modo de usuario).
En la ilustración siguiente, un filtro de transformación en modo kernel que no es inplace recibe fotogramas de un filtro DirectShow en modo de usuario y envía el marco transformado a un representador AVStream en modo kernel:
Cuando llegan fotogramas desde el modo de usuario, el objeto pin avStream los coloca en la cola para la sección de canalización de entrada.
El filtro de transformación que no está en lugar asigna los fotogramas transformados en modo kernel y, a continuación, usa la segunda canalización como circuito para estos fotogramas. Dado que el representador es un filtro AVStream, AVStream omite las patillas y usa la interfaz de transporte de AVStream para colocar los fotogramas directamente en la cola del filtro de representación.
El minidriver puede insertar fotogramas en el circuito llamando a KsPinSubmitFrame o KsPinSubmitFrameMdl. Si el minidriver usa este método, el solicitante de AVStream recibe fotogramas como resultado de estas llamadas, en lugar de desde un asignador en modo kernel.