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