Свойства записи 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) показывает один из способов реализации этого обратного вызова для поддержки виртуальной памяти.