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


Фильтрация обработки

Если фильтр использует обработку, ориентированную на фильтрацию, то по умолчанию AVStream вызывает подпрограмму обратного вызова AVStrMiniFilterProcess , предоставляемую мини-driver, при наличии кадров данных, доступных для каждого экземпляра закрепления. Мини-драйверы могут изменять это поведение по умолчанию, задавая элемент Flagsструктуры KSPIN_DESCRIPTOR_EX .

Чтобы реализовать обработку, ориентированную на фильтры, укажите указатель на подпрограмму обратного вызова AVStrMiniFilterProcess в элементе Processструктуры KSFILTER_DISPATCH . Задайте для элемента ПроцессаKSPIN_DISPATCHзначение NULL.

AVStream вызывает AVStrMiniFilterProcess только при выполнении всех следующих условий:

  • Кадры доступны на контактах, для обработки которых требуются кадры. Мини-драйверы могут изменять поведение обработки, устанавливая флаги в элементе ФлагиKSPIN_DESCRIPTOR_EX. Обратите особое внимание на сочетания взаимоисключающих флагов KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING и KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING. Мини-driver также может изменять набор контактов, для которых требуются кадры, с помощью процедур KsPinAttachAndGate или KsPinAttachOrGate .

  • Число экземпляров закреплений равно или больше элемента InstancesNecessaryструктуры KSPIN_DESCRIPTOR_EX . Элемент ClientState структуры KSPIN указывает конкретный перечислитель KSSTATE , в котором в данный момент задано закрепление. После выполнения экземпляровNecessary дополнительные контакты в состоянии KSSTATE_STOP не помешают обработке фильтров.

  • Выполняется требуемое количество экземпляров контактов (как указано в элементе InstancesNecessary структуры KSPIN_DESCRIPTOR_EX .

  • Мини-диск не закрыл шлюз управления процессом фильтра с помощью функций KSGATEXxx .

В подпрограмме обратного вызова AVStrMiniFilterProcess мини-диск получает указатель на массив KSPROCESSPIN_INDEXENTRY структур. AVStream упорядочивает массив структур KSPROCESSPIN_INDEXENTRY по идентификатору контакта.

В следующих примерах кода показано, как использовать структуры закрепления процесса. Код взят из примера AVStream Filter-Centric Simulated Capture Driver (Avssamp), в котором показано, как написать драйвер отслеживания, ориентированный на фильтрацию. Исходный код и описание этого примера включены в скачиваемые примеры комплекта драйверов Для Windows.

Мини-диск получает массив KSPROCESSPIN_INDEXENTRY структур в процессе фильтрации. В этом примере мини-диск извлекает первую структуру KSPROCESSPIN из KSPROCESSPIN_INDEXENTRY структуры индекса VIDEO_PIN_ID:

NTSTATUS
CCaptureFilter::
Process (
    IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex
    )
{
PKSPROCESSPIN VideoPin = NULL;
...
VideoPin = ProcessPinsIndex [VIDEO_PIN_ID].Pins [0];
...
}

Мини-диск не должен ссылаться на ProcessPinsIndex [n]. Закрепляет [0] перед проверкой того, что элемент Countэлемента ProcessPinsIndex [n] является по крайней мере одним или что элемент InstancesNecessary структуры KSPIN_DESCRIPTOR_EX, содержащейся в pins [0], является по крайней мере одним. (Если последнее имеет значение true, закрепление гарантированно существует.)

Затем, чтобы указать закрепление кадров, подпрограмма обратного вызова AVStrMiniFilterProcess передает указатель на структуру KSPROCESSPIN в CaptureFrame, предоставляемую поставщиком:

VidCapPin -> CaptureFrame (VideoPin, m_Tick);

Затем подпрограмма отслеживания может скопировать в элемент Data структуры KSPROCESSPIN или из нее. Он также может обновить элементы BytesUsed и Terminate этой структуры, как показано в следующем примере:

RtlCopyMemory ( ProcessPin -> Data,
                m_SynthesisBuffer,
                m_VideoInfoHeader -> bmiHeader.biSizeImage
               );
ProcessPin -> BytesUsed = m_VideoInfoHeader -> bmiHeader.biSizeImage;
ProcessPin -> Terminate = TRUE;

Мини-диск также может получить доступ к структуре заголовка потока, соответствующей текущему указателю потока, и закрепить:

PKSSTREAM_HEADER StreamHeader = ProcessPin -> StreamPointer -> StreamHeader;

Большинство мини-драйверов, использующих фильтрацию, используют указатель потока только для доступа к заголовку потока. В модели, ориентированной на фильтры, AVStream управляет указателем потока внутри системы. В результате мини-накопители должны действовать с осторожностью, если они управляют указателем потока в драйвере, ориентированном на фильтрацию.