Creazione di report per codificare blocchi e statistiche miracast in Windows 8.1
Nota
A partire da Windows 10 (WDDM 2.0), il sistema operativo viene fornito con uno stack Miracast predefinito che può funzionare su qualsiasi GPU. Per informazioni sullo stack Microsoft Miracast e sui requisiti dei driver e dell'hardware per supportare le visualizzazioni Miracast a partire da Windows 10, vedere la documentazione seguente:
Creazione di soluzioni di proiezione wireless di alta qualità con Windows 10
Documentazione di WHLK pertinente in Device.Graphics.WDDM13.DisplayRender.WirelessDisplay
Gli sviluppatori di driver non devono più implementare uno stack Miracast personalizzato. Microsoft potrebbe rimuovere il supporto per gli stack Miracast personalizzati in una versione futura di Windows.
In Windows 8.1, l'hardware di visualizzazione può elaborare ogni fotogramma video inviato tramite un collegamento di visualizzazione wireless Miracast suddividendo il fotogramma in più parti o codificare blocchi. Ogni blocco ha un ID blocco univoco generato dal numero di fotogramma e dal numero di frame (o sezione). A ogni blocco correlato allo stesso aggiornamento dei frame desktop deve essere assegnato lo stesso numero di frame.
Elaborazione di blocchi di report
Un driver può codificare un frame da inviare tramite un collegamento wireless Miracast in più passaggi di elaborazione, ad esempio separando la conversione del colore dalla codifica, o in un singolo passaggio. A ogni passaggio di elaborazione deve essere assegnato un numero di parte di frame univoco all'interno del frame.
Il driver in modalità utente Miracast o il driver miniport di visualizzazione devono notificare al sistema operativo ogni volta che:
- L'hardware ha completato un passaggio di elaborazione per un frame.
- Immediatamente prima che ogni parte del frame venga inviata alla rete.
Si presuppone che l'ora di un particolare passaggio di elaborazione segnalato sia l'ora in cui l'evento è stato segnalato al sistema operativo, quindi è importante segnalare le fasi il più rapidamente possibile.
Il sistema operativo non esegue alcuna azione oltre a registrare questi eventi usando la funzionalità di traccia a livello di kernel ETW (Event Tracing for Windows). Queste informazioni sono tuttavia importanti per misurare e analizzare i problemi di prestazioni.
Un driver può fornire la notifica usando uno dei modi seguenti:
- Il driver miracast in modalità utente chiama la funzione di callback ReportStatistic per segnalare i dettagli con il tipo di MIRACAST_STATISTIC_TYPE_CHUNK_PROCESSING_COMPLETE o con MIRACAST_STATISTIC_TYPE_CHUNK_SENT per indicare che il blocco sta per essere inviato allo stack di rete per la trasmissione.
- Il driver miniport di visualizzazione segnala i dettagli dell'elaborazione del blocco con il tipo di interrupt DXGK_INTERRUPT_MICACAST_CHUNK_PROCESSING_COMPLETE , anche se questo report può essere eseguito solo in fase di interruzione. Oltre a registrare le informazioni sui blocchi, viene creato e accodato un blocco in modo che il driver miracast in modalità utente possa recuperarlo chiamando la funzione di callback GetNextChunkData.
- Il driver miniport di visualizzazione chiama la funzione di callback DxgkCbReportChunkInfo a qualsiasi livello IRQL. Questa funzione registra solo le informazioni sul blocco e non accoda alcun pacchetto di blocchi.
Se l'immagine desktop non viene aggiornata, è necessario usare lo stesso numero di fotogrammi e numeri di parte, ma il driver deve codificare nuovamente l'immagine desktop per migliorare la qualità. Gli strumenti per le prestazioni attivano il secondo evento di codifica completo per lo stesso frame e lo stesso numero di parte, a indicare che è stata eseguita una seconda codifica dello stesso frame.
L'ultima sezione di ogni fotogramma deve avere un numero di parte del fotogramma pari a zero, che indica l'ultima sezione del frame agli strumenti per le prestazioni.
Per garantire una corretta sincronizzazione della superficie primaria, se la pipeline pixel esegue la codifica, qualsiasi operazione di scorrimento richiesta a un intervallo VSync non deve essere segnalata prima che la codifica abbia terminato l'accesso alla superficie primaria. Questo comportamento impedisce al relatore di eseguire il rendering sulla superficie primaria mentre il motore di codifica lo legge.
Il driver miracast in modalità utente deve informare il sistema operativo in ognuna delle diverse fasi di elaborazione del frame:
Frame iniziale, tipo di blocco MIRACAST_CHUNK_TYPE_FRAME_START
Rappresenta il punto in cui il sistema operativo chiede al driver di visualizzare il nuovo frame desktop. Anche se tecnicamente il driver miracast in modalità utente potrebbe segnalare questa fase, l'inizio dell'elaborazione di un nuovo frame implica sempre il driver miniport di visualizzazione, e pertanto dovrebbe essere segnalato da tale driver.
Conversione dei colori completata, tipo di blocco MIRACAST_CHUNK_TYPE_COLOR_CONVERT_COMPLETE
Alcune soluzioni hanno fasi separate di conversione e codifica dei colori. In tali soluzioni, l'evento di elaborazione completo della conversione dei colori deve essere segnalato il prima possibile e il driver deve usare il DXGK_MIRACAST_CHUNK_INFO.Membro ProcessingTime per segnalare il tempo necessario per l'hardware per eseguire l'operazione. Se l'intero frame viene convertito tutti contemporaneamente anziché in sezioni, il numero di parte deve essere zero.
Codificare il tipo di blocco completo MIRACAST_CHUNK_TYPE_ENCODE_COMPLETE
Indica che la codifica H.264 è stata completata. I membri ProcessingTime e EncodeRate della struttura DXGK_MIRACAST_CHUNK_INFO devono essere completati.
Invio di frame, chiamata di ReportStatistic tramite MIRACAST_STATISTIC_TYPE_CHUNK_SENT
Indica che il driver miracast in modalità utente sta per inviare il pacchetto di dati per questo numero di frame/parte all'API di rete per la trasmissione. Se i dati per questo frame/parte vengono inviati usando più chiamate all'API di rete, deve essere registrato solo prima dell'invio del primo pacchetto. La chiamata deve essere effettuata subito prima di chiamare l'API di rete. Questo intervallo è importante perché se l'API di rete blocca le chiamate, non si vuole che il tempo bloccato venga conteggiato rispetto all'elaborazione del frame nello stack di grafica.
Cornice eliminata, tipo di blocco MIRACAST_CHUNK_TYPE_FRAME_DROPPED
Se in qualsiasi momento il driver decide che non completerà l'elaborazione del frame/parte e la invierà al sink, dovrebbe segnalare il frame eliminato. In questo contesto, un frame viene considerato eliminato solo se il driver ha effettivamente iniziato a elaborarlo registrando MIRACAST_CHUNK_TYPE_FRAME_START. Se un driver calcola che ignora questo fotogramma senza alcuna elaborazione, può registrare MIRACAST_CHUNK_TYPE_FRAME_DROPPED senza registrare MIRACAST_CHUNK_TYPE_FRAME_START.
Tipo di blocco definito dal driver MIRACAST_CHUNK_TYPE_ENCODE_DRIVER_DEFINED_1 o _2
Questi tipi di blocchi sono disponibili per comprendere le prestazioni di uno scenario. Alcuni esempi includono:
- Il driver usa questi tipi per indicare che è stato creato un I-Frame per questo frame.
- Il driver registra un altro pacchetto dopo che l'ultima sezione del frame è stata inviata alle API di rete che contengono le dimensioni totali del frame codificato.
Esempi di conversione del colore della cornice
Negli esempi seguenti viene illustrato il modo in cui il colore della cornice viene convertito e il modo in cui il driver del miniport di visualizzazione segnala il completamento della conversione dei colori.
I riferimenti di tabella ai membri della struttura MIRACAST_CHUNK_INFO sono:
ChunkType è un valore MIRACAST_CHUNK_TYPE_XXX .
FrameNumber e PartNumber sono membri dell'unione ChunkId.
ProcessingTime è il tempo espresso in microsecondi.
EncodeRate è espresso in kilobit al secondo.
MIRACAST_STATISTIC_TYPE_CHUNK_SENT viene usato nelle fasi di elaborazione che coinvolgono chiamate a ReportStatistic.
Creazione di report di un singolo frame senza usare sezioni
Fase di elaborazione | ChunkType | FrameNumber | PartNumber | ProcessingTime | EncodeRate |
---|---|---|---|---|---|
Avviare l'elaborazione del frame | FRAME_START | 101 | 0 | 0 | 0 |
Conversione dei colori completata | COLOR_CONVERT_COMPLETE | 101 | 0 | 950 | 0 |
Codifica completata | ENCODE_COMPLETE | 101 | 0 | 1042 | 15000 |
Subito prima della chiamata per inviare dati alla chiamata reportstatistica di rete | n/d | 101 (valore di ChunkSent.ChunkId.FrameNumber) | 0 (valore di ChunkSent.ChunkId.PartNumber) | n/d | n/d |
Creazione di report di un singolo frame, elaborato tramite sezioni
Fase di elaborazione | ChunkType | FrameNumber | PartNumber | ProcessingTime | EncodeRate |
---|---|---|---|---|---|
Avviare l'elaborazione del frame | FRAME_START | 101 | 0 | 0 | 0 |
Conversione dei colori completata | COLOR_CONVERT_COMPLETE | 101 | 0 | 950 | 0 |
Codifica della sezione 1 completata | ENCODE_COMPLETE | 101 | 1 | 1042 | 15000 |
Codifica della sezione 2 completata | ENCODE_COMPLETE | 101 | 0 | 400 | 15000 |
Subito prima di chiamare per inviare dati sezione 1 alla chiamata ReportStatistic di rete | n/d | 101 (valore di ChunkSent.ChunkId.FrameNumber per slice 1) | 1 (valore di ChunkSent.ChunkId.PartNumber per slice 1) | n/d | n/d |
Subito prima della chiamata per inviare dati sezione 2 alla chiamata reportstatistica di rete | n/d | 101 (valore di ChunkSent.ChunkId.FrameNumber per slice 2) | 0 (valore di ChunkSent.ChunkId.FrameNumber per slice 2) | n/d | n/d |
Creazione di report di un frame originale, elaborato e quindi codificato nuovamente senza usare sezioni
Fase di elaborazione | ChunkType | FrameNumber | PartNumber | ProcessingTime | EncodeRate |
---|---|---|---|---|---|
Avviare l'elaborazione del frame | FRAME_START | 101 | 0 | 0 | 0 |
Conversione dei colori completata | COLOR_CONVERT_COMPLETE | 101 | 0 | 950 | 0 |
Codifica completata | ENCODE_COMPLETE | 101 | 0 | 1042 | 15000 |
Subito prima della chiamata per inviare i dati per il frame originale alla chiamata ReportStatistic di rete | n/d | 101 (valore di ChunkSent.ChunkId.FrameNumber) | 0 (valore di ChunkSent.ChunkId.PartNumber) | n/d | n/d |
La ripetizione della codifica è stata completata | ENCODE_COMPLETE | 101 | 0 | 500 | 15000 |
Subito prima della chiamata per inviare i dati per il frame codificato nuovamente alla rete ReportStatistic | n/d | 101 (valore di ChunkSent.ChunkId.FrameNumber) | 0 (valore di ChunkSent.ChunkId.PartNumber) | n/d | n/d |
Eventi del protocollo di creazione di report
Quando il driver miracast in modalità utente segnala gli eventi del protocollo chiamando la funzione ReportStatistic con MIRACAST_STATISTIC_DATA. StatisticType impostato su MIRACAST_STATISTIC_TYPE_EVENT, il sistema operativo registra l'evento ma non esegue altre azioni. Questi eventi sono tuttavia utili per la diagnostica e l'analisi delle prestazioni.
L'enumerazione MIRACAST_PROTOCOL_EVENT include possibili tipi di evento di protocollo che possono essere segnalati.
Segnalazione di errori del protocollo
Mentre è in corso una sessione connessa Miracast, se un driver in modalità utente Miracast rileva un errore, deve chiamare la funzione di callback ReportSessionStatus con le informazioni appropriate sullo stato di errore MIRACAST_STATUS nel parametro MiracastStatus. La sessione operativa elimina sempre la sessione quando viene segnalato un errore.
Anche se il sistema operativo registra semplicemente il parametro ReportSessionStatus Status per la diagnostica e non esegue alcuna azione in base al relativo valore, il driver deve usare questo parametro per distinguere le diverse cause dell'errore.