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


Поддержка захвата видео и других дочерних устройств

Драйвер минипорта дисплея и драйвер для устройства захвата видео или другого дочернего устройства могут взаимно определять частный интерфейс, который дочерний драйвер может использовать для взаимодействия со своим устройством через родительский драйвер минипорта. Дочерний драйвер захвата видео должен быть тесно связан с драйвером минипорта родительского дисплея. На самом деле захват видео может быть реализован как часть драйвера мини-порта дисплея. Драйвер видеозахвата может использовать частный интерфейс с драйвером мини-порта дисплея для доступа к шине I2C и для других целей.

Чтобы инициализировать частный интерфейс, драйвер видеосъемки отправляет IRP_MN_QUERY_INTERFACE запрос драйверу порта дисплея (часть Dxgkrnl.sys) для драйвера минипорта дисплея. После того как драйвер порта дисплея получит такой запрос, он вызывает функцию DxgkDdiQueryInterface драйвера мини-порта и передает указатель на структуру QUERY_INTERFACE , которая содержит сведения для инициализации частного интерфейса.

Примечание Если захват видео реализован как часть драйвера минипорта дисплея, видеозахват может вызвать dxgkDdiQueryInterface напрямую.

Каждый драйвер дочернего устройства (включая устройства захвата видео) должен возвращать guid адаптера, указывающий оборудование, с которым связано устройство. GUID адаптера предоставляется драйверу мини-порта дисплея в элементе AdapterGuidструктуры DXGK_START_INFO , на которую указывает параметр DxgkStartInfo функции DxgkDdiStartDevice , которая отправляется при инициализации адаптера. Компоненты захвата в пользовательском режиме могут впоследствии сопоставить этот GUID адаптера с видеоадаптером.

В модели драйвера дисплея Microsoft Windows 2000 приложения для захвата видео отправляют системные буферы захвата памяти в режим ядра. Затем режим ядра описывает системные буферы памяти с помощью структур списка дескрипторов памяти (MDL) и отправляет многомерные списки в драйвер видеосъемки. Помимо поддержки записи в системную память, модель драйвера дисплея Windows Vista поддерживает захват в видеопамять. Среда выполнения Direct3D вызывает функции DirectX Video Acceleration 2.0, чтобы направить GPU на выполнение постобработки данных записи. Вместо отправки многомерных выражений для описания буферов видеопамяти драйвер отображения пользовательского режима будет отправлять значения D3DKMT_HANDLE типа, которые являются дескрипторами для записи выделений буфера. Таким образом, сочетание драйвера видеозахвата и драйвера минипорта дисплея может использовать существующие функции обратного вызова, такие как DxgkCbGetHandleData , для ссылки на частные данные, описывающие буфер захвата. Сочетание драйверов также может использовать функцию обратного вызова DxgkCbGetCaptureAddress для возврата физического адреса буфера записи.

Приложения для захвата видео вызывают среду выполнения Direct3D для создания буферов записи; затем среда выполнения вызывает драйвер отображения в пользовательском режиме. Среда выполнения вызывает функцию CreateResource драйвера отображения пользовательского режима с флагом битового поля CaptureBuffer , установленным в элементе Flags структуры D3DDDIARG_CREATERESOURCE для создания буферов записи. Драйвер мини-порта дисплея также должен указать флаг битового поля захвата для диспетчера видеопаметь, когда диспетчер памяти вызывает функцию DxgkDdiCreateAllocation драйвера мини-порта дисплея для создания выделений для буферов захвата. При создании буферов записи они немедленно закрепляются в памяти и не открепляются, пока не будут освобождены. Так как стек отслеживания должен отправлять дескриптор выделения в режиме ядра для буферов записи драйверу записи, среда выполнения вызывает функцию GetCaptureAllocationHandle драйвера отображения пользовательского режима, чтобы сопоставить каждый дескриптор ресурса с дескриптором выделения в режиме ядра для этого ресурса.

Драйвер записи может сообщить, поддерживает ли он запись в системную память напрямую. Если драйвер записи поддерживает запись непосредственно в системную память, для этой цели в драйвер записи отправляются многомерные библиотеки. Если драйвер записи не поддерживает прямую запись в системную память, среда выполнения создает буферы захвата видеопамяти, и драйвер захвата должен заполнить их. Функция CaptureToSysMem драйвера дисплея пользовательского режима вызывается для копирования содержимого буфера захвата в область системной памяти. Среда выполнения может использовать CaptureToSysMem , а не функцию Blt , чтобы воспользоваться преимуществами специального оборудования для передачи битовых блоков (bitblt), для которых не требуется, чтобы драйвер дисплея пользовательского режима вызывал функцию pfnRenderCb .

Так как AVStream управляет захватом видео, подсистеме ядра графики DirectX неизвестно, когда происходит захват видео. Тем не менее подсистеме ядра графики известно о выделении, которые используются в качестве буферов захвата. Когда буфер захвата собирается уничтожить, подсистема ядра графики вызывает функцию DxgkDdiStopCapture драйвера дисплея miniport, чтобы указать, что операция захвата должна немедленно прекратить использование выделения в качестве буфера захвата. Если операция записи уже остановлена через стек отслеживания, драйвер может спокойно игнорировать вызов.