Partilhar via


Controle de filtro Mutex no AVStream

Cada instância de filtro AVStream tem um mutex de controle de filtro associado. Esse mutex é usado para sincronizar o acesso à hierarquia de objetos, desde o filtro até aos pinos individuais. Criação e destruição de filtros e pinos é sincronizada com este mutex.

A hierarquia de objetos é garantida para ser estável apenas a partir de uma instância de filtro específica para baixo enquanto o mutex de controle de filtro é mantido. Assim, o minidriver deve obter o mutex de controle de filtro antes de percorrer a hierarquia de objetos abaixo do nível de filtro usando as funções KsXxxGetFirstChildXxx e KsXxxGetNextSiblingXxx.

O mutex de controlo do filtro também é utilizado para sincronizar transições de estado.

O AVStream obtém o mutex de controle de filtro quando manipula propriedades que exigem que a hierarquia permaneça estável, como ao realizar a modificação do descritor.

Lembre-se de que um único mutex de controle de filtro é usado para a hierarquia de objetos sob cada filtro individual. Isso significa que um objeto "pin" utiliza o mutex de controle do filtro do elemento pai quando um minidriver invoca uma função com um objeto "pin".

O AVStream mantém o mutex de controle do filtro em nome do minidriver quando ele chama as seguintes rotinas fornecidas pelo minidriver:

À semelhança do dispositivo mutex, o mutex de controlo do filtro não deve ser obtido recursivamente. Se, por exemplo, o AVStream realizar um callback para um minidriver para um despacho Create no contexto da thread A, e o minidriver mais tarde tentar obter o mutex de dentro da thread A, a thread A ficará bloqueada consigo mesma.

Um impasse pode ocorrer se você executar uma das seguintes ações:

  • Tente adquirir o mutex de controle de filtro de dentro da rotina do processo.

  • Tente obter o mutex de controlo do filtro dentro do callback para o modo Sleep ou Wake.

Para manipular o mutex de controle de filtro, use as seguintes funções:

KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl