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


Обработка, ориентированная на штырь

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

Обработка, ориентированная на пин-код, означает, что AVStream вызывает подпрограмму отправки пин-кода мини-driver при поступлении новых кадров в очередь пин-кода.

Обработка, ориентированная на фильтр, означает, что AVStream вызывает подпрограмму обработки фильтра минидрайвера, когда для каждого экземпляра пина доступны данные. Обратите внимание, что эти определения указывают поведение по умолчанию; минидрайверы могут изменить поведение по умолчанию, задав флаги в структуре KSPIN_DESCRIPTOR_EX.

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

Для предоставления пин-ориентированного фильтра минидрайвер предоставляет указатель на подпрограмму обратного вызова AVStrMiniPinProcess в каждой структуре KSPIN_DISPATCH; не предоставляйте диспетчеризацию обработки в структуре KSFILTER_DISPATCH.

Если минидрайвер не изменяет настройки флагов в структуре KSPIN_DESCRIPTOR_EX, AVStream вызывает подпрограмму обратного вызова AVStrMiniPinProcess поставщика в трех ситуациях:

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

  • Прибывают новые фреймы. Закрепление должно находиться по крайней мере в минимальном состоянии обработки и не должно быть кадров в переднем крае или впереди.

  • Minidriver явно вызывает KsPinAttemptProcessing.

По умолчанию пауза — это минимальное состояние обработки.

Кроме того, AVStream не вызывает отправку процесса пин-кода, если шлюз PIN-кода закрыт. Если вы используете подпрограммы KSGATEXxx для добавления дополнительных входных данных в ворота PIN-кода, например, отправка процесса не будет вызвана.

Когда AVStream вызывает AVStrMiniPinProcess, он предоставляет указатель на пин-объект с доступными данными. Затем диспетчер обработки минидрайвера может получить ведущий указатель края, вызвав KsPinGetLeadingEdgeStreamPointer. Минидрайверы затем управляют данными потока с помощью API указателя потока.

Минидрайверы, использующие пин-центрированную обработку, могут изменить момент вызова AVStrMiniPinProcess, задав флаги в соответствующей структуре KSPIN_DESCRIPTOR_EX. Описания флагов на странице справочника по KSPIN_DESCRIPTOR_EX особенно важны для поставщиков, которые реализуют фильтры, ориентированные на пин-код.

Попытка обработки может завершиться ошибкой, если минидрайвер держит мьютекс обработки через KsPinAcquireProcessingMutex. Проблемы также могут возникнуть, если минидрайвер напрямую управляет шлюзом с помощью вызовов KSGATE*.

Пример драйвера для имитированного оборудования AVStream (AVSHwS), содержащийся в примерах комплекта драйверов Windows, представляет собой драйвер захвата, ориентированный на пины, для имитированного оборудования. В примере Avshws показано, как реализовать DMA через AVStream.