Divisores AVStream

Um minidriver AVStream pode usar a funcionalidade de driver de classe AVStream para dividir um fluxo de dados em várias cópias à medida que o fluxo passa por um determinado pino. Esse processo de divisão poderá ser útil se o driver precisar copiar um fluxo de entrada para produzir dois fluxos de saída idênticos.

Para fazer isso, defina KSPIN_FLAG_SPLITTER no membro Flags da estrutura KSPIN_DESCRIPTOR_EX do pino. Quando esse sinalizador é definido em um pino, o pino atua como um divisor automático. O AVStream copia automaticamente todos os dados necessários para dividir o fluxo.

Em versões posteriores ao DirectX8.0, o sinalizador KSPIN_FLAG_SPLITTER funciona para pinos em filtros centrados em filtro e centrados em pin . As versões anteriores dão suporte a esse sinalizador somente para pinos em filtros centrados em filtros.

O diagrama a seguir mostra a configuração de um filtro no qual o pino de entrada divide um fluxo em dois pinos de saída. Os filtros downstream desse pino de saída alteram os dados inplace.

diagrama ilustrando um filtro avstream com um pino de saída de divisor .

Os quadros chegam no pino de entrada e são colocados na fila de entrada. O minidriver interage apenas com a fila de entrada e a fila de saída para o pino original. O AVStream copia automaticamente os dados da fila do primeiro pino para a fila do segundo pino.

Para simplificar, este diagrama não mostra como os quadros são fornecidos para o pino de saída. Para fornecer quadros para o pino de saída, por exemplo, pode haver um solicitante e um alocador associados a cada fila e pertencentes a esta seção de pipe. Como alternativa, os quadros podem vir de um filtro downstream.

Na estrutura KSFILTER_DISPATCH , o minidriver especifica um ponteiro para uma rotina de retorno de chamada AVStrMiniFilterProcess fornecida pelo fornecedor. Essa rotina de retorno de chamada é onde o minidriver recebe um ponteiro para uma estrutura KSPROCESSPIN_INDEXENTRY que contém a matriz de estruturas KSPROCESSPIN descritas abaixo.

Este diagrama mostra como o minidriver distingue entre os dois pinos de saída na lista de pinos de processo:

diagrama de uma tabela de pinos de processo para dois pinos divididos.

Neste diagrama, DB refere-se ao membro DelegateBranch da estrutura KSPROCESSPIN e CS refere-se ao membro CopySource . Os membros DelegateBranch e CopySource do pino de entrada e o primeiro pino de saída são NULL. Isso indica que o minidriver é responsável por manipular quadros nesses pinos.

O segundo pino de saída, no entanto, tem um CopySource que aponta de volta para o primeiro pino de saída. Isso indica que o segundo pino de saída está em um pipe separado do primeiro pino de saída e que o AVStream está copiando automaticamente todos os dados colocados na fila do primeiro pino de saída para a fila do segundo pino de saída.

Casos de divisor mais complicados podem surgir quando dois pinos de saída são incorporados no mesmo pipe. Um minidriver pode incluir dois pinos de saída baseados em divisor no mesmo pipe, por exemplo, desde que os filtros downstream não alterem os dados enviados desses pinos. Como os dados não são modificados, os pinos de saída são considerados somente leitura; Ambos os filtros downstream recebem os mesmos buffers.

Também é possível que alguns dos filtros downstream que são anexados automaticamente ao pino do divisor alterem os dados enquanto outros não.

Nesse caso, o layout do filtro pode ser semelhante ao diagrama a seguir, que ilustra um filtro que contém três instâncias do pino de saída dividido:

diagrama ilustrando um filtro avstream com três pinos de saída divididos.

Os pinos A e B são atribuídos ao mesmo pipe porque os filtros downstream não alteram os dados; os filtros downstream de A e B recebem os mesmos ponteiros de buffer.

O minidriver interage apenas com a fila de entrada e uma única fila de saída. O AVStream copia automaticamente da fila A/B e da fila C. Ele também cria um objeto divisor que envia os mesmos quadros de dados por meio do pino A e do pino B (observe que os cabeçalhos de fluxo diferem).

A matriz de estruturas KSPROCESSPIN é a seguinte:

diagrama de uma tabela de pinos de processo para três pinos de saída divididos.

O único pino com o qual o minidriver deve interagir em circunstâncias normais é o pino A.

Para simplificar os diagramas acima, os solicitantes e os alocadores foram omitidos dos diagramas. Os diagramas destinam-se a demonstrar apenas o processo de divisão de quadros.