O Android 15 apresenta um processo padronizado para integrar as configurações de usuário da região de interesse (RoI, na sigla em inglês) ao framework de codificação de vídeo do Android. Esse recurso oferece APIs públicas para integrar e analisar as configurações do usuário no codificador de vídeo, permitindo uma melhor qualidade de compactação para RoIs.
Implementação
Os fornecedores de SoC e OEMs podem controlar o suporte a RoI para codificação de vídeo com a
FEATURE_Roi
flag. Se FEATURE_Roi não estiver ativada, não haverá mudança no comportamento do codificador de vídeo.
Mudanças no framework de vídeo
Esta seção detalha as mudanças no framework de vídeo necessárias para implementar esse recurso.
Chaves no Codec2
No Android 15, o mapa de parâmetros de quantização (QP_map) e a configuração retangular (rect) são definidos como tipos de configuração de RoI. Além disso, duas chaves são introduzidas no Codec2 (C2) para oferecer suporte a esses novos tipos. O uso das duas chaves é o mesmo das APIs públicas.
No loop de frame do codificador, a configuração é ajustada dinamicamente durante a fase de execução, antes que o buffer de entrada seja enfileirado, conforme descrito abaixo:
Em um cenário aderente, se nenhuma configuração de RoI for fornecida para o frame atual, o codificador usará a mesma configuração do frame anterior.
Em um cenário dinâmico, os tipos de configuração de RoI podem mudar dinamicamente.
As novas chaves no C2 são descritas nas seções a seguir.
kParamIndexQpOffsetMapBuffer
A chave kParamIndexQpOffsetMapBuffer
sinaliza o mapa qp-offset de um frame. O valor dela é definido usando o input
parâmetro PARAMETER_KEY_QP_OFFSET_MAP
de setParameters.
kParamIndexQpOffsetMapBuffer é uma matriz de bytes em
C2InfoBuffer,
com os seguintes atributos:
Comprimento: o número de blocos de 16 x 16 em um frame.
Valor: cada valor da matriz é o deslocamento de QP de um bloco de 16 x 16, na região -51~51. O QP da maior unidade de codificação (LCU, na sigla em inglês) de destino é calculado pelo controle de taxa do codificador mais o deslocamento. Se o resultado calculado exceder a região de 0 a 51, o valor será truncado para 0 a 51.
- Se for 0: nenhum deslocamento de QP, o QP será decidido pelo controle de taxa original.
- Se for diferente de zero: o QP é o controle de taxa original mais o deslocamento.
- Se for negativo: a qualidade do vídeo será aumentada na LCU de destino.
- Se for positivo: a qualidade do vídeo diminuirá na LCU de destino.
Uso: o usuário precisa configurar essa chave como blocos de 16 x 16. O codificador ajusta a configuração para o tamanho real da LCU calculando a média dos valores dos blocos de 16 x 16 na LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
A C2_PARAMKEY_QP_OFFSET_RECTS
chave (definida como coding.qp-offset-rects
define a RoI como QpOffset-Rects. O valor dela é definido usando o parâmetro de entrada PARAMETER_KEY_QP_OFFSET_RECTS de setParameters.
Para oferecer suporte a essa chave, a seguinte estrutura C2QpOffsetRectStruct
é introduzida:
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")
}
Em que:
topeleft: as coordenadas da RoI, em formato retangular. A RoI é esticada para se alinhar aos limites da LCU. O valor representa o canto superior esquerdo de cada pixel, de modo que ((0,0), (16, 16)) define um bloco completo de 16 x 16.qpOffset: cada valor da matriz representa o deslocamento de QP da árearectde destino. A definição e o uso são os mesmos do valorkParamIndexQpOffsetMapBuffer.
Algoritmo de mapeamento
A tabela a seguir mostra o mapeamento das chaves públicas para o framework de vídeo:
| Chaves ou APIs públicas | Mapeamento no framework de vídeo |
|---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
O valor é transmitido para kParamIndexQpOffsetMapBuffer como uma
C2InfoBuffer instância. |
PARAMETER_KEY_QP_OFFSET_RECTS |
O valor é convertido de String para
Struct C2QpOffsetRectStruct e transmitido para
C2_PARAMKEY_QP_OFFSET_RECTS. |
Tratamento de erros
A implementação do OEM precisa processar os seguintes casos de erro:
| Erro | Exemplo | Tratamento |
|---|---|---|
| A chave do fornecedor e a chave padronizada são usadas para ativar a RoI. | O usuário chama setFeatureEnabled(FEATURE_ROI) E a
chave do fornecedor para ativar a RoI. |
A RoI precisa ser ativada. |
| O deslocamento de QP está dentro do intervalo, mas não é compatível com fornecedores de SoC. | O usuário define o deslocamento de QP como 12, mas o SoC só oferece suporte a deslocamento de QP até 10. | O intervalo de deslocamento de QP compatível é deixado como melhor esforço. O valor é fixado ao intervalo compatível do SoC. |
| Várias configurações de RoI (uma chave padronizada ou uma chave específica do fornecedor) são definidas para um único frame. | O usuário usa a chave padronizada e a chave do fornecedor para o frame 1. | Se disponível, o framework mantém a primeira configuração padronizada rect, a primeira configuração padronizada QP_map,
ou ambas. Em cada categoria, o framework envia apenas uma configuração padronizada
para o SoC e, se a configuração padronizada estiver disponível,
a implementação do SoC precisará ignorar as configurações do fornecedor. Se
várias configurações forem enviadas para o SoC, o fornecedor do SoC precisará manter
apenas uma configuração de RoI e ignorar o restante das configurações.As configurações são mantidas nessa ordem de prioridade:
|