Mappatura dei toni della luminanza HDR su un intervallo compatibile con SDR

Android 13 introduce una libreria statica configurabile dal fornitore chiamata libtonemap, che definisce le operazioni di mappatura dei toni ed è condivisa con il processo SurfaceFlinger e le implementazioni di Hardware Composer (HWC). Questa funzionalità consente agli OEM di definire e condividere i propri algoritmi di mappatura della tonalità di visualizzazione tra il framework e i fornitori, riducendo la mancata corrispondenza nella mappatura della tonalità.

Prima di Android 13, le operazioni di mappatura della tonalità specifiche per il display non venivano condivise tra HWC, SurfaceFlinger e app. A seconda del percorso di rendering, per i contenuti HDR, ciò ha portato a discrepanze nella qualità dell'immagine, in cui i contenuti HDR sono stati mappati in uno spazio di output in modi diversi. Ciò era percepibile in scenari come la rotazione dello schermo, in cui la strategia di composizione cambia tra la GPU e la DPU, e nelle differenze nel comportamento di rendering tra TextureView e SurfaceView.

Questa pagina descrive l'interfaccia, la personalizzazione e i dettagli di convalida della libreria libtonemap.

Interfaccia alla libreria di mappatura della tonalità

La libreria libtonemap contiene implementazioni basate sulla CPU e shader SkSL, che possono essere collegati da SurfaceFlinger per la composizione del backend della GPU e da HWC per generare una tabella di ricerca (LUT) per la mappatura della tonalità. Il punto di accesso a libtonemap è android::tonemap::getToneMapper(), che restituisce un oggetto che implementa l'interfaccia ToneMapper.

L'interfaccia ToneMapper supporta le seguenti funzionalità:

  • Generare una LUT di mappatura della tonalità

    L'interfaccia ToneMapper::lookupTonemapGain è un'implementazione della CPU dello shader definito in libtonemap_LookupTonemapGain(). Questo viene utilizzato dai test delle unità nel framework e può essere utilizzato dai partner per aiutare a generare una LUT di mappatura del tono all'interno della pipeline del colore.

    libtonemap_LookupTonemapGain() accetta valori di colore nello spazio lineare assoluto e non normalizzato, sia in RGB lineare che in XYZ, e restituisce un valore float che descrive di quanto moltiplicare i colori di input nello spazio lineare.

  • Genera uno shader SkSL

    L'interfaccia ToneMapper::generateTonemapGainShaderSkSL() restituisce una stringa shader SkSL, dato uno spazio dati di origine e di destinazione. Lo shader SkSL è collegato all'implementazione di Skia per RenderEngine, il componente di composizione con accelerazione GPU per SurfaceFlinger. Lo shader è anche collegato a libhwui, in modo che la mappatura della tonalità da HDR a SDR possa essere eseguita in modo efficiente per TextureView. Poiché la stringa generata è incorporata in altri shader SkSL utilizzati da Skia, lo shader deve rispettare le seguenti regole:

    • La stringa dello shader deve avere un punto di ingresso con la firma float libtonemap_LookupTonemapGain(vec3 linearRGB, vec3 xyz), dove linearRGB è il valore dei nits assoluti dei pixel RGB nello spazio lineare e xyz è linearRGB convertito in XYZ.
    • Tutti i metodi helper utilizzati dalla stringa dello shader devono avere come prefisso la stringa libtonemap_, in modo che le definizioni dello shader del framework non entrino in conflitto. Allo stesso modo, gli uniform input devono essere preceduti da in_libtonemap_.
  • Genera uniformi SkSL

    L'interfaccia ToneMapper::generateShaderSkSLUniforms() restituisce quanto segue, dato un struct di metadati che descrive i metadati di diversi standard HDR e condizioni di visualizzazione:

    • Un elenco di uniformi vincolate da uno shader SkSL.

    • I valori uniformi in_libtonemap_displayMaxLuminance e in_libtonemap_inputMaxLuminance. Questi valori vengono utilizzati dagli shader del framework per scalare l'input in libtonemap e normalizzare l'output in base alle esigenze.

    Attualmente, il processo di generazione degli uniform è indipendente dallo spazio dei dati di input e output.

Personalizzazione

L'implementazione di riferimento della libreria libtonemap produce risultati accettabili. Tuttavia, poiché l'algoritmo di mappatura del tono utilizzato dalla composizione della GPU può differire da quello utilizzato dalla composizione della DPU, l'utilizzo dell'implementazione di riferimento può causare sfarfallio in alcuni scenari, ad esempio l'animazione di rotazione. La personalizzazione può risolvere questi problemi di qualità dell'immagine specifici del fornitore.

I produttori OEM sono vivamente invitati a eseguire l'override dell'implementazione di libtonemap per definire la propria sottoclasse ToneMapper, restituita da getToneMapper(). Quando personalizzano l'implementazione, i partner devono eseguire una delle seguenti operazioni:

  • Modifica direttamente l'implementazione di libtonemap.
  • Definisci la propria libreria statica, compila la libreria come standalone e sostituisci il file .a della libreria libtonemap con quello generato dalla libreria personalizzata.

I fornitori non devono modificare alcun codice del kernel, ma più fornitori devono comunicare i dettagli sugli algoritmi di mappatura del tono della DPU per una corretta implementazione.

Convalida

Per convalidare l'implementazione:

  1. Riproduci video HDR sullo schermo con qualsiasi standard HDR supportato dal tuo sistema di visualizzazione, come HLG, HDR10, HDR10+ o Dolby Vision.

  2. Attiva/disattiva la composizione della GPU per assicurarti che non ci siano sfarfallii percepibili dall'utente.

    Utilizza il seguente comando adb per attivare/disattivare la composizione della GPU:

    adb shell service call SurfaceFlinger 1008 i32 <0 to enable HWC composition,
    1 to force GPU composition>
    
    

Problemi comuni

Con questa implementazione possono verificarsi i seguenti problemi:

  • Il banding si verifica quando la precisione del target di rendering utilizzato dalla composizione della GPU è inferiore al valore tipico per i contenuti HDR. Ad esempio, la visualizzazione a bande può verificarsi quando un'implementazione HWC supporta formati opachi a 10 bit per l'HDR, ad esempio RGBA1010102 o P010, ma richiede che la composizione della GPU scriva in un formato a 8 bit come RGBA8888 per supportare il canale alfa.

  • Un leggero spostamento del colore è causato da differenze di quantizzazione se la DPU opera con una precisione diversa rispetto alla GPU.

Ciascuno di questi problemi è correlato alle differenze di precisione relativa dell'hardware sottostante. Una soluzione alternativa tipica consiste nell'assicurarsi che ci sia un passaggio di dithering nei percorsi a precisione inferiore, rendendo meno percepibili le differenze di precisione.