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


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

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

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

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

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

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

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

Сведения о том, как реализовать DMA в обратном вызове процесса закрепления, см. в разделе Пакетная DMA в AVStream.

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

Запись в VRAM

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

Затем мини-диск получает KSPROPERTY_DISPLAY_ADAPTER_GUID запрос get-property, запрашивающий GUID видеоадаптера.

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

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

Если пин-код получает KS_CAPTURE_ALLOC_VRAM, он получит запросы на обработку виртуальной памяти.

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

Драйвер захвата или драйвер минипорта дисплея должен сопоставить дескриптор поверхности 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.

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

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

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

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

  • Если драйвер записи выполняет метки времени, задайте PresentationTime, Duration и, если применимо, OptionsFlags в KSSTREAM_HEADER.

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

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