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 uma melhor qualidade de compactação para ROIs oferecendo APIs públicas para integrar e analisar as configurações do usuário no codificador de vídeo.
Implementação
Os fornecedores de SoC e OEMs podem controlar o suporte de ROI para codificação de vídeo com a flag
FEATURE_Roi
. Se o FEATURE_Roi
não estiver ativado, não haverá mudança no comportamento do codificador de vídeo.
Mudanças na estrutura de vídeo
Esta seção detalha as mudanças na estrutura de vídeo necessárias para implementar essa .
Chaves no Codec2
No Android 15, o mapa de parâmetros de quantização
(QP_map
) e a configuração retangular (rect
) são definidas como RoI
tipos de configuração do Terraform. Além disso, duas chaves foram introduzidas no Codec2 (C2) para
oferecer suporte a esses novos tipos. O uso das duas chaves é o mesmo das APIs públicas.
Dentro do loop de frame do codificador, a configuração é ajustada dinamicamente
durante a fase de execução, antes que o buffer de entrada seja colocado na fila, descrito como
segue:
Em um cenário fixo, se nenhuma configuração de ROI for fornecida para o frame atual, o codificador vai usar a mesma configuração do frame anterior.
Em um cenário dinâmico, os tipos de configuração do ROI podem mudar dinamicamente.
As novas chaves em C2 são descritas nas seções a seguir.
kParamIndexQpoffsetMapBuffer
A chave kParamIndexQpOffsetMapBuffer
sinaliza o mapa qp-offset
para um frame. O valor é definido usando o valor-chave
parâmetro PARAMETER_KEY_QP_OFFSET_MAP
a partir de setParameters
.
kParamIndexQpOffsetMapBuffer
é uma matriz de bytes em
C2InfoBuffer
,
com os seguintes atributos:
Comprimento: o número de blocos de 16x16 em um frame.
Valor: cada valor da matriz é o deslocamento QP de um bloco de 16x16, na região -51 a 51. O QP da maior unidade de codificação (LCU) desejada é calculado pela função o controle de taxa do codificador mais o deslocamento. Se o resultado calculado exceder 0 a 51 região, o valor será truncado para 0~51.
- Se 0: sem compensação do QP, o QP é decidido pelo controle de taxa original.
- Se for diferente de zero: QP é o controle de taxa original mais o deslocamento.
- Se for negativo: a qualidade do vídeo será otimizada na LCU de destino.
- Se positivo: a qualidade do vídeo diminui na LCU desejada.
Uso: o usuário precisa configurar essa chave como blocos de 16 x 16. O codificador ajusta da configuração para o tamanho real da LCU, fazendo a média dos valores dos blocos 16x16 na LCU.
C2_PARAMKEY_QP_OFFSET_RECTS
O C2_PARAMKEY_QP_OFFSET_RECTS
Tecla (definida como coding.qp-offset-rects
)
define o ROI como QpOffset-Rects
. O valor é definido usando o parâmetro de entrada PARAMETER_KEY_QP_OFFSET_RECTS
de setParameters
.
Para oferecer suporte a essa chave, a estrutura C2QpOffsetRectStruct
abaixo foi 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:
top
eleft
: as coordenadas de RoI em um formato retangular. O ROI é ampliada para se alinhar aos limites da LCU. O valor representa canto superior esquerdo de cada pixel, de modo que ((0,0), (16, 16)) defina um bloco de 16x16 completo.qpOffset
: cada valor da matriz representa o deslocamento de QP da área de destinorect
. Sua definição e uso são os mesmos do Valor dekParamIndexQpOffsetMapBuffer
.
Algoritmo de mapeamento
A tabela a seguir mostra o mapeamento das chaves públicas para o estrutural:
Chaves públicas ou APIs | Estrutura de mapeamento em vídeo |
---|---|
PARAMETER_KEY_QP_OFFSET_MAP |
O valor é transmitido para kParamIndexQpOffsetMapBuffer como uma
C2InfoBuffer . |
PARAMETER_KEY_QP_OFFSET_RECTS |
O valor é convertido de String para
Struct C2QpOffsetRectStruct e transmitidos para
C2_PARAMKEY_QP_OFFSET_RECTS |
Tratamento de erros
A implementação do OEM precisa processar os seguintes casos de erro:
Erro | Exemplo | Manuseio |
---|---|---|
A chave do fornecedor e a chave padronizada são usadas para ativar o ROI. | O usuário chama setFeatureEnabled(FEATURE_ROI) E o
de fornecedor para ativar a RoI. |
A RoI precisa estar ativada. |
O deslocamento de QP está dentro do intervalo, mas não é compatível com os fornecedores de SoC. | O usuário define o deslocamento QP como 12, mas o SoC só oferece suporte a deslocamento QP até 10. | O intervalo de deslocamento de QP com suporte é deixado como o melhor esforço. O valor é limitado ao intervalo compatível do SoC. |
Várias configurações de ROI (seja 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 retém a primeira configuração rect
padronizada, a primeira configuração QP_map padronizada
ou ambas. Em cada categoria, o framework envia apenas uma configuração
padronizada para o SoC. 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 ao SoC, o fornecedor do SoC precisará reter
apenas uma configuração de RoI e ignorar o restante.As configurações são retidas nesta ordem de prioridade:
|