Partilhar via


Processamento centrado em filtros

Se um filtro usa processamento centrado em filtro, então, por padrão, o AVStream chama a rotina de retorno de chamada AVStrMiniFilterProcess fornecida pelo minidriver quando há quadros de dados disponíveis em cada instância de pino. Os minidrivers podem modificar esse comportamento padrão definindo o membro Flags da estrutura KSPIN_DESCRIPTOR_EX .

Para implementar o processamento centrado em filtros, forneça um ponteiro para uma rotina de callback AVStrMiniFilterProcess fornecida pelo minidriver no membro Process da estrutura KSFILTER_DISPATCH. Defina o membro Process de KSPIN_DISPATCH como NULL.

O AVStream chama AVStrMiniFilterProcess somente quando todas as seguintes condições são atendidas:

  • Os quadros estão disponíveis em pinos que exigem quadros para que o processamento ocorra. Os minidrivers podem modificar o comportamento de processamento definindo sinalizadores no membro Flags do KSPIN_DESCRIPTOR_EX. Preste especial atenção às combinações das bandeiras mutuamente exclusivas KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING e KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. O minidriver também pode modificar o conjunto de pinos que exigem frames utilizando as rotinas KsPinAttachAndGate ou KsPinAttachOrGate.

  • O número de instâncias de pino é igual ou superior ao membro InstancesNecessary da estrutura KSPIN_DESCRIPTOR_EX. O membro ClientState da estrutura KSPIN especifica o enumerador KSSTATE específico no qual o pino está definido no momento. Depois que InstancesNecessary for atendido, pinos adicionais no estado KSSTATE_STOP não impedirão o processamento do filtro.

  • O número necessário de instâncias de pino é cumprido (conforme especificado pelo membro InstancesNecessary da estrutura KSPIN_DESCRIPTOR_EX).

  • O minidriver não fechou a barreira de controlo de processo do filtro usando as funções KSGATEXxx.

Na rotina de retorno de chamada AVStrMiniFilterProcess , o minidriver recebe um ponteiro para uma matriz de estruturas KSPROCESSPIN_INDEXENTRY . AVStream ordena a matriz de estruturas KSPROCESSPIN_INDEXENTRY por ID de pin.

Os exemplos de código a seguir ilustram como usar as estruturas de pinos de processo. O código é retirado do exemplo AVStream Filter-Centric Simulated Capture Driver (Avssamp), que demonstra como escrever um driver de captura centrado em filtro. O código-fonte e uma descrição deste exemplo estão incluídos no download de exemplos do Windows Driver Kit.

O minidriver recebe uma matriz de estruturas de KSPROCESSPIN_INDEXENTRY em seu despacho de processo de filtro. Neste exemplo, o minidriver extrai a primeira estrutura KSPROCESSPIN da estrutura KSPROCESSPIN_INDEXENTRY do índice VIDEO_PIN_ID:

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

O minidriver não deve fazer referência a ProcessPinsIndex [n].Pins [0] antes de ter verificado que o membro Count de ProcessPinsIndex [n] é pelo menos um, ou que o membro InstancesNecessary da estrutura KSPIN_DESCRIPTOR_EX contida em Pins [0] é pelo menos um. (Se este último for verdadeiro, é garantido que o pino existe.)

Em seguida, para especificar o pino no qual capturar quadros, a rotina de retorno de chamada AVStrMiniFilterProcess passa um ponteiro para uma estrutura KSPROCESSPIN para CaptureFrame, uma rotina de captura fornecida pelo fornecedor:

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

A rotina de captura pode então copiar de ou para o membro Data da estrutura KSPROCESSPIN. Ele também pode atualizar os membros BytesUsed e Terminate dessa estrutura, como no exemplo a seguir:

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

O minidriver também pode aceder à estrutura do cabeçalho do fluxo correspondente ao ponteiro de fluxo e ao pino atuais.

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

A maioria dos minidrivers que utilizam processamento centrado em filtros usam o ponteiro de fluxo apenas para acessar o cabeçalho do fluxo. No modelo baseado em filtro, o AVStream manipula o ponteiro de fluxo internamente. Como resultado, os minidrivers devem ter cautela ao manipular o ponteiro de fluxo num driver centrado em filtro.