AVStream Splitters

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

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

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

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

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

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

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

В структуре KSFILTER_DISPATCH минидрайвер указывает указатель на функцию обратного вызова AVStrMiniFilterProcess, предоставленную поставщиком. Эта функция обратного вызова предоставляет минидрайверу указатель на структуру 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.

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