Свойства записи VRAM

Мини-драйвер AVStream, ориентированный на пины, должен поддерживать несколько свойств, чтобы он мог захватывать в VRAM. В этом разделе описывается последовательность запросов, которые минидрайвер получает перед обработкой VRAM и во время неё.

Перед началом записи прокси-сервер KS отправляет запрос KSPROPERTY_PREFERRED_CAPTURE_SURFACE get-property. Минидрайвер должен возвращать разные значения в зависимости от того, захватывает ли драйвер в системную память или VRAM.

Запись в системную память

Чтобы записать в системную память, верните KS_CAPTURE_ALLOC_SYSTEM_AGP.

Затем драйвер записи получает запрос KSPROPERTY_CURRENT_CAPTURE_SURFACE set-property с типом значения системной памяти. Драйвер захвата теперь действует как ведущее устройство шины DMA и помещает данные непосредственно в системную память.

В этом режиме драйвер захвата получает буферы памяти системы в функции обратного вызова AVStrMiniPinProcess выходного пина.

Чтобы узнать, как реализовать DMA в функции обратного вызова пина, см. раздел «Пакетно-ориентированное DMA в AVStream».

Для записи с несколькими пин-кодами вывода (например, отдельные пин-коды видео, аудио и VBI), каждый пин-код должен поддерживать свойства и обработку VRAM, как описано ранее. Прокси-сервер создает отдельный поток для каждого пина.

Запись в VRAM

Если драйвер поддерживает запись VRAM, верните KS_CAPTURE_ALLOC_VRAM в ответ на KSPROPERTY_PREFERRED_CAPTURE_SURFACE.

Затем минидрайвер получает запрос свойства KSPROPERTY_DISPLAY_ADAPTER_GUID на получение GUID адаптера дисплея.

Получите GUID адаптера из предоставленного поставщиком драйвера графического минипорта. Структура DXGK_INTERFACESPECIFICDATA содержит GUID адаптера для возврата в запросе свойства. Эта структура создается подсистемой ядра графики DirectX (DXGK) и передается в драйвер минипорта при инициализации адаптера.

Если контакт поддерживает транспортировку VRAM, и идентификаторы GUID адаптера дисплея и нижнего фильтра совпадают, то в качестве аллокатора выбирается модуль прокси-сервера KS. Прокси уведомляет контакт захвата о выборе метода транспорта поверхности VRAM между контактами, задав свойство KSPROPERTY_CURRENT_CAPTURE_SURFACE с выбранным типом поверхности для захвата.

Если пин получает KS_CAPTURE_ALLOC_VRAM, он получит запросы на выделение VRAM.

Запросы на обработку VRAM состоят из двух частей. Во-первых, драйвер захвата получает запрос на получение KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Обработчик получения получает IRP, содержащий дескриптор поверхности VRAM в режиме ядра.

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

Возвращает сопоставленный адрес в VRAM_SURFACE_INFO_PROPERTY_S , предоставленном в запросе свойства. Драйвер захвата может выдавать IOCTL для запроса сопоставления от драйвера мини-порта отображения.

Во-вторых, AVStrMiniPinProcess фильтра захвата вызывается, когда у пина есть данные для обработки.

Теперь минидрайвер должен вызвать KsPinGetLeadingEdgeStreamPointer, чтобы получить и заблокировать указатель на переднюю кромку потока для этого пина. Эта функция возвращает указатель на структуру KSSTREAM_POINTER .

Эта структура указателя потока содержит указатель на KSSTREAM_HEADER.

В параметре Data заголовка потока найдите указатель на структуру VRAM_SURFACE_INFO.

Эта структура содержит физический адрес, возвращенный в ответ на KSPROPERTY_MAP_CAPTURE_HANDLE_TO_VRAM_ADDRESS. Элемент hSurface , представляющий дескриптор , имеет значение NULL.

Драйвер записи должен:

  • Запрограммировать оборудование записи с помощью физического адреса VRAM.

  • Обработка завершения видеокадров.

  • Заполните элемент cbCaptured VRAM_SURFACE_INFO числом байтов, скопированных в поверхность VRAM. Не задавайте элемент DataUsed структуры KSSTREAM_HEADER числом захваченных байт. Вместо этого установите DataUsed равным sizeof(VRAM_SURFACE_INFO).

  • Если драйвер захвата выполняет установку временной метки, задайте PresentationTime, Длительность и, если это необходимо, OptionsFlags в KSSTREAM_HEADER.

  • Вызовите KsStreamPointerAdvanceOffsets, чтобы продолжить обработку или удалить все клоны и завершить запрос, вызвав KsStreamPointerDelete.

Метод CCapturePin::ProcessD3DSurface в файле Capture.cpp в примере драйвера AVStream Simulated Hardware Sample Driver (AVSHwS) в наборе драйверов Windows (WDK) предлагает способ реализации этого обратного вызова для поддержки VRAM.