estrutura KSPIN_DESCRIPTOR_EX (ks.h)

A estrutura KSPIN_DESCRIPTOR_EX descreve as características de um tipo de pino em um determinado tipo de filtro.

Sintaxe

typedef struct _KSPIN_DESCRIPTOR_EX {
  const KSPIN_DISPATCH         *Dispatch;
  const KSAUTOMATION_TABLE     *AutomationTable;
  KSPIN_DESCRIPTOR             PinDescriptor;
  ULONG                        Flags;
  ULONG                        InstancesPossible;
  ULONG                        InstancesNecessary;
  const KSALLOCATOR_FRAMING_EX *AllocatorFraming;
  PFNKSINTERSECTHANDLEREX      IntersectHandler;
} KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX;

Membros

Dispatch

Um ponteiro para a estrutura KSPIN_DISPATCH para esse pino. Esse ponteiro é opcional e só deve ser fornecido por clientes que desejam receber notificações. Os clientes que precisam executar o processamento centrado em pin (filtros relacionados ao roteamento de dados, em outras palavras, drivers de hardware) devem fornecer essa tabela de expedição e uma expedição de processo. Consulte KSPIN_DISPATCH para obter mais informações.

AutomationTable

Um ponteiro para a estrutura KSAUTOMATION_TABLE para esse pino. A tabela de automação contém as propriedades, métodos e eventos compatíveis com o pin. Essa tabela de automação é mesclada com a tabela de automação fornecida pelo AVStream para todos os pinos. Se o cliente fornecer qualquer propriedade, evento ou manipuladores de método que já sejam fornecidos pelo AVStream, a implementação do cliente substituirá a do AVStream.

PinDescriptor

Esse membro especifica uma estrutura do tipo KSPIN_DESCRIPTOR.

Flags

Especifica um valor do tipo ULONG. Essa pode ser qualquer combinação dos sinalizadores listados na lista a seguir. Especifique sinalizadores usando um OR bit a bit, com as seguintes exceções: KSPIN_FLAG_CRITICAL_PROCESSING e KSPIN_FLAG_HYPERCRITICAL_PROCESSING são mutuamente exclusivos. KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING e KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL são mutuamente exclusivos. KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING e KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING são mutuamente exclusivos. KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY e KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE são mutuamente exclusivos.

KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING

Indica que o minidriver solicita que a expedição do processo ocorra no IRQL DISPATCH_LEVEL em vez de PASSIVE_LEVEL.

KSPIN_FLAG_CRITICAL_PROCESSING

Se o processamento assíncrono tiver sido especificado ou se o sistema estiver em execução em PASSIVE_LEVEL e uma chamada de processo chegar em DISPATCH_LEVEL, o processamento será feito em um item de trabalho enfileirado. Esse sinalizador indica que o item de trabalho deve ser colocado na fila de trabalho crítica em vez da fila de trabalho atrasada.

KSPIN_FLAG_HYPERCRITICAL_PROCESSING

Se o processamento assíncrono tiver sido especificado ou se o sistema estiver em execução em PASSIVE_LEVEL e uma chamada de processo chegar em DISPATCH_LEVEL, o processamento será feito em um item de trabalho enfileirado. Esse sinalizador indica que o item de trabalho deve ser colocado na fila de trabalho hipercrítica em vez da fila de trabalho atrasada ou da fila de trabalho crítica.

KSPIN_FLAG_ASYNCHRONOUS_PROCESSING

Indica que o pino deve processar dados de forma assíncrona. Se esse sinalizador estiver definido, o AVStream não aguardará que uma expedição de processo seja chamada antes de prosseguir com quadros adicionais.

KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING

O AVStream chama a expedição de processamento somente quando o minidriver chama explicitamente KsXxxAttemptProcessing. Útil para clientes que pretendem sondar diretamente a fila em, por exemplo, hora de DPC para transportar dados para hardware.

KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL

Indica que o processamento deve ocorrer sempre que um quadro de dados chega à fila. Se esse sinalizador não for especificado, a expedição do processo só será chamada quando os dados chegarem a uma fila vazia anteriormente.

KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING

Indica que os quadros não são necessários nesse pin para que o processamento seja iniciado. Mesmo que não existam quadros na fila, uma alteração de estado agora será suficiente para fazer com que o AVStream chame a expedição de processamento. Esse sinalizador é útil apenas para filtros centrados em filtro. Pinos que não especificam esse sinalizador atrasam o processamento no filtro se eles não tiverem quadros disponíveis. Os pinos que especificam esse sinalizador não atrasam o processamento dessa maneira. Se um pino especificar esse sinalizador, ele se tornará responsabilidade da expedição do processo para marcar para quadros disponíveis.

KSPIN_FLAG_ENFORCE_FIFO

Especificar esse sinalizador faz com que a fila force os IRPs a serem manipulados de maneira inicial. Se um IRP for concluído pelo minidriver antes de um IRP que foi enviado anteriormente, o IRP posterior não será concluído pelo AVStream até que o IRP anterior seja concluído pelo minidriver.

KSPIN_FLAG_GENERATE_MAPPINGS

Especificar esse sinalizador faz com que o AVStream gere automaticamente mapeamentos de dispersão/coleta para um quadro enfileirado quando o minidriver bloqueia um ponteiro de fluxo referenciando esse quadro. Os clientes que pretendem usar esse recurso precisam registrar o objeto do adaptador DMA com o AVStream por meio da função KsDeviceRegisterAdapterObject . Consulte o membro DataUsed de KSSTREAM_HEADER para obter o efeito desse sinalizador na estrutura KSSTREAM_HEADER. Veja também KSSTREAM_POINTER_OFFSET.

KSPIN_FLAG_DISTINCT_TRAILING_EDGE

Indica que a fila associada ao pino deve ter um ponteiro de fluxo de borda à direita. O ponteiro de borda à direita é um ponteiro de fluxo especial que aponta para os dados mais antigos da fila, a menos que existam ponteiros de clone em dados mais antigos. Todos os quadros de dados na janela entre os ponteiros de fluxo de borda à esquerda e à direita são considerados com pelo menos uma contagem de referência e não são concluídos até que eles saiam da janela avançando na borda à direita com as funções KsPinGetTrailingEdgeStreamPointer e uma das funções KsStreamPointerAdvanceXxx ou KsStreamPointerUnlock . Os pinos que não especificam esse sinalizador não têm um ponteiro de fluxo de borda à direita.

KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY

Indica que o AVStream só deve chamar esse pino para processar quando o pino estiver em KSSTATE_RUN. Altera o estado de processamento mínimo de pausa para execução. O AVStream chama esse pin para processar depois de dizer a ele para ir para o estado de execução, mesmo que os quadros cheguem. Qualquer pin que especifica esse sinalizador e faz parte de um filtro centrado em filtro faz com que o filtro não seja processado se o pino especificado não estiver em KSSTATE_RUN.

KSPIN_FLAG_SPLITTER

Indica que esse pino (um pino de saída) é um divisor. Os pinos que especificam esse sinalizador devem indicar um número de instâncias possíveis maiores que uma. Quando uma segunda instância desse pino é criada, o AVStream configura automaticamente um divisor para que os quadros enviados para o pino original sejam copiados para o novo pino. Observe que essa cópia é feita automaticamente pelo AVStream. Normalmente, os clientes podem ignorar os pinos de processo que têm ponteiros DelegateBranch e CopySource não NULL. Esses membros indicam que o pino faz parte de um branch de divisor e é tratado automaticamente pelo AVStream. Em versões pós-DirectX 8.0, esse sinalizador funciona para fixações em filtros centrados em filtros centrados em filtros e centrados em pin. Versões mais antigas dão suporte a esse sinalizador somente para pinos em filtros centrados em filtros.

KSPIN_FLAG_USE_STANDARD_TRANSPORT

Esse sinalizador força o pino a usar o mecanismo de transporte padrão. Ele substitui todas as outras verificações (tipo de comunicação, tipo médio, tipo de interface etc.) no pino. Especificar esse sinalizador e KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT resulta no transporte padrão que está sendo usado. Esse sinalizador substitui todas as outras verificações.

KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT

Indica que o pino não usa o mecanismo de transporte padrão. Os pinos que não usam o mecanismo de transporte padrão não pertencerão a uma seção de pipe e não terão filas associadas.

KSPIN_FLAG_FIXED_FORMAT

Indica que esse pino usa um formato de dados fixo. Qualquer tentativa de definir o formato de dados retorna STATUS_INVALID_DEVICE_REQUEST.

KSPIN_FLAG_GENERATE_EOS_EVENTS

Indica que esse pino manipula solicitações de suporte a eventos de conexão.

KSPIN_FLAG_RENDERER

Especifica que esse pino é capaz de renderizar quadros.

KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING

Quando especificado em um pino de filtro centrado em filtro, indica que uma ou mais instâncias do tipo de pino em questão devem ter quadros disponíveis para processar dados. Mutuamente exclusivo com KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING.

Observe que esse comportamento pode ser obtido por meio de KsPinAttachOrGate configurando manualmente um portão OR como o portão de quadro para cada instância do pino e anexando esse portão OR ao portão AND do filtro.

Ao usar esse sinalizador, os minidrivers não podem chamar KsPinAttachAndGate ou KsPinAttachOrGate nas instâncias de pin associadas. (O sinalizador faz isso efetivamente para você para o caso OR simples.) Consulte também Processamento centrado em filtro.

KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE

Quando especificado em um pino centrado em filtro , indica que o processamento pode ocorrer quando uma ou mais instâncias de pinos tão sinalizadas estão no estado de execução. Todos os pinos não interrompidos ainda devem estar em pelo menos pausa para processar dados. Não use esse sinalizador se o pino correspondente for um pino de saída e esse pino estiver envolvido em uma transformação in-loco.

KSPIN_FLAG_DENY_USERMODE_ACCESS

Esse sinalizador impede o acesso do modo de usuário a esse pin específico.

KSPIN_FLAG_IMPLEMENT_CLOCK

Indica que esse pino expõe um relógio que pode ser selecionado pelo gerenciador de grafo como um relógio master. Consulte também Relógios AVStream.

InstancesPossible

Especifica um valor do tipo ULONG que contém uma contagem do número máximo de instâncias possíveis desse pino. Qualquer tentativa de instanciar mais do que esse número de pinos do tipo especificado falha. Defina como KSINSTANCE_INDETERMINATE para não ter limite no número de pinos instanciados.

InstancesNecessary

Especifica um valor do tipo ULONG que contém o número mínimo de pinos de um determinado tipo de pino que são necessários para estar em um estado no ou acima do nível mínimo de processamento para o funcionamento adequado do filtro. Por padrão, o nível mínimo de processamento é KSSTATE_PAUSE, embora o minidriver possa modificar o comportamento padrão definindo o membro Flags dessa estrutura como KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY ou KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE. Qualquer tentativa de alterar o estado de um filtro que não tenha esse número de instâncias desse tipo de pin falha. Consulte informações adicionais na seção Comentários.

AllocatorFraming

Um ponteiro para uma estrutura de KSALLOCATOR_FRAMING_EX que contém os requisitos de enquadramento do alocador para esse tipo de pino. O enquadramento do alocador especifica itens como requisitos de alinhamento de memória, tamanho máximo do quadro e tamanho mínimo do quadro. Esse membro pode ser NULL, o que indica que esse pin não dá suporte à propriedade de enquadramento do alocador.

IntersectHandler

Um ponteiro para uma função KStrIntersectHandlerEx definida pelo driver para lidar com a interseção de dados. Se esse membro for NULL, o pino manipulará consultas de interseção de dados para intervalos de dados com o especificador KSDATAFORMAT_SPECIFIER_NONE. A função de manipulador de interseção recebe um único intervalo de dados da consulta e um único intervalo de dados da lista de pinos de intervalos de dados. Os GUIDs de tipo, subtipo e especificador desses intervalos têm a garantia de corresponder, embora alguns possam ser curingas. A função indica que os intervalos de dados não correspondem ou produz o melhor formato de dados na interseção dos dois intervalos de dados. Consulte Interseções de intervalo de dados no AVStream para obter mais informações.

Comentários

O AMCap e o Blink podem não conseguir encontrar interfaces de sintonizador e de barra cruzada no driver AVStream se o membro InstancesNecessary de KSPIN_DESCRIPTOR_EX estiver definido como zero para o pino de entrada de vídeo analógico. Para corrigir esse problema, defina InstancesNecessary para esse pin como um.

Observe que os requisitos de enquadramento do alocador do pin podem ser ignorados, apesar do fato de que o enquadramento do alocador especifica que o alinhamento ou o tamanho são absolutamente necessários para ser um determinado valor. Se o driver do modo kernel estiver conectado a um filtro de modo de usuário upstream que aloca para ele e o alocador do filtro de upstream específico não entender os requisitos de enquadramento, isso poderá acontecer (exemplos específicos atuais incluem o divisor MPEG-2).

Além disso, se você especificar KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING e o pino usar o mecanismo de transporte padrão, deverá ter um objeto de processamento. Isso significa que deve haver alguma expedição de processo fornecida (no nível do filtro ou no nível do pino); mesmo que essa função nunca seja chamada, ela deve ser fornecida nesta circunstância.

Interseções de intervalo de dados em divisores AVStream e AVStream.

Requisitos

Requisito Valor
Cabeçalho ks.h (inclua Ks.h)

Confira também

KSALLOCATOR_FRAMING_EX

KSPIN_DESCRIPTOR

KSPIN_DISPATCH

KsDeviceRegisterAdapterObject