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

注意

從 Windows 10 (WDDM 2.0) 開始,操作系統隨附可在任何 GPU 上運作的內建 Miracast 堆疊。 如需 Microsoft Miracast 堆疊以及從 Windows 10 開始支援 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 回呼函式。 此函式只會記錄區塊資訊,而且不會將任何區塊封包排入佇列。

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

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

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

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 結構成員的數據表參考如下:

  • ChunkTypeMIRACAST_CHUNK_TYPE_XXX 值。

  • FrameNumberPartNumberChunkId 等位的成員。

  • ProcessingTime 是以微秒為單位的時間。

  • EncodeRate 每秒以 KB 為單位。

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 (配量 1) 之 ChunkSent.ChunkId.FrameNumber 的值 1 (slice 1 的 ChunkSent.ChunkId.PartNumber 值) n/a n/a
剛好呼叫以將配量 2 數據傳送至網路 ReportStatistic 呼叫之前 n/a 101 (配量 2) 之 ChunkSent.ChunkId.FrameNumber 的值 0 (配量 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錯誤狀態資訊。 當報告錯誤時,作業會話一律會終結會話。

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