Compartilhar via


Processamento centrado em filtro

Se um filtro usar o processamento centrado em filtro, o AVStream chama por padrão a rotina de retorno de chamada AVStrMiniFilterProcess fornecida pelo minidriver quando houver 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 de KSPIN_DESCRIPTOR_EX .

Para implementar o processamento centrado em filtro, forneça um ponteiro para uma rotina de retorno de chamada AVStrMiniFilterProcess fornecida pelo próprio 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 de dados estão disponíveis nos pinos que os exigem 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 requerem frames por meio do uso das rotinas KsPinAttachAndGate ou KsPinAttachOrGate.

  • O número de instâncias de pinos é 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 pinos é atendido (conforme especificado pelo membro InstancesNecessary da estrutura KSPIN_DESCRIPTOR_EX).

  • O minidriver não fechou o portão de controle de processo do filtro ao usar as funções KSGATEXxx.

Na rotina de retorno de chamada AVStrMiniFilterProcess, o minidriver recebe um apontador para estruturas de matriz KSPROCESSPIN_INDEXENTRY. AVStream ordena a matriz de estruturas KSPROCESSPIN_INDEXENTRY por ID do pino.

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

O minidriver recebe uma matriz de estruturas KSPROCESSPIN_INDEXENTRY em seu processo de despacho 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]. Pinos [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 Pinos [0] é pelo menos um. (Se este último for verdadeiro, é garantido que o pin 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 de dados 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 pino.

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

A maioria dos minidrivers que utilizam o processamento centrado em filtro usam 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 ter cuidado ao manipular o ponteiro de stream em um driver centrado em filtro.