Orientação do OEM para implementação da RoI

O Android 15 introduz um processo padronizado para integração de configurações do usuário da região de interesse (RoI, na sigla em inglês) ao vídeo do Android de codificador-decodificador. Esse recurso permite uma melhor qualidade de compactação de RoIs ao oferecendo APIs públicas para integrar e analisar configurações de usuário no vídeo codificador.

Implementação

Os fornecedores de SoC e OEMs podem controlar o suporte a RoI para codificação de vídeo com o FEATURE_Roi . Se 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 são introduzidas no Codec2 (C2) para dão 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 da seguinte forma:

  • Em um cenário fixo, se nenhuma configuração de RoI for fornecida para o estado atual, o codificador usa 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 em C2 são descritas nas seções a seguir.

kParamIndexQpoffsetMapBuffer

O kParamIndexQpOffsetMapBuffer indica o mapa de qp-offset para um frame. O valor é definido usando o valor de 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 negativo: a qualidade do vídeo é otimizada na LCU desejada.
    • Se positivo: a qualidade do vídeo diminui na LCU desejada.
  • Uso: o usuário precisa configurar essa chave como blocos de 16x16. 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 a seguir C2QpOffsetRectStruct é apresentado:

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 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 QP do destino rect área. Sua definição e uso são os mesmos do kParamIndexQpOffsetMapBuffer.

.

Algoritmo de mapeamento

A tabela a seguir mostra o mapeamento das chaves públicas para o framework:

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
Tanto a chave de fornecedor quanto a chave padronizada são usadas para ativar a RoI. O usuário chama setFeatureEnabled(FEATURE_ROI) E o de fornecedor para ativar a 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 deslocamento de QP como 12, mas o SoC só oferece suporte ao deslocamento de QP de até 10. O intervalo de compensação de QP com suporte é deixado como o melhor esforço. O valor é preso ao intervalo aceito pelo SoC.
Várias configurações de RoI (seja uma chave padronizada ou chave específica do fornecedor) são definidas como 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 o primeiro rect padronizado a primeira configuração QP_map padronizada, ou ambos. Em cada categoria, o framework envia apenas um no SoC e, se a configuração padronizada estiver disponível, a implementação do SoC precisa ignorar as configurações do fornecedor. Se várias configurações são enviadas ao SoC, o fornecedor do SoC precisa manter apenas uma configuração de RoI e ignorar o restante das configurações.

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

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