Поделиться через


Фильтрация мьютекса элемента управления в AVStream

Каждый экземпляр фильтра AVStream имеет связанный мьютекс элемента управления фильтром. Этот мьютекс используется для синхронизации доступа к иерархии объектов от фильтра вниз к отдельным контактам. Создание и уничтожение фильтров и контактов синхронизируются с этим мьютексом.

Иерархия объектов гарантированно будет стабильной только от определенного экземпляра фильтра вниз, пока хранится мьютекс элемента управления фильтра. Соответственно, мини-диск должен получить мьютекс элемента управления фильтром перед обходом иерархии объектов ниже уровня фильтра с помощью функций KsXxxGetFirstChildXxx и KsXxxGetNextSiblingXxx .

Мьютекс элемента управления фильтром также используется для синхронизации переходов состояния.

AVStream получает мьютекс элемента управления фильтром при обработке свойств, требующих стабильной иерархии, например при изменении дескриптора.

Имейте в виду, что для иерархии объектов в каждом отдельном фильтре используется один мьютекс элемента управления фильтра. Это означает, что закрепленный объект использует мьютекс родительского элемента управления фильтрами, когда мини-диск вызывает функцию с закрепленным объектом.

AVStream хранит мьютекс элемента управления фильтром от имени мини-драйвера при вызове следующих подпрограмм, предоставляемых мини-driver:

Как и мьютекс устройства, мьютекс элемента управления фильтром не должен быть получен рекурсивно. Если, например, AVStream выполняет обратный вызов мини-driver для отправки Create в контексте потока A, а мини-диск позже пытается получить мьютекс из потока A, поток A взаимоблокирует с самим собой.

Взаимоблокировка может возникнуть, если выполнить одно из следующих действий:

  • Попробуйте получить мьютекс элемента управления фильтром из подпрограммы процесса.

  • Попробуйте получить мьютекс элемента управления фильтром из обратного вызова спящего режима или пробуждения.

Чтобы управлять мьютексом элемента управления фильтром, используйте следующие функции:

KsAcquireControl, KsFilterAcquireControl, KsPinAcquireControl, KsReleaseControl, KsFilterReleaseControl, KsPinReleaseControl