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


Отчеты Miracast кодируют блоки и статистику в Windows 8.1

Примечание.

Начиная с Windows 10 (WDDM 2.0), операционная система поставляется со встроенным стеком Miracast, который может работать на любом GPU. Сведения о стеке Microsoft Miracast и требованиях драйверов и оборудования для поддержки экранов Miracast, начиная с Windows 10, см. в следующей документации:

Разработчики драйверов больше не должны реализовывать пользовательский стек 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:

MIRACAST_STATISTIC_TYPE_CHUNK_SENT используется на этапах обработки с вызовами ReportStatistic.

Создание отчетов об одном кадре без использования срезов

Этап обработки ChunkType FrameNumber partNumber ProcessingTime EncodeRate
Запуск кадра обработки FRAME_START 101 0 0 0
Преобразование цвета завершено COLOR_CONVERT_COMPLETE 101 0 950 0
Кодирование завершено ENCODE_COMPLETE 101 0 1042 15000
Перед вызовом для отправки данных в сетевой вызов ReportStatistic Н/Д 101 (значение ChunkSent.ChunkId.FrameNumber) 0 (значение ChunkSent.ChunkId.PartNumber) Недоступно Недоступно

Создание отчетов об одном кадре, обработанном с помощью срезов

Этап обработки ChunkType FrameNumber partNumber ProcessingTime EncodeRate
Запуск кадра обработки FRAME_START 101 0 0 0
Преобразование цвета завершено COLOR_CONVERT_COMPLETE 101 0 950 0
Кодирование среза 1 завершено ENCODE_COMPLETE 101 1 1042 15000
Кодирование среза 2 завершено ENCODE_COMPLETE 101 0 400 15000
Перед вызовом для отправки данных среза 1 в сетевой вызов ReportStatistic Н/Д 101 (значение ChunkSent.ChunkId.FrameNumber для среза 1) 1 (значение ChunkSent.ChunkId.PartNumber для среза 1) Недоступно Недоступно
Перед вызовом для отправки данных среза 2 в сетевой вызов ReportStatistic Н/Д 101 (значение ChunkSent.ChunkId.FrameNumber для среза 2) 0 (значение ChunkSent.ChunkId.FrameNumber для среза 2) Недоступно Недоступно

Создание отчетов о исходном кадре, обработанном и повторно закодированном без использования срезов

Этап обработки ChunkType FrameNumber partNumber ProcessingTime EncodeRate
Запуск кадра обработки FRAME_START 101 0 0 0
Преобразование цвета завершено COLOR_CONVERT_COMPLETE 101 0 950 0
Кодирование завершено ENCODE_COMPLETE 101 0 1042 15000
Перед вызовом для отправки данных исходного кадра в сетевой вызов ReportStatistic Н/Д 101 (значение ChunkSent.ChunkId.FrameNumber) 0 (значение ChunkSent.ChunkId.PartNumber) Недоступно Недоступно
Повторное кодирование завершено ENCODE_COMPLETE 101 0 500 15000
Перед вызовом для отправки данных для повторно закодированного кадра в сеть ReportStatistic Н/Д 101 (значение ChunkSent.ChunkId.FrameNumber) 0 (значение ChunkSent.ChunkId.PartNumber) Недоступно Недоступно

События протокола отчетов

Когда драйвер в пользовательском режиме Miracast сообщает о событиях протокола, вызвав функцию ReportStatistic с MIRACAST_STATISTIC_DATA. StatisticType имеет значение MIRACAST_STATISTIC_TYPE_EVENT, операционная система регистрирует событие, но не принимает никаких других действий. Эти события, тем не менее, ценны для диагностика и исследования производительности.

Перечисление MIRACAST_PROTOCOL_EVENT включает возможные типы событий протокола, которые можно сообщить.

Ошибки протокола отчетов

Хотя подключенный сеанс Miracast выполняется, если драйвер пользовательского режима Miracast обнаруживает ошибку, он должен вызвать функцию обратного вызова ReportSessionStatus с соответствующими MIRACAST_STATUS сведения о состоянии ошибки в параметре MiracastStatus. Операционный сеанс всегда уничтожает сеанс при сообщении об ошибке.

Хотя операционная система просто регистрирует параметр Status ReportSessionStatus для диагностика и не принимает никаких действий на основе его значения, драйвер должен использовать этот параметр для разных причин ошибки.