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


Начальные и конечные указатели потоков данных

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

При поступлении нового кадра в очередь AVStream устанавливает передний край, указывающий на этот кадр, при условии, что передний край еще не указывает на новый кадр.

Чтобы получить указатель на ведущий край потока, минидрайвер вызывает KsPinGetLeadingEdgeStreamPointer.

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

Ситуация Поведение AVStream

Кадр поступает в ранее пустую очередь.

AVStream направляет переднюю часть к этому кадру.

Передний край указывает на кадр. IRP, соответствующий этому кадру, отменен.

AVStream продвигает передовые технологии. Теперь передний край указывает на более новый кадр.

Дополнительные сведения о продвижении указателей потоков можно найти в разделе Введение в указатели потоков.

Указание указателя на потоковую линию следа

Минидрайверы могут задать для очереди указатель потока на границу потока. Задняя кромка обычно указывает на самый старый кадр, представляющий интерес для минидрайвера. Чтобы указать конечный край, задайте флаг KSPIN_FLAG_DISTINCT_TRAILING_EDGE в элементе Flags соответствующей структуры KSPIN_DESCRIPTOR_EX. Затем вызовите KsPinGetTrailingEdgeStreamPointer, чтобы получить указатель на конечный пограничный поток.

Когда задняя граница перемещается, счётчик ссылок на кадр, на который она ранее указывала, падает до нуля, и кадр завершает выполнение. Если кадр является последним, содержащимся в его IRP, входной штифт завершает обработку IRP для вызывающего объекта; Исходный штифт отправляет IRP на штифт, с которым он соединен.

Поддержка рамочного окна

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

На следующей схеме самые старые кадры находятся внизу. Новые кадры появляются наверху. Число в каждом кадре — это число ссылок для этого кадра. Когда указатели потока сдвигаются вперёд, они перемещаются вверх на этой схеме.

диаграмма, иллюстрирующая указатели потоков avstream, которые ссылаются на очереди контактов.

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

Средняя очередь является примером клонирования указателей потока. Драйвер неоднократно клонировал и затем развил ведущую кромку, как описано в шагах процесса pin в AVStream DMA Services.

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