報告Miracast在 Windows 8.1 上編碼區塊和統計數據

注意

從 Windows 10 (WDDM 2.0) 開始,操作系統隨附可在任何 GPU 上運作的內建 Miracast 堆棧。 如需從 Windows 10 開始支援 Miracast 顯示器之Microsoft Miracast 堆疊及驅動程式和硬體需求的相關信息,請參閱下列檔:

驅動程式開發人員不應再實作自定義Miracast堆疊。 Microsoft可能會移除未來 Windows 版本中自定義 Miracast 堆疊的支援。

在 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 回呼函式來擷取它。
  • 顯示迷你埠驅動程式會在任何 IRQL 層級呼叫 DxgkCbReportChunkInfo 回呼函式。 此函式只會記錄區塊資訊,而且不會將任何區塊封包排入佇列。

如果桌面映像未更新,但驅動程式需要再次編碼桌面影像以改善品質,則應該使用相同的畫面編號和元件編號。 效能工具會觸發相同畫面格和部分編號的第二個編碼完成事件,指出已執行相同畫面的第二個編碼。

每個畫面的最後一個配量必須有一個框架部分編號為零,這表示框架對效能工具的最後一個配量。

為了確保主要介面的正確同步處理,如果圖元管線執行編碼,則不應該在編碼完成存取主要介面之前,以 VSync 間隔報告任何要求的翻轉作業。 此行為可防止演示者在編碼引擎讀取時轉譯至主要介面。

Miracast 使用者模式驅動程式應該在處理畫面的幾個階段中通知操作系統:

  • 開始框架,區塊類型 MIRACAST_CHUNK_TYPE_FRAME_START

    表示操作系統要求驅動程序顯示新桌面畫面的點。 雖然從技術上說,Miracast 使用者模式驅動程式可以報告這個階段,但處理新畫面的開始一律牽涉到顯示迷你埠驅動程式,因此應該由該驅動程序報告。

  • 色彩轉換完成,區塊類型 MIRACAST_CHUNK_TYPE_COLOR_CONVERT_COMPLETE

    某些解決方案有個別的色彩轉換和編碼階段。 在這類解決方案中,應儘快報告色彩轉換完整處理事件,且驅動程式應使用 DXGK_MIRACAST_CHUNK_INFOProcessingTime 成員報告硬體執行作業所花費的時間。 如果整個框架一次全部轉換成色彩,而不是在配量中轉換,則元件編號應該是零。

  • 編碼完成、區塊類型 MIRACAST_CHUNK_TYPE_ENCODE_COMPLETE

    表示 H.264 編碼已完成。 應該完成DXGK_MIRACAST_CHUNK_INFO結構的 ProcessingTimeEncodeRate 成員

  • 框架傳送,使用 MIRACAST_STATISTIC_TYPE_CHUNK_SENT 呼叫 ReportStatistic

    指出 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 呼叫之前 n/a 101 (ChunkSent.ChunkId.FrameNumber 的值 0 (ChunkSent.ChunkId.PartNumber 的值 n/a n/a

報告單一框架,使用配量處理

處理階段 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 呼叫 n/a 101 (Slice 1 的 ChunkSent.ChunkId.FrameNumber 值) 1 (Slice 1 的 ChunkSent.ChunkId.PartNumber 值) n/a n/a
就在呼叫 將配量 2 數據傳送至網路 ReportStatistic 呼叫之前 n/a 101 (Slice 2 的 ChunkSent.ChunkId.FrameNumber 值) 0 (Slice 2 的 ChunkSent.ChunkId.FrameNumber 值) n/a n/a

報告原始框架,處理后重新編碼而不使用配量

處理階段 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 呼叫 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 使用者模式驅動程式使用 MIRACAST_STATISTIC_DATA 呼叫 ReportStatistic來報告通訊協定事件時。StatisticType 設定為 MIRACAST_STATISTIC_TYPE_EVENT,操作系統會記錄事件,但不會採取其他動作。 不過,對於診斷和效能調查而言,這些事件仍具有價值。

MIRACAST_PROTOCOL_EVENT列舉包含可報告的可能通訊協定事件類型。

報告通訊協議錯誤

當 Miracast 連線的工作階段正在進行中時,如果 Miracast 使用者模式驅動程式發現錯誤,它應該呼叫 ReportSessionStatus 回呼函式,並在 MiracastStatus 參數中使用適當的MIRACAST_STATUS錯誤狀態資訊。 報告錯誤時,作業會話一律會終結會話。

雖然操作系統只會記錄診斷的 ReportSessionStatus Status 參數,而且不會根據其值採取任何動作,驅動程式應該使用此參數來區分錯誤的不同原因。