Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Примечание.
Начиная с Windows 10 (WDDM 2.0), операционная система поставляется со встроенным стеком Miracast, который может работать на любом GPU. Сведения о стеке Microsoft Miracast и требованиях драйверов и оборудования для поддержки экранов Miracast, начиная с Windows 10, см. в следующей документации:
Создание лучших в классе беспроводных проекционных решений с помощью Windows 10
Соответствующая документация по WHLK в Device.Graphics.WDDM13.DisplayRender.WirelessDisplay
Разработчики драйверов больше не должны реализовывать пользовательский стек Miracast. Корпорация Майкрософт может удалить поддержку пользовательских стеков Miracast в будущей версии Windows.
В Windows 8.1 оборудование может обрабатывать каждый видеокадр, отправленный по беспроводной каналу отображения Miracast, разделив кадр на несколько частей или закодируя блоки. Каждый блок имеет уникальный идентификатор блока, созданный из номера кадра и номера части кадра (или среза). Каждому фрагменту, связанному с тем же обновлением кадров рабочего стола, необходимо назначить один и тот же номер кадра.
Обработка блоков отчетов
Драйвер может закодировать кадр для отправки по беспроводной ссылке Miracast либо в нескольких шагах обработки, например разделяя преобразование цветов от кодирования, либо на одном шаге. Каждому шагу обработки необходимо назначить уникальный номер части кадра в кадре.
Драйвер пользовательского режима Miracast или драйвер мини-порта дисплея должны уведомлять операционную систему каждый раз, когда:
- Оборудование завершило шаг обработки кадра.
- Непосредственно перед отправкой каждой части кадра в сеть.
Предполагается, что время определенного шага обработки — это время, когда событие было сообщено операционной системе, поэтому важно сообщать об этапах как можно быстрее.
Операционная система не выполняет никаких действий, кроме журналов этих событий с помощью средства трассировки событий для Windows (ETW) на уровне ядра. Эта информация, тем не менее, важна для измерения и изучения проблем с производительностью.
Драйвер может предоставить уведомление одним из следующих возможных способов:
- Драйвер пользовательского режима Miracast вызывает функцию обратного вызова ReportStatistic, для сообщений о деталях с типом MIRACAST_STATISTIC_TYPE_CHUNK_PROCESSING_COMPLETE, или с использованием MIRACAST_STATISTIC_TYPE_CHUNK_SENT, чтобы указать, что блок будет отправлен в сетевой стек передачи.
- Драйвер минипорта дисплея сообщает подробности об обработке блока с типом прерывания DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE, хотя такие сведения могут быть представлены только во время прерывания. Помимо ведения журнала сведений о блоке, создается пакет и помещается в очередь, чтобы драйвер пользовательского режима Miracast смог его получить, вызвав функцию обратного вызова GetNextChunkData.
- Драйвер мини-порта дисплея вызывает функцию обратного вызова DxgkCbReportChunkInfo на любом уровне IRQL. Эта функция регистрирует только сведения о блоках и не помещает в очередь пакеты блоков.
Тот же номер кадра и номера частей следует использовать, если образ рабочего стола не обновляется, но драйвер должен кодировать изображение рабочего стола еще раз, чтобы повысить качество. Средства производительности инициируют событие завершения второго кодирования для одного кадра и номера части, указывая на то, что было выполнено второе кодирование того же кадра.
Последний срез каждого кадра должен иметь номер части кадра нулю, который указывает на последний срез кадра для средств производительности.
Чтобы обеспечить правильную синхронизацию основной поверхности, если конвейер пикселей выполняет кодирование, запрос операции переключения с интервалом VSync не должен быть сообщен до завершения кодирования и доступа к основной поверхности. Это поведение предотвращает отрисовку докладчика на основную поверхность во время чтения подсистемы кодирования из нее.
Драйвер пользовательского режима Miracast должен информировать операционную систему на каждом из нескольких этапов обработки кадра:
Начальный кадр, тип фрагмента MIRACAST_CHUNK_TYPE_FRAME_START
Представляет точку, в которой операционная система запрашивает драйвер отображать новый кадр рабочего стола. Хотя технически драйвер пользовательского режима Miracast может сообщить об этом этапе, начало обработки нового кадра всегда включает драйвер минипорта дисплея, и, следовательно, об этом следует сообщить этим драйвером.
Завершено преобразование цветов, тип фрагмента MIRACAST_CHUNK_TYPE_COLOR_CONVERT_COMPLETE
Некоторые решения имеют отдельные этапы преобразования цветов и кодирования. В таких решениях событие полного преобразования цвета должно быть сообщено как можно скорее, и драйвер должен использовать член DXGK_MIRACAST_CHUNK_INFO.ProcessingTime, чтобы сообщить время, которое понадобилось оборудованию для выполнения операции. Если весь кадр преобразуется сразу, а не в срезах, то номер части должен быть равен нулю.
Кодирование завершено, тип блока MIRACAST_CHUNK_TYPE_ENCODE_COMPLETE
Указывает, что код H.264 завершен. Элементы ProcessingTime и EncodeRate структуры DXGK_MIRACAST_CHUNK_INFO должны быть завершены.
Отправка кадров, вызов ReportStatistic с помощью MIRACAST_STATISTIC_TYPE_CHUNK_SENT
Указывает, что драйвер пользовательского режима Miracast будет отправлять пакет данных для этого кадра или номера части в сетевой API для передачи. Если данные для этого кадра или части отправляются с помощью нескольких вызовов сетевого API, он должен быть зарегистрирован только перед отправкой первого пакета. Перед вызовом сетевого API необходимо выполнить вызов. Это важно, так как если сетевой API блокирует вызовы, мы не хотим, чтобы время блокировки отсчитывалось от обработки кадра в графическом стеке.
Пропущенный кадр, тип блока MIRACAST_CHUNK_TYPE_FRAME_DROPPED
Если в любой момент драйвер решит, что не завершит обработку кадра или его части и не отправит их в приемник, он должен сообщить об отброшенном кадре. В этом контексте кадр считается пропущенным, только если драйвер действительно начал его обработку, зафиксировав MIRACAST_CHUNK_TYPE_FRAME_START. Если драйвер вычисляет, что этот кадр будет пропущен без обработки, он может записывать MIRACAST_CHUNK_TYPE_FRAME_DROPPED, не ведя журнал MIRACAST_CHUNK_TYPE_FRAME_START.
Определяемый драйвером тип блока MIRACAST_CHUNK_TYPE_ENCODE_DRIVER_DEFINED_1 или _2
Эти типы блоков доступны для понимания производительности сценария. Ниже приведены некоторые примеры:
- Драйвер использует эти типы, чтобы указать, что для этого кадра был создан I-Frame.
- Драйвер регистрирует еще один пакет после отправки последнего сегмента кадра в сетевые API, которые содержат информацию о полном размере закодированного кадра.
Примеры преобразования цвета кадра
В следующих примерах показано, как преобразуется цвет кадра и как драйвер дисплея мини-порта сообщает о завершении преобразования цвета.
Ниже приведены ссылки на элементы структуры MIRACAST_CHUNK_INFO :
ChunkType — это значение MIRACAST_CHUNK_TYPE_XXXX.
FrameNumber и PartNumber являются членами объединения ChunkId .
ProcessingTime — это время в микросекундах.
EncodeRate находится в килобитах в секунду.
MIRACAST_STATISTIC_TYPE_CHUNK_SENT используется на стадиях обработки с вызовами ReportStatistic.
Создание отчетов об одном кадре без использования срезов
| Этап обработки | ТипБлока | Номер кадра | номер детали | Время обработки | EncodeRate |
|---|---|---|---|---|---|
| Начать обработку кадра | FRAME_START | 101 | 0 | 0 | 0 |
| Преобразование цвета завершено | COLOR_CONVERT_COMPLETE | 101 | 0 | 950 | 0 |
| Кодирование завершено | КОДИРОВАНИЕ_ЗАВЕРШЕНО | 101 | 0 | 1042 | 15000 |
| Непосредственно перед вызовом ReportStatistic для отправки данных в сеть | n/a | 101 (значение ChunkSent.ChunkId.FrameNumber) | 0 (значение ChunkSent.ChunkId.PartNumber) | n/a | n/a |
Создание отчетов об одном кадре, обработанном с помощью срезов
| Этап обработки | ChunkType | НомерКадра | номер детали | Время обработки | EncodeRate |
|---|---|---|---|---|---|
| Начать обработку кадра | FRAME_START | 101 | 0 | 0 | 0 |
| Преобразование цвета завершено | ЦВЕТОВОЕ ПРЕОБРАЗОВАНИЕ ЗАВЕРШЕНО | 101 | 0 | 950 | 0 |
| Кодирование среза 1 завершено | ENCODE_COMPLETE | 101 | 1 | 1042 | 15000 |
| Кодирование среза 2 завершено | ENCODE_COMPLETE | 101 | 0 | 400 | 15000 |
| Перед вызовом отправки данных среза 1 в сеть вызов ReportStatistic | n/a | 101 (значение ChunkSent.ChunkId.FrameNumber для фрагмента 1) | 1 (значение ChunkSent.ChunkId.PartNumber в срезе 1) | n/a | n/a |
| Непосредственно перед вызовом ReportStatistic для отправки данных среза 2 в сеть | n/a | 101 (значение ChunkSent.ChunkId.FrameNumber для отрезка 2) | 0 (значение ChunkSent.ChunkId.FrameNumber для среза 2) | n/a | n/a |
Создание отчетов о исходном кадре, обработанном и повторно закодированном без использования срезов
| Этап обработки | ТипБлока | Номер кадра | номер детали | Время обработки | EncodeRate |
|---|---|---|---|---|---|
| Начать обработку кадра | FRAME_START | 101 | 0 | 0 | 0 |
| Преобразование цвета завершено | Преобразование цвета завершено | 101 | 0 | 950 | 0 |
| Кодирование завершено | Завершение_кодирования | 101 | 0 | 1042 | 15000 |
| Перед вызовом ReportStatistic для отправки данных исходного кадра в сеть | n/a | 101 (значение ChunkSent.ChunkId.FrameNumber) | 0 (значение ChunkSent.ChunkId.PartNumber) | n/a | n/a |
| Повторное кодирование завершено | ENCODE_COMPLETE | 101 | 0 | 500 | 15000 |
| Перед вызовом функции отправки данных повторно закодированного кадра в сеть ReportStatistic | n/a | 101 (значение ChunkSent.ChunkId.FrameNumber) | 0 (значение ChunkSent.ChunkId.PartNumber) | n/a | n/a |
События регистрации протокола
Когда драйвер в пользовательском режиме Miracast сообщает о событиях протокола, вызывая функцию ReportStatistic с MIRACAST_STATISTIC_DATA. StatisticType имеет значение MIRACAST_STATISTIC_TYPE_EVENT, операционная система регистрирует событие, но не принимает никаких других действий. Эти события, тем не менее, ценны для диагностики и исследования производительности.
Перечисление MIRACAST_PROTOCOL_EVENT включает возможные типы событий протокола, которые можно сообщить.
Ошибки в протоколе отчетности
Во время выполнения сеанса Miracast, если драйвер пользовательского режима Miracast обнаружит ошибку, он должен вызвать функцию обратного вызова ReportSessionStatus с соответствующей информацией о состоянии ошибки MIRACAST_STATUS в параметре MiracastStatus. Операционный сеанс всегда завершается при сообщении об ошибке.
Хотя операционная система просто регистрирует параметр ReportSessionStatusStatus для диагностики и не принимает никаких действий на основе его значения, драйвер должен использовать этот параметр, чтобы различать различные причины ошибки.