Le funzionalità di visualizzazione (come le modalità di visualizzazione e i tipi HDR supportati) possono cambiare dinamicamente sui dispositivi dotati di display collegati esternamente (con HDMI o DisplayPort), come set-top-box Android TV (STB) e over-the-top (OTT) dispositivi. Questo cambiamento può verificarsi come risultato di un segnale hotplug HDMI, ad esempio quando l'utente passa da uno schermo all'altro o avvia il dispositivo senza uno schermo collegato. Android 12 e versioni successive includono modifiche al framework per gestire le funzionalità di hotplug e visualizzazione dinamica.
Questa pagina descrive la gestione degli hotplug di visualizzazione e le modifiche alle funzionalità di visualizzazione nell'implementazione HAL di Composer. Inoltre viene illustrato come gestire il framebuffer associato e prevenire le race conditions in queste situazioni.
Aggiorna le funzionalità di visualizzazione
Questa sezione descrive il modo in cui il framework Android gestisce le modifiche nelle funzionalità di visualizzazione avviate da Composer HAL.
Prima che Android possa gestire correttamente le modifiche alle funzionalità di visualizzazione, l'OEM deve implementare Composer HAL in modo tale da utilizzare onHotplug(display, connection=CONNECTED)
per notificare al framework eventuali modifiche alle funzionalità di visualizzazione. Dopo l'implementazione, Android gestisce le modifiche alle funzionalità di visualizzazione come segue:
- Quando rileva un cambiamento nelle capacità di visualizzazione, il framework riceve una notifica
onHotplug(display, connection=CONNECTED)
. - Alla ricezione della notifica, il framework elimina il proprio stato di visualizzazione e lo ricrea con le nuove funzionalità dell'HAL utilizzando i metodi
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
egetDisplayCapabilities
. - Dopo che il framework ha ricreato un nuovo stato di visualizzazione, invia il callback
onDisplayChanged
alle app che sono in ascolto per tali eventi.
Il framework rialloca i framebuffer sui successivi eventi onHotplug(display, connection=CONNECTED)
. Vedere Gestione del framebuffer del client per ulteriori informazioni su come gestire correttamente la memoria del framebuffer per evitare errori durante l'allocazione di nuovi framebuffer.
Gestire scenari di connessione comuni
Questa sezione illustra come gestire correttamente vari scenari di connessione nelle implementazioni quando il display principale è connesso e disconnesso.
Essendo stato creato per i dispositivi mobili, il framework Android non dispone del supporto integrato per un display principale disconnesso. L'HAL deve invece sostituire il display primario con un display segnaposto nelle sue interazioni con il framework nel caso in cui un display primario sia fisicamente disconnesso.
I seguenti scenari possono verificarsi nei decoder e nei dongle TV dotati di display collegati esternamente che possono essere disconnessi. Per implementare il supporto per questi scenari, utilizzare le informazioni nella tabella seguente:
Scenario | Gestione |
---|---|
Nessun display collegato al momento dell'avvio |
|
Il display principale è fisicamente collegato |
|
Il display principale è fisicamente disconnesso |
|
Utilizza ID di configurazione sequenziali per evitare condizioni di competizione
Possono verificarsi condizioni di competizione se l'HAL del compositore aggiorna le configurazioni di visualizzazione supportate contemporaneamente al framework che chiama setActiveConfig
o setActiveConfigWithConstraints
. La soluzione è implementare Composer HAL per utilizzare ID sequenziali e prevenire questo problema.
Questa sezione descrive come potrebbero verificarsi le condizioni di competizione, seguita da dettagli su come implementare Composer HAL in modo che utilizzi ID sequenziali per impedire tali condizioni.
Considera la seguente sequenza di eventi, quando nuovi ID sequenziali NON vengono assegnati alle nuove configurazioni di visualizzazione, causando una condizione di competizione:
Gli ID di configurazione dello schermo supportati sono:
- id=1 , 1080x1920 60 Hz
- id=2 , 1080x1920 50 Hz
Il framework chiama
setActiveConfig(display, config=1)
.Contemporaneamente, l'HAL Composer elabora una modifica delle configurazioni di visualizzazione e aggiorna il suo stato interno a un nuovo set di configurazioni di visualizzazione, mostrato come segue:
- id=1 , 2160x3840 60 Hz
- id=2 , 2160x3840 50 Hz
- id=3 , 1080x1920 60 Hz
- id=4 , 1080x1920 50 Hz
L'HAL del compositore invia un evento
onHotplug
al framework, per notificare che l'insieme delle modalità supportate è cambiato.L'HAL del compositore riceve
setActiveConfig(display, config=1)
(dal passaggio 2).L'HAL interpreta che il framework ha richiesto una modifica della configurazione a 2160x3840 60 Hz , anche se in realtà si desiderava 1080x1920 60 Hz .
Il processo che utilizza assegnazioni di ID non sequenziali termina qui con un'errata interpretazione della modifica di configurazione desiderata.
Configurare l'HAL del compositore per utilizzare ID sequenziali
Per evitare tali condizioni di competizione, l'OEM deve implementare l'HAL del compositore come segue:
- Quando l'HAL Composer aggiorna le configurazioni di visualizzazione supportate, assegna nuovi ID sequenziali alle nuove configurazioni di visualizzazione.
- Quando il framework chiama
setActiveConfig
osetActiveConfigWithConstraints
con un ID di configurazione non valido, l'HAL Composer ignora la chiamata.
Questi passaggi servono a prevenire le condizioni di competizione, come mostrato nella discussione seguente.
Considera la seguente sequenza di eventi, quando nuovi ID sequenziali vengono assegnati alle nuove configurazioni di visualizzazione:
Gli ID di configurazione dello schermo supportati sono:
- id=1 , 1080x1920 60Hz
- id=2 , 1080x1920 50 Hz
Il framework chiama
setActiveConfig(display, config=1)
.Quando viene elaborata una modifica delle configurazioni di visualizzazione, il set successivo di ID di configurazione viene assegnato a partire dal successivo numero intero inutilizzato, mostrato come segue:
id=3 , 2160x3840 60 Hz
id=4 , 2160x3840 50 Hz
id=5 , 1080x1920 60Hz
id=6 , 1080x1920 50Hz
L'HAL Composer invia un evento
onHotplug
al framework, per notificare che l'insieme delle modalità supportate è cambiato.L'HAL del compositore riceve
setActiveConfig(display, config=1)
(dal passaggio 2).L'HAL del compositore ignora la chiamata poiché l'ID non è più valido.
Il framework riceve ed elabora l'evento
onHotplug
dal passaggio 4. Chiama l'HAL Composer utilizzando le funzionigetDisplayConfigs
egetDisplayAttribute
. Con queste funzioni il framework identifica il nuovo ID (5) per la risoluzione desiderata e frequenza di aggiornamento di 1080x1920 e 60 Hz.Il framework invia un altro evento
setActiveConfig
con un ID aggiornato pari a 5.L'HAL Composer riceve
setActiveConfig(display, config=5)
dal passaggio 5.L'HAL interpreta correttamente che il framework ha richiesto una modifica della configurazione a 1080x1920 60 Hz.
Come mostrato nell'esempio precedente, il processo che utilizza le assegnazioni di ID sequenziali garantisce che la condizione di competizione venga impedita e che venga aggiornata la modifica corretta della configurazione del display.