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


Разделители AVStream

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

Для этого задайте KSPIN_FLAG_SPLITTER в элементе Флаги структуры KSPIN_DESCRIPTOR_EX контакта. Если этот флаг установлен на контакте, он действует как автоматический разделитель. AVStream автоматически копирует все данные, необходимые для разделения потока.

В выпусках, более поздних, чем DirectX8.0, флаг KSPIN_FLAG_SPLITTER работает для контактов в фильтрах и фильтрах, ориентированных на закрепление . Предыдущие выпуски поддерживали этот флаг только для контактов на фильтрах.

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

Схема, иллюстрирующая фильтр avstream с выходным контактом разделители .

Кадры поступают на входной контакт и помещаются во входную очередь. Мини-накопитель взаимодействует только с входной очередью и выходной очередью для исходного контакта. AVStream автоматически копирует данные из очереди первого контакта во второй.

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

В структуре KSFILTER_DISPATCH мини-диск указывает указатель на предоставленную поставщиком процедуру обратного вызова AVStrMiniFilterProcess . В этой подпрограмме обратного вызова мини-driver получает указатель на структуру KSPROCESSPIN_INDEXENTRY , содержащую массив структур KSPROCESSPIN , показанный ниже.

На этой схеме показано, как мини-накопитель различает два выходных контакта в списке контактов процесса:

схема таблицы контактов процесса для двух разделенных контактов.

На этой схеме база данных ссылается на элемент DelegateBranch структуры KSPROCESSPIN, а CS — на элемент CopySource . Элементы DelegateBranch и CopySource входного контакта и первый выходной контакт имеют значение NULL. Это означает, что мини-диск отвечает за обработку кадров на этих контактах.

Второй выходной контакт, однако, имеет CopySource , который указывает на первый выходной контакт. Это означает, что второй выходной контакт находится в отдельном канале от первого выходного контакта и что AVStream автоматически копирует все данные, помещенные в очередь первого выходного контакта, в очередь второго выходного контакта.

Более сложные случаи разделения могут возникать, когда два выходных контакта встроены в один канал. Мини-диск может включать два выходных контакта на основе разделителя в одном канале, например, если подчиненные фильтры не изменяют данные, отправляемые с этих контактов. Так как данные не изменяются, выходные контакты считаются доступны только для чтения; Оба нисходящих фильтра получают одни и те же буферы.

Кроме того, возможно, что некоторые подчиненные фильтры, которые автоматически присоединяют к штырю разбиения, изменяют данные, а другие — нет.

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

схема, иллюстрирующая фильтр avstream с тремя разделенными выходными контактами .

Контакты A и B назначаются одному каналу, так как подчиненные фильтры не изменяют данные; Фильтры ниже A и B получают одни и те же указатели буфера.

Мини-накопитель взаимодействует только с входной очередью и одной выходной очередью. AVStream автоматически копирует данные из очереди A/B и очереди C. Он также создает объект разделифика, который отправляет одни и те же кадры данных через закрепление A и B (обратите внимание, что заголовки потока различаются).

Массив структур KSPROCESSPIN выглядит следующим образом:

схема таблицы контактов процесса для трех разделенных выходных контактов.

Единственный контакт, с которым мини-диск должен взаимодействовать в обычных обстоятельствах, — это контакт A.

Чтобы упростить приведенные выше схемы, инициаторы запроса и распределители были опущены в схемах. Схемы предназначены для демонстрации только процесса разделения кадров.