Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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.