Processamento centrado em filtro

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

Para implementar o processamento centrado em filtro, forneça um ponteiro para uma rotina de retorno de chamada AVStrMiniFilterProcess fornecida pelo minidriver no membro Process da estrutura de 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 atenção especial às combinações dos sinalizadores mutuamente exclusivos 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 quadros por meio do uso das rotinas KsPinAttachAndGate ou KsPinAttachOrGate .

  • O número de instâncias de pino é igual ou maior que o 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 de filtro.

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

  • O minidriver não fechou a porta de controle 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 . O AVStream ordena a matriz de estruturas de KSPROCESSPIN_INDEXENTRY por ID do pino.

Os exemplos de código a seguir ilustram como usar as estruturas de pin do processo. O código é obtido do exemplo Avssamp (Driver de Captura Simulado) do AVStream Filter-Centric , 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 Kit de Driver do Windows.

O minidriver recebe uma matriz de estruturas de KSPROCESSPIN_INDEXENTRY em sua expedição 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 referenciar ProcessPinsIndex [n]. Fixa [0] antes de verificar se 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 o último for true, é garantido que o pino exista.)

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 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 acessar a estrutura de cabeçalho de fluxo correspondente ao ponteiro de fluxo atual e fixar:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

A maioria dos minidrivers que usam processamento centrado em filtro usa o ponteiro de fluxo apenas para acesso ao cabeçalho de fluxo. No modelo centrado em filtro, o AVStream manipula o ponteiro de fluxo internamente. Como resultado, os minidrivers devem continuar com cuidado se manipularem o ponteiro de fluxo em um driver centrado em filtro.