Linee guida per gli OEM per l'implementazione del ROI

Android 15 introduce una procedura standardizzata per integrare le configurazioni utente della regione di interesse (ROI) nel framework di codifica video Android. Questa funzionalità consente una migliore qualità di compressione per le ROI offrendo API pubbliche per integrare e analizzare le configurazioni utente nell'encoder video.

Implementazione

I fornitori di SoC e gli OEM possono controllare il supporto della regione di interesse per la codifica video con il flag FEATURE_Roi. Se FEATURE_Roi non è abilitato, il comportamento del codificatore video non cambia.

Modifiche al framework video

Questa sezione descrive in dettaglio le modifiche al framework video necessarie per implementare questa funzionalità.

Chiavi in Codec2

In Android 15, la mappa dei parametri di quantizzazione (QP_map) e la configurazione rettangolare (rect) sono definiti come tipi di configurazione della regione di interesse. Inoltre, in Codec2 (C2) vengono introdotte due chiavi per supportare questi nuovi tipi. L'utilizzo di entrambe le chiavi è lo stesso delle API pubbliche. All'interno del ciclo di frame del codificatore, la configurazione viene modificata dinamicamente durante la fase di esecuzione, prima che il buffer di input venga messo in coda, come descritto di seguito:

  • In uno scenario sticky, se non viene fornita alcuna configurazione ROI per il frame corrente, il codificatore utilizza la stessa configurazione del frame precedente.

  • In uno scenario dinamico, i tipi di configurazione del ROI possono cambiare in modo dinamico.

Le nuove chiavi in C2 sono descritte nelle sezioni seguenti.

kParamIndexQpOffsetMapBuffer

La chiave kParamIndexQpOffsetMapBuffer indica la mappa qp-offset per un frame. Il suo valore viene impostato utilizzando il parametro di input PARAMETER_KEY_QP_OFFSET_MAP da setParameters.

kParamIndexQpOffsetMapBuffer è un array di byte in C2InfoBuffer, con i seguenti attributi:

  • Lunghezza: il numero di blocchi 16x16 in un frame.

  • Valore: ogni valore dell'array è l'offset QP di un blocco 16x16, nella regione -51~51. Il QP della LCU di destinazione viene calcolato in base al controllo della velocità dell'encoder più l'offset. Se il risultato calcolato supera la regione 0-51, il valore viene troncato a 0-51.

    • Se 0: nessun offset QP, il QP viene deciso dal controllo della velocità originale.
    • Se diverso da zero: QP è il controllo della velocità originale più l'offset.
    • Se è negativo: la qualità video viene migliorata nell'LCU di destinazione.
    • Se positivo: la qualità video diminuisce nell'LCU di destinazione.
  • Utilizzo: l'utente deve configurare questa chiave come blocchi 16x16. Il codificatore adatta la configurazione alle dimensioni reali della LCU calcolando la media dei valori dei blocchi 16x16 nella LCU.

C2_PARAMKEY_QP_OFFSET_RECTS

La chiave C2_PARAMKEY_QP_OFFSET_RECTS (impostata su coding.qp-offset-rects imposta il ROI su QpOffset-Rects. Il suo valore viene impostato utilizzando il parametro di input PARAMETER_KEY_QP_OFFSET_RECTS da setParameters.

Per supportare questa chiave, viene introdotta la seguente struttura C2QpOffsetRectStruct:

struct C2QpOffsetRectStruct : C2Rect {
  int32_t qpOffset;

  DEFINE_AND_DESCRIBE_C2STRUCT(QpOffsetRect)
  C2FIELD(width, "width")
  C2FIELD(height, "height")
  C2FIELD(left, "left")
  C2FIELD(top, "top")
  C2FIELD(qpOffset, "qp-offset")
}

Dove:

  • top e left: le coordinate del ROI, in forma rettangolare. La ROI è estesa per allinearsi ai limiti della LCU. Il valore rappresenta l'angolo in alto a sinistra di ogni pixel, in modo che ((0,0), (16, 16)) definisca un blocco 16x16 completo.

  • qpOffset: ogni valore dell'array rappresenta l'offset QP dell'area rect di destinazione. La definizione e l'utilizzo sono gli stessi del valore kParamIndexQpOffsetMapBuffer.

Algoritmo di mappatura

La tabella seguente mostra il mapping dalle chiavi pubbliche al framework video:

Chiavi pubbliche o API Mappatura nel framework video
PARAMETER_KEY_QP_OFFSET_MAP Il valore viene passato a kParamIndexQpOffsetMapBuffer come istanza di C2InfoBuffer.
PARAMETER_KEY_QP_OFFSET_RECTS Il valore viene convertito da String a Struct C2QpOffsetRectStruct e passato a C2_PARAMKEY_QP_OFFSET_RECTS.

Gestione degli errori

L'implementazione OEM deve gestire i seguenti casi di errore:

Caso di errore Esempio Prescrizioni d'uso
Per attivare il ROI vengono utilizzate sia la chiave del fornitore sia la chiave standardizzata. L'utente chiama sia setFeatureEnabled(FEATURE_ROI) sia la chiave del fornitore per attivare il ROI. Il ritorno sull'investimento deve essere attivato.
L'offset QP è compreso nell'intervallo, ma non è supportato dai fornitori di SoC. L'utente imposta l'offset QP su 12, ma SoC supporta solo l'offset QP fino a 10. L'intervallo di offset QP supportato viene lasciato come best effort. Il valore è bloccato nell'intervallo supportato del SoC.
Più configurazioni di ROI (che si tratti di una chiave standardizzata o di una chiave specifica del fornitore) sono impostate su un singolo frame. L'utente utilizza sia la chiave standardizzata sia la chiave del fornitore per il frame 1. Se disponibile, il framework conserva la prima configurazione rect standardizzata, la prima configurazione QP_map standardizzata o entrambe. In ogni categoria, il framework invia una sola configurazione standardizzata al SoC e, se la configurazione standardizzata è disponibile, l'implementazione del SoC deve ignorare le configurazioni del fornitore. Se vengono inviate più configurazioni al SoC, il fornitore del SoC deve conservare solo una configurazione della regione di interesse e ignorare le altre.

Le configurazioni vengono conservate in questo ordine di priorità:

  1. Standardizzato rect
  2. Standardizzato QP_map
  3. Fornitore rect
  4. Fornitore QP_map