Orientações do OEM para a implementação do ROI

O Android 15 apresenta um processo padronizado para integrar configurações de usuário de região de interesse (RoI) ao framework de codificação de vídeo do Android. Esse recurso permite uma melhor qualidade de compactação para regiões de interesse ao oferecer 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 a RoI para codificação de vídeo com a flag FEATURE_Roi. Se FEATURE_Roi não estiver ativado, 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 necessárias no framework de vídeo 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 frames do codificador, a configuração é ajustada dinamicamente durante a fase de execução, antes de o buffer de entrada ser enfileirado, conforme descrito a seguir:

  • Em um cenário fixo, 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 indica o mapa qp-offset de um frame. O valor é definido usando o parâmetro de entrada 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 16x16 na região -51~51. O QP da maior unidade de codificação (LCU) 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 0: sem compensação de QP, o QP é decidido pelo controle de taxa original.
    • Se for diferente de zero: QP é o controle de taxa original mais o ajuste.
    • Se for negativo: a qualidade do vídeo será aumentada na LCU de destino.
    • Se for positivo: a qualidade do vídeo diminui na LCU de destino.
  • Uso: o usuário precisa configurar essa chave como blocos de 16 x 16. O codificador ajusta a configuração ao tamanho real da LCU calculando a média dos valores dos blocos de 16x16 na LCU.

C2_PARAMKEY_QP_OFFSET_RECTS

A chave C2_PARAMKEY_QP_OFFSET_RECTS (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 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:

  • top e left: as coordenadas da região de interesse, em formato retangular. O ROI é esticado 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 16x16.

  • qpOffset: cada valor da matriz representa o deslocamento de QP da área de destino rect. A definição e o uso são os mesmos do valor kParamIndexQpOffsetMapBuffer.

Algoritmo de mapeamento

A tabela a seguir mostra o mapeamento das chaves públicas para o framework de vídeo:

Chaves públicas ou APIs Mapeamento no framework de vídeo
PARAMETER_KEY_QP_OFFSET_MAP O valor é transmitido para kParamIndexQpOffsetMapBuffer como uma instância de C2InfoBuffer.
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 Manuseio
As chaves do fornecedor e padronizadas são usadas para ativar o ROI. O usuário chama setFeatureEnabled(FEATURE_ROI) E a chave do fornecedor para ativar o ROI. O ROI precisa estar ativado.
O deslocamento de QP está dentro do intervalo, mas não é compatível com os fornecedores de SoC. O usuário define o valor de QP como 12, mas o SoC só aceita até 10. O intervalo de compensação de QP compatível é deixado como o melhor esforço. O valor é fixado no intervalo compatível do SoC.
Várias configurações de ROI (uma chave padronizada ou 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 padronizada de rect, a primeira configuração padronizada de QP_map ou ambas. Em cada categoria, a estrutura envia apenas uma configuração padronizada para o SoC. Se a configuração padronizada estiver disponível, a implementação do SoC vai ignorar as configurações do fornecedor. Se várias configurações forem enviadas ao SoC, o fornecedor dele precisará manter apenas uma configuração de RoI e ignorar as demais.

As configurações são mantidas nesta ordem de prioridade:

  1. rect padronizado
  2. QP_map padronizado
  3. Fornecedor rect
  4. Fornecedor QP_map