Ponteiros de fluxo de borda à esquerda e à direita
Por padrão, cada fila AVStream contém um ponteiro de fluxo de borda à esquerda . A borda superior aponta para novos quadros à medida que chegam à fila. Especificamente, a borda superior aponta inicialmente para o primeiro quadro para chegar à fila e não se move até que o minidriver o mova. O AVStream cria a borda à esquerda, que existe para o tempo de vida da fila. Os minidrivers podem manipular a borda superior usando funções fornecidas pela Microsoft.
Quando um novo quadro chega em uma fila, o AVStream define a borda superior para apontar para esse quadro, desde que a borda superior ainda não aponte para um quadro.
Para obter um ponteiro para o ponteiro de fluxo de borda à esquerda, o minidriver chama KsPinGetLeadingEdgeStreamPointer.
O minidriver é responsável por avançar a borda superior em todas, exceto nas duas situações resumidas na tabela a seguir.
Situação | Comportamento do AVStream |
---|---|
Um quadro chega em uma fila anteriormente vazia. |
O AVStream define a borda superior para apontar para esse quadro. |
A borda superior aponta para um quadro. O IRP correspondente a esse quadro é cancelado. |
O AVStream avança na borda superior. A borda superior agora aponta para um quadro mais recente. |
Consulte Introdução ao Stream Pointers Para obter mais informações sobre o avanço de ponteiros de fluxo.
Especificando um ponteiro de fluxo de borda à direita
Os minidrivers podem especificar que uma fila tem um ponteiro de fluxo de borda à direita. A borda à direita geralmente indica o quadro de interesse mais antigo para o minidriver. Para especificar uma borda à direita, defina o sinalizador KSPIN_FLAG_DISTINCT_TRAILING_EDGE no membro Flags da estrutura de KSPIN_DESCRIPTOR_EX relevante. Em seguida, chame KsPinGetTrailingEdgeStreamPointer para obter um ponteiro para o ponteiro de fluxo de borda à direita.
Quando a borda à direita avança, a contagem de referência no quadro ao qual ele apontou anteriormente cai para zero e o quadro é concluído. Se o quadro for o último contido em seu IRP, um pino de coletor concluirá o IRP para o chamador; um pino de origem envia o IRP para o pino ao qual ele está conectado.
Mantendo uma janela de quadro
Como resultado das regras de contagem de referência de quadro descritas em Introdução aos Ponteiros de Fluxo, um quadro entre a borda à esquerda e à direita permanece na fila até que seja cancelado, mesmo que o quadro não seja referenciado por um ponteiro de fluxo. Dessa forma, um minidriver pode usar os ponteiros de borda à esquerda e à direita para manter uma janela de trabalho de vários quadros contíguos. Quadros na janela podem estar aguardando processamento ou preenchimento, por exemplo.
No diagrama a seguir, os quadros mais antigos estão na parte inferior. Novos quadros chegam na parte superior. O número em cada quadro é a contagem de referência para esse quadro. Quando os ponteiros de fluxo avançam, eles se movem para cima neste diagrama.
A fila mais à esquerda mostra como o minidriver pode usar uma borda à direita para criar um conjunto de quadros de trabalho. Cada quadro entre a borda à esquerda e a direita tem uma contagem de referência de um, apesar do fato de que nenhum ponteiro de fluxo faz referência a esses quadros.
A fila intermediária é um exemplo de Clonagem de Ponteiros de Fluxo. O driver clonou repetidamente e, em seguida, avançou a borda superior, conforme descrito nas etapas do processo de fixação nos Serviços de DMA do AVStream.
A fila mais à direita mostra como o minidriver pode manter a contagem de referência para um quadro atrás da borda à direita usando um clone de ponteiro de fluxo.