Общий буфер DMA в AVStream

Общий доступ к прямой памяти буфера (DMA) возникает, когда устройство не записывает непосредственно в буферы записи; вместо этого он копирует данные в общий буфер и из него.

Чтобы использовать DMA общего буфера в минидрайвере AVStream, следуйте следующим шагам.

  1. Получите адаптер DMA, вызвав IoGetDmaAdapter, как в случае пакетной DMA. Не указывайте KSPIN_FLAG_GENERATE_MAPPINGS в элементе Flags структуры KSPIN_DESCRIPTOR_EX и не регистрируйте адаптер DMA в AVStream. Возможно, вам потребуется реализовать собственную частную схему буфера или копирования.

  2. Регистрация подпрограммы службы прерываний (ISR), как описано в документации «Написание мини-драйверов AVStream для оборудования»

Если элемент Flags структуры KSPIN_DESCRIPTOR_EX устанавливает значение KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING, перед вызовом AVStrMiniPinProcess выполняется следующее:

  1. Минидрайвер настраивает общие буферные передачи.

  2. Ядро вызывает ISR, зарегистрированное поставщиком ранее. В ISR, минидрайвер ставит в очередь отложенный вызов процедуры (DPC).

  3. Когда общий буфер заполнен, минидрайвер вызывает KsPinAttemptProcessing из DPC.

  4. AVStream вызывает обработку процесса, если выполняются условия, указанные членом Flags из KSPIN_DESCRIPTOR_EX.

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

  1. Вызов KsPinGetLeadingEdgeStreamPointer:

    KSSTREAM_POINTER *Leading = KsPinGetLeadingEdgeStreamPointer (
                    Pin,
                    State
                   );
    
  2. Скопируйте данные кадра в Leading-StreamHeader-Data>>, а затем установите необходимые флаги и сведения о метках времени в соответствующем KSSTREAM_HEADER.

  3. Вызов KsStreamPointerUnlock с параметром Eject , равным TRUE. (Это значение Eject приводит к перемещению указателя потока вперёд.)

  4. Вернуть STATUS_PENDING.

AvStream затем управляет очередью на основе флагов, заданных минидрайвером в структуре KSPIN_DESCRIPTOR_EX.