Android 15 introduce un processo standardizzato per integrazione delle configurazioni utente della regione di interesse (RoI) nel video Android di codifica. Questa funzionalità consente una migliore qualità di compressione per i 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 RoI per la codifica video con
FEATURE_Roi
flag. Se l'opzione FEATURE_Roi
non è attiva, il comportamento del codificatore video non cambia.
Modifiche nel framework dei video
Questa sezione descrive le modifiche al framework video necessarie per implementare questa funzionalità. 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 ROI. Inoltre, in Codec2 (C2) vengono introdotte due chiavi per supportare questi nuovi tipi. L'utilizzo di entrambe le chiavi corrisponde a quello delle API pubbliche.
All'interno del loop dei frame del codificatore, la configurazione viene regolata 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 RoI possono cambiare in modo dinamico.
Le nuove chiavi in C2 sono descritte nelle sezioni seguenti.
kParamIndexQpOffsetMapBuffer
La kParamIndexQpOffsetMapBuffer
indica la mappa qp-offset
per un frame. Il suo valore viene impostato utilizzando l'input
parametro PARAMETER_KEY_QP_OFFSET_MAP
da setParameters
.
kParamIndexQpOffsetMapBuffer
è un array di byte in
C2InfoBuffer
,
con i seguenti attributi:
Lunghezza: il numero di blocchi 16 x 16 in un frame.
Valore: ogni valore dell'array è l'offset QP di un blocco 16x16, nella regione -51~51. Il QP dell'unità di codifica più grande (LCU) target viene calcolato dal controllo della frequenza dell'encoder più l'offset. Se il risultato calcolato supera la regione 0-51, il valore viene troncato a 0-51.
- Se il valore è 0: nessuna compensazione del QP, il QP viene deciso dal controllo originale del tasso.
- Se diverso da zero: QP è il controllo della frequenza originale più l'offset.
- Se negativa: la qualità video viene migliorata nella LCU target.
- Se positivo: la qualità video diminuisce nell'unità LCU target.
Utilizzo: l'utente deve configurare questa chiave come blocchi 16x16. Il codificatore regola la configurazione in base alle dimensioni reali dell'LCU mediando i valori dei blocchi 16 x 16 nell'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 utilizzata la seguente struttura C2QpOffsetRectStruct
dell'IA generativa:
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
eleft
: le coordinate del RoI, con forma rettangolare. Il RoI è più esteso per allinearsi ai confini delle LCU. Il valore rappresenta angolo superiore sinistro di ciascun pixel, in modo tale che ((0,0), (16, 16)) un blocco completo di 16 x 16.qpOffset
: ogni valore dell'array rappresenta l'offset QP dell'arearect
di destinazione. La sua definizione e il suo utilizzo sono gli stessi del valorekParamIndexQpOffsetMapBuffer
.
Algoritmo di mappatura
La tabella seguente mostra la mappatura delle 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 dell'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) CHE
la chiave del fornitore
per attivare il RoI. |
Il RoI deve essere attivato. |
L'offset QP rientra nell'intervallo, ma non è supportato dai fornitori di SoC. | L'utente imposta l'offset QP su 12, ma il SoC supporta solo l'offset QP fino a 10. | L'intervallo di offset QP supportato viene lasciato come criterio del "best effort". Il valore è bloccato nell'intervallo supportato dal SoC. |
Più configurazioni 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 un solo elemento
la configurazione al SoC e, se è disponibile la configurazione standardizzata,
l'implementazione del SoC deve ignorare le configurazioni del fornitore. Se
vengono inviate più configurazioni al SoC, il fornitore del SoC deve conservare
una sola configurazione RoI e ignorano le altre.Le configurazioni vengono conservate in questo ordine di priorità:
|