Divisores de AVStream

Un minidriver AVStream puede usar la funcionalidad del controlador de clase AVStream para dividir un flujo de datos en varias copias a medida que la secuencia pasa a través de un pin determinado. Este proceso de división puede ser útil si el controlador necesita copiar un flujo de entrada para generar dos flujos de salida idénticos.

Para ello, establezca KSPIN_FLAG_SPLITTER en el miembro Flags de la estructura KSPIN_DESCRIPTOR_EX del pin. Cuando esta marca se establece en un pin, el pin actúa como separador automático. AVStream copia automáticamente todos los datos necesarios para dividir la secuencia.

En versiones posteriores a DirectX8.0, la marca KSPIN_FLAG_SPLITTER funciona para patillas tanto en filtros centrados en filtros como en filtros centrados en patillas . Las versiones anteriores solo admiten esta marca para patillas en filtros centrados en filtros.

En el diagrama siguiente se muestra la configuración de un filtro en el que el pin de entrada divide un flujo en dos patillas de salida. Los filtros de bajada de este pin de salida cambian los datos en lugar.

diagrama que ilustra un filtro avstream con un pin de salida divisor.

Los marcos llegan al pin de entrada y se colocan en la cola de entrada. El minidriver solo interactúa con la cola de entrada y la cola de salida del pin original. AVStream copia automáticamente los datos de la primera cola del pin a la cola del segundo pin.

Por motivos de simplicidad, este diagrama no muestra cómo se proporcionan los fotogramas al pin de salida. Para proporcionar fotogramas al pin de salida, por ejemplo, podría haber un solicitante y un asignador asociado a cada cola y pertenecer a esta sección de canalización. Como alternativa, los fotogramas podrían proceder de un filtro de nivel inferior.

En la estructura KSFILTER_DISPATCH , el minidriver especifica un puntero a una rutina de devolución de llamada AVStrMiniFilterProcess proporcionada por el proveedor. Esta rutina de devolución de llamada es donde el minidriver recibe un puntero a una estructura de KSPROCESSPIN_INDEXENTRY que contiene la matriz de estructuras KSPROCESSPIN que se muestran a continuación.

En este diagrama se muestra cómo distingue el minidriver entre los dos pines de salida de la lista de patillas de proceso:

diagrama de una tabla de patillas de proceso para dos patillas divididas.

En este diagrama, DB hace referencia al miembro DelegateBranch de la estructura KSPROCESSPIN y CS hace referencia al miembro CopySource . Los miembros DelegateBranch y CopySource del pin de entrada y el primer pin de salida son NULL. Esto indica que el minidriver es responsable de controlar fotogramas en estos pines.

Sin embargo, el segundo pin de salida tiene un copySource que apunta de nuevo al primer pin de salida. Esto indica que el segundo pin de salida está en una canalización independiente del primer pin de salida y que AVStream copia automáticamente los datos que se colocan en la primera cola del pin de salida en la segunda cola del pin de salida.

Pueden surgir casos de divisores más complicados cuando dos patillas de salida están integradas en la misma canalización. Un minidriver podría incluir dos patillas de salida basadas en divisores en la misma canalización, por ejemplo, siempre y cuando los filtros de bajada no cambien los datos enviados desde estas patillas. Dado que los datos no se modifican, las patillas de salida se consideran de solo lectura; ambos filtros de nivel inferior reciben los mismos búferes.

También es posible que algunos de los filtros de bajada que se asocien automáticamente a la patilla divisora cambien los datos, mientras que otros no.

En este caso, el diseño del filtro podría ser similar al diagrama siguiente, que representa un filtro que contiene tres instancias del pin de salida dividido:

diagrama que ilustra un filtro avstream con tres patillas de salida divididas.

Las patillas A y B se asignan a la misma canalización porque los filtros de bajada no cambian los datos; los filtros de bajada de A y B reciben los mismos punteros de búfer.

El minidriver solo interactúa con la cola de entrada y una única cola de salida. AVStream copia automáticamente desde la cola A/B y la cola de C. También crea un objeto divisor que envía los mismos marcos de datos a través del pin A y el pin B (tenga en cuenta que los encabezados de secuencia difieren).

La matriz de estructuras KSPROCESSPIN es la siguiente:

diagrama de una tabla de patillas de proceso para tres patillas de salida divididas.

La única patilla con la que debe interactuar el minidriver en circunstancias normales es anclar A.

Para simplificar los diagramas anteriores, se omitieron los solicitantes y asignadores de los diagramas. Los diagramas están diseñados para mostrar solo el proceso de división de fotogramas.