Reprodução de vídeo HDR

O vídeo de alta faixa dinâmica (HDR) é a próxima fronteira em decodificação de vídeo de alta qualidade, trazendo qualidades de reprodução de cena incomparáveis. Isso é feito aumentando significativamente a faixa dinâmica do componente de luminância (dos atuais 100 cd/m 2 para 1.000 cd/m 2 ) e usando um espaço de cores muito mais amplo (BT 2020). Este é agora um elemento central da evolução do 4K UHD no espaço da TV.

O Android 10 oferece suporte aos seguintes vídeos HDR.

  • HDR10
  • VP9
  • HDR10+

A partir do Android 9 e superior, o MediaCodec reporta metadados HDR, independentemente do modo de túnel. Você pode obter dados decodificados junto com metadados estáticos/dinâmicos no modo sem túnel. Para HDR10 e VP9Profile2 que usam metadados estáticos, eles são relatados no formato de saída com a chave KEY_HDR_STATIC_INFO . Para HDR10+ que usa metadados dinâmicos, isso é relatado com a chave KEY_HDR10_PLUS_INFO no formato de saída e pode mudar para cada quadro de saída. Consulte Tunelamento multimídia para obter mais informações.

Desde o Android 7.0, o suporte inicial ao HDR inclui a criação de constantes adequadas para a descoberta e configuração de pipelines de vídeo HDR. Isso significa definir tipos de codec e modos de exibição e especificar como os dados HDR devem ser passados ​​para o MediaCodec e fornecidos aos decodificadores HDR.

O objetivo deste documento é ajudar os desenvolvedores de aplicativos a oferecer suporte à reprodução de fluxo HDR e ajudar OEMs e SOCs a habilitar os recursos HDR.

Tecnologias HDR suportadas

A partir do Android 7.0 e superior, as seguintes tecnologias HDR são suportadas.

Tecnologia Dolby Vision HDR10 VP9-HLG VP9-PQ
Codec AVC/HEVC HEVC VP9 VP9
Função de transferência ST-2084 ST-2084 Grupo de alto nível ST-2084
Tipo de metadados HDR Dinâmico Estático Nenhum Estático

No Android 7.0, apenas a reprodução de HDR via modo de túnel é definida , mas os dispositivos podem adicionar suporte para reprodução de HDR em SurfaceViews usando buffers de vídeo opacos. Em outras palavras:

  • Não existe uma API Android padrão para verificar se a reprodução de HDR é compatível com decodificadores sem túnel.
  • Os decodificadores de vídeo em túnel que anunciam a capacidade de reprodução de HDR devem suportar a reprodução de HDR quando conectados a monitores compatíveis com HDR.
  • A composição GL do conteúdo HDR não é compatível com a versão AOSP Android 7.0.

Descoberta

A reprodução HDR requer um decodificador compatível com HDR e uma conexão a um monitor compatível com HDR. Opcionalmente, algumas tecnologias requerem um extrator específico.

Mostrar

Os aplicativos devem usar a nova API Display.getHdrCapabilities para consultar as tecnologias HDR suportadas pelo display especificado. Estas são basicamente as informações no bloco de dados de metadados estáticos EDID conforme definido em CTA-861.3:

  • public Display.HdrCapabilities getHdrCapabilities()
    Retorna os recursos HDR da tela.
  • Display.HdrCapabilities
    Encapsula os recursos HDR de um determinado monitor. Por exemplo, quais tipos de HDR ele suporta e detalhes sobre os dados de luminância desejados.

Constantes:

  • int HDR_TYPE_DOLBY_VISION
    Suporte Dolby Vision.
  • int HDR_TYPE_HDR10
    Suporte HDR10/PQ.
  • int HDR_TYPE_HDR10_PLUS
    Suporte HDR10+.
  • int HDR_TYPE_HLG
    Suporte híbrido Log-Gamma.
  • float INVALID_LUMINANCE
    Valor de luminância inválido.

Métodos públicos:

  • float getDesiredMaxAverageLuminance()
    Retorna os dados de luminância média do quadro máximo do conteúdo desejado em cd/cd/m 2 para esta exibição.
  • float getDesiredMaxLuminance()
    Retorna os dados de luminância máxima do conteúdo desejado em cd/cd/m 2 para esta exibição.
  • float getDesiredMinLuminance()
    Retorna os dados de luminância mínima do conteúdo desejado em cd/cd/m 2 para esta exibição.
  • int[] getSupportedHdrTypes()
    Obtém os tipos de HDR suportados desta exibição (ver constantes). Retorna uma matriz vazia se o HDR não for compatível com o monitor.

Decodificador

Os aplicativos devem usar a API CodecCapabilities.profileLevels existente para verificar o suporte para os novos perfis compatíveis com HDR:

Dolby Vision

Constante mime MediaFormat :

String MIMETYPE_VIDEO_DOLBY_VISION

Constantes de perfil MediaCodecInfo.CodecProfileLevel :

int DolbyVisionProfileDvavPen
int DolbyVisionProfileDvavPer
int DolbyVisionProfileDvheDen
int DolbyVisionProfileDvheDer
int DolbyVisionProfileDvheDtb
int DolbyVisionProfileDvheDth
int DolbyVisionProfileDvheDtr
int DolbyVisionProfileDvheStn

As camadas e metadados de vídeo Dolby Vision devem ser concatenados em um único buffer por quadros pelos aplicativos de vídeo. Isso é feito automaticamente pelo MediaExtractor compatível com Dolby-Vision.

HEVCHDR 10

Constantes de perfil MediaCodecInfo.CodecProfileLevel :

int HEVCProfileMain10HDR10
int HEVCProfileMain10HDR10Plus

VP9 HLG e PQ

Constantes de perfil MediaCodecInfo.CodecProfileLevel :

int VP9Profile2HDR
int VP9Profile2HDR10Plus
int VP9Profile3HDR
int VP9Profile3HDR10Plus

Se uma plataforma suportar um descodificador compatível com HDR, também deverá suportar um extrator compatível com HDR.

Apenas decodificadores em túnel têm garantia de reprodução de conteúdo HDR. A reprodução por decodificadores sem túnel pode resultar na perda de informações HDR e no nivelamento do conteúdo em um volume de cores SDR.

Extrator

Os seguintes contêineres são compatíveis com as diversas tecnologias HDR no Android 7.0:

Tecnologia Dolby Vision HDR10 VP9-HLG VP9-PQ
Recipiente MP4 MP4 WebM WebM

A descoberta de se uma faixa (de um arquivo) requer suporte HDR não é suportada pela plataforma. Os aplicativos podem analisar os dados específicos do codec para determinar se uma faixa requer um perfil HDR específico.

Resumo

Os requisitos de componentes para cada tecnologia HDR são mostrados na tabela a seguir:

Tecnologia Dolby Vision HDR10 VP9-HLG VP9-PQ
Tipo de HDR compatível (tela) HDR_TYPE_DOLBY_VISION HDR_TYPE_HDR10 HDR_TYPE_HLG HDR_TYPE_HDR10
Recipiente (Extrator) MP4 MP4 WebM WebM
Decodificador MIMETYPE_VIDEO_DOLBY_VISION MIMETYPE_VIDEO_HEVC MIMETYPE_VIDEO_VP9 MIMETYPE_VIDEO_VP9
Perfil (Decodificador) Um dos perfis Dolby HEVCProfileMain10HDR10 VP9Profile2HDR ou VP9Profile3HDR VP9Profile2HDR ou VP9Profile3HDR

Notas:

  • Os fluxos de bits Dolby-Vision são empacotados em um contêiner MP4 de uma forma definida pela Dolby. Os aplicativos podem implementar seus próprios extratores compatíveis com Dolby, desde que empacotem as unidades de acesso das camadas correspondentes em uma única unidade de acesso para o decodificador, conforme definido por Dolby.
  • Uma plataforma pode suportar um extrator compatível com HDR, mas nenhum decodificador compatível com HDR correspondente.

Reprodução

Depois que um aplicativo tiver verificado o suporte para reprodução HDR, ele poderá reproduzir conteúdo HDR quase da mesma maneira que reproduz conteúdo não HDR, com as seguintes advertências:

  • Para Dolby-Vision, não está disponível imediatamente se um arquivo/faixa de mídia específico requer ou não um decodificador compatível com HDR. O aplicativo deve ter essas informações antecipadamente ou ser capaz de obtê-las analisando a seção de dados específica do codec do MediaFormat.
  • CodecCapabilities.isFormatSupported não considera se o recurso de decodificador em túnel é necessário para dar suporte a tal perfil.

Ativar suporte à plataforma HDR

Os fornecedores de SoC e OEMs devem fazer um trabalho adicional para permitir o suporte da plataforma HDR para um dispositivo.

Mudanças de plataforma no Android 7.0 para HDR

Aqui estão algumas mudanças importantes na plataforma (camada de aplicativo/nativa) que OEMs e SOCs precisam estar cientes.

Mostrar

Composição de hardware

As plataformas compatíveis com HDR devem suportar a combinação de conteúdo HDR com conteúdo não HDR. As características e operações exatas de mesclagem não são definidas pelo Android a partir da versão 7.0, mas o processo geralmente segue estas etapas:

  1. Determine um espaço/volume de cores linear que contenha todas as camadas a serem compostas, com base na cor, na masterização e nos possíveis metadados dinâmicos das camadas.
    Se estiver compondo diretamente em uma tela, esse poderá ser o espaço linear que corresponde ao volume de cores da tela.
  2. Converta todas as camadas no espaço de cores comum.
  3. Execute a mistura.
  4. Se exibir através de HDMI:
    1. Determine a cor, a masterização e os possíveis metadados dinâmicos da cena mesclada.
    2. Converta a cena mesclada resultante no espaço/volume de cores derivado.
  5. Se estiver exibindo diretamente no display, converta a cena mesclada resultante nos sinais de display necessários para produzir essa cena.

Exibir descoberta

A descoberta de exibição HDR é compatível apenas via HWC2. Os implementadores de dispositivos devem ativar seletivamente o adaptador HWC2 lançado com o Android 7.0 para que esse recurso funcione. Portanto, as plataformas devem adicionar suporte para HWC2 ou estender a estrutura AOSP para permitir uma forma de fornecer essas informações. HWC2 expõe uma nova API para propagar dados estáticos de HDR para a estrutura e o aplicativo.

HDMI

  • Um monitor HDMI conectado anuncia sua capacidade HDR por meio de HDMI EDID conforme definido na seção 4.2 do CTA-861.3 .
  • Deverá ser utilizado o seguinte mapeamento EOTF:
    • ET_0 Gama tradicional - Faixa de luminância SDR: não mapeada para nenhum tipo de HDR
    • ET_1 Gama tradicional - Faixa de luminância HDR: não mapeada para nenhum tipo de HDR
    • ET_2 SMPTE ST 2084 - mapeado para HDR tipo HDR10
  • A sinalização de suporte Dolby Vision ou HLG via HDMI é feita conforme definido pelos órgãos competentes.
  • Observe que a API HWC2 usa valores flutuantes de luminância desejados, portanto, os valores EDID de 8 bits devem ser traduzidos de maneira adequada.

Decodificadores

As plataformas devem adicionar decodificadores de túnel compatíveis com HDR e anunciar seu suporte a HDR. Geralmente, os decodificadores compatíveis com HDR devem:

  • Suporta decodificação em túnel ( FEATURE_TunneledPlayback ).
  • Suporta metadados estáticos HDR ( OMX.google.android.index.describeHDRColorInfo ) e sua propagação para a composição de display/hardware. Para HLG, os metadados apropriados devem ser enviados para exibição.
  • Suporta descrição de cores ( OMX.google.android.index.describeColorAspects ) e sua propagação para a composição de display/hardware.
  • Suporta metadados incorporados em HDR conforme definido pelo padrão relevante.

Suporte para decodificador Dolby Vision

Para suportar Dolby Vision, as plataformas devem adicionar um decodificador HDR OMX compatível com Dolby-Vision. Dadas as especificidades do Dolby Vision, este normalmente é um decodificador wrapper em torno de um ou mais decodificadores AVC e/ou HEVC, bem como um compositor. Esses decodificadores devem:

  • Suporta tipo mime "video/dolby-vision".
  • Anuncie perfis/níveis Dolby Vision compatíveis.
  • Aceite unidades de acesso que contenham as subunidades de acesso de todas as camadas conforme definido por Dolby.
  • Aceite dados específicos do codec definidos pela Dolby. Por exemplo, dados contendo perfil/nível Dolby Vision e possivelmente os dados específicos do codec para os decodificadores internos.
  • Suporta comutação adaptativa entre perfis/níveis Dolby Vision conforme exigido pelo Dolby.

Ao configurar o decodificador, o perfil Dolby real não é comunicado ao codec. Isto só é feito através de dados específicos do codec após o decodificador ter sido iniciado. Uma plataforma pode optar por oferecer suporte a vários decodificadores Dolby Vision: um para perfis AVC e outro para perfis HEVC para poder inicializar codecs subjacentes durante o tempo de configuração. Se um único decodificador Dolby Vision suportar ambos os tipos de perfis, ele também deverá suportar a alternância entre eles de forma dinâmica e adaptativa.

Se uma plataforma fornecer um decodificador compatível com Dolby-Vision além do suporte geral ao decodificador HDR, ela deverá:

  • Forneça um extrator compatível com Dolby-Vision, mesmo que não suporte reprodução HDR.
  • Forneça um decodificador que suporte o perfil de visão definido pelo Dolby.

Suporte ao decodificador HDR10

Para suportar HDR10, as plataformas devem adicionar um decodificador OMX compatível com HDR10. Normalmente, este é um decodificador HEVC em túnel que também suporta análise e manipulação de metadados relacionados a HDMI. Esse decodificador (além do suporte geral ao decodificador HDR) deve:

  • Suporte ao tipo mime "video/hevc".
  • Anuncie com suporte para HEVCMain10HDR10. O suporte ao perfil HEVCMain10HRD10 também requer suporte ao perfil HEVCMain10, o que requer suporte ao perfil HEVCMain nos mesmos níveis.
  • Suporte à análise dos blocos SEI de metadados de masterização, bem como outras informações relacionadas ao HDR contidas no SPS.

Suporte ao decodificador VP9

Para suportar VP9 HDR, as plataformas devem adicionar um decodificador HDR OMX compatível com VP9 Profile2. Normalmente, este é um decodificador VP9 em túnel que também suporta o tratamento de metadados relacionados a HDMI. Esses decodificadores (além do suporte geral ao decodificador HDR) devem:

  • Suporte ao tipo mime "video/x-vnd.on2.vp9."
  • Anuncie VP9Profile2HDR compatível. O suporte ao perfil VP9Profile2HDR também requer suporte ao perfil VP9Profile2 no mesmo nível.

Extratores

Suporte para extrator Dolby Vision

As plataformas que suportam decodificadores Dolby Vision devem adicionar suporte ao extrator Dolby (chamado Dolby Extractor) para conteúdo Dolby Video.

  • Um extrator MP4 normal só pode extrair a camada base de um arquivo, mas não as camadas de aprimoramento ou de metadados. Portanto, é necessário um extrator Dolby especial para extrair os dados do arquivo.
  • O extrator Dolby deve expor de 1 a 2 trilhas para cada trilha de vídeo Dolby (grupo):
    • Uma faixa Dolby Vision HDR com o tipo de "video/dolby-vision" para o fluxo Dolby combinado de 2/3 camadas. O formato da unidade de acesso da trilha HDR, que define como empacotar as unidades de acesso das camadas de base/aprimoramento/metadados em um único buffer para ser decodificado em um único quadro HDR, será definido por Dolby.
    • Se uma trilha de vídeo Dolby Vision contiver uma camada base (BL) separada (compatível com versões anteriores), o extrator também deverá expô-la como uma trilha "video/avc" ou "video/hevc" separada. O extrator deve fornecer unidades de acesso AVC/HEVC regulares para esta pista.
    • A faixa BL deve ter o mesmo ID exclusivo da faixa ("track-ID") da faixa HDR para que o aplicativo entenda que se trata de duas codificações do mesmo vídeo.
    • O aplicativo pode decidir qual faixa escolher com base na capacidade da plataforma.
  • O perfil/nível Dolby Vision deve ser exposto no formato de trilha da trilha HDR.
  • Se uma plataforma fornecer um decodificador compatível com Dolby-Vision, ela também deverá fornecer um extrator compatível com Dolby-Vision, mesmo que não suporte a reprodução HDR.

Suporte para extrator HDR10 e VP9 HDR

Não há requisitos adicionais de extração para suportar HDR10 ou VP9 HLG. As plataformas devem estender o extrator MP4 para suportar VP9 PQ em MP4. Os metadados estáticos HDR devem ser propagados no fluxo de bits do VP9 PQ, de modo que esses metadados sejam passados ​​para o decodificador VP9 PQ e para a exibição por meio do pipeline normal do MediaExtractor => MediaCodec.

Extensões Stagefright para suporte Dolby Vision

As plataformas devem adicionar suporte ao formato Dolby Vision ao Stagefright:

  • Suporte para consulta de definição de porta para porta compactada.
  • Suporta enumeração de perfil/nível para decodificador DV.
  • Suporte à exposição de perfil/nível DV para trilhas DV HDR.

Detalhes de implementação específicos da tecnologia

Pipeline do decodificador HDR10

Figura 1. Pipeline HDR10

Os fluxos de bits HDR10 são empacotados em contêineres MP4. Os aplicativos usam um extrator MP4 normal para extrair os dados do quadro e enviá-los ao decodificador.

  • Extrator MPEG4
    Os fluxos de bits HDR10 são reconhecidos apenas como um fluxo HEVC normal por um MPEG4Extractor e a trilha HDR com o tipo "vídeo/HEVC" será extraída. A estrutura escolhe um decodificador de vídeo HEVC que suporta o perfil Main10HDR10 para decodificar essa trilha.
  • Decodificador HEVC
    As informações HDR estão em SEI ou SPS. O decodificador HEVC primeiro recebe quadros que contêm informações HDR. O decodificador então extrai as informações HDR e notifica o aplicativo de que está decodificando um vídeo HDR. As informações HDR são agrupadas no formato de saída do decodificador, que é propagado posteriormente para a superfície.

Ações do fornecedor

  1. Anuncie perfil de decodificador HDR compatível e tipo OMX de nível. Exemplo:
    OMX_VIDEO_HEVCProfileMain10HDR10 (e Main10 )
  2. Implementar suporte para índice: ' OMX.google.android.index.describeHDRColorInfo '
  3. Implementar suporte para índice: ' OMX.google.android.index.describeColorAspects '
  4. Implementar suporte para análise SEI de metadados de domínio.

Pipeline do decodificador Dolby Vision

Figura 2. Pipeline Dolby Vision

Os fluxos de bits Dolby são empacotados em contêineres MP4 conforme definido pela Dolby. Os aplicativos poderiam, em teoria, usar um extrator MP4 regular para extrair a camada base, a camada de aprimoramento e a camada de metadados de forma independente; no entanto, isso não se ajusta ao modelo atual do Android MediaExtractor/MediaCodec.

  • Extrator Dolby:
    • Os fluxos de bits Dolby são reconhecidos por um DolbyExtractor, que expõe as várias camadas como 1 a 2 trilhas para cada trilha de vídeo Dolby (grupo):
      • Uma faixa HDR com o tipo de "video/dolby-vision" para o fluxo dolby combinado de 2/3 camadas. O formato da unidade de acesso da trilha HDR, que define como empacotar as unidades de acesso das camadas de base/aprimoramento/metadados em um único buffer para ser decodificado em um único quadro HDR, será definido por Dolby.
      • (Opcional, somente se o BL for compatível com versões anteriores) Uma trilha BL contém apenas a camada base, que deve ser decodificável por um decodificador MediaCodec regular, por exemplo, decodificador AVC/HEVC. O extrator deve fornecer unidades de acesso AVC/HEVC regulares para esta pista. Esta trilha BL deve ter o mesmo track-unique-ID ("track-ID") da trilha Dolby para que o aplicativo entenda que se trata de duas codificações do mesmo vídeo.
    • O aplicativo pode decidir qual faixa escolher com base na capacidade da plataforma.
    • Como uma trilha HDR possui um tipo específico de HDR, a estrutura escolherá um decodificador de vídeo Dolby para decodificar essa trilha. A trilha BL será decodificada por um decodificador de vídeo AVC/HEVC normal.
  • DolbyDecodificador:
    • O DolbyDecoder recebe unidades de acesso que contêm as unidades de acesso necessárias para todas as camadas (EL+BL+MD ou BL+MD)
    • As informações CSD (dados específicos do codec, como SPS+PPS+VPS) para as camadas individuais podem ser empacotadas em um quadro CSD a ser definido pelo Dolby. É necessário ter um único quadro CSD.

Ações Dolby

  1. Definir o empacotamento das unidades de acesso para os vários esquemas de contêiner Dolby (por exemplo, BL+EL+MD) para o decodificador Dolby abstrato (ou seja, o formato de buffer esperado pelo decodificador HDR).
  2. Defina o empacotamento do CSD para o decodificador Dolby abstrato.

Ações do fornecedor

  1. Implementar extrator Dolby. Isso também pode ser feito por Dolby.
  2. Integre DolbyExtractor à estrutura. O ponto de entrada é frameworks/av/media/libstagefright/MediaExtractor.cpp .
  3. Declare o perfil do decodificador HDR e o nível do tipo OMX. Exemplo: OMX_VIDEO_DOLBYPROFILETYPE e OMX_VIDEO_DOLBYLEVELTYP .
  4. Implementar suporte para índice: 'OMX.google.android.index.describeColorAspects '
  5. Propague os metadados HDR dinâmicos para o aplicativo e apareça em cada quadro. Normalmente, essas informações devem ser empacotadas no quadro decodificado conforme definido pelo Dolby, porque o padrão HDMI não fornece uma maneira de transmiti-las ao monitor.

Pipeline do decodificador VP9

Figura 3. Pipeline VP9-PQ

Os fluxos de bits VP9 são empacotados em contêineres WebM de uma forma definida pela equipe WebM. Os aplicativos precisam usar um extrator WebM para extrair metadados HDR do fluxo de bits antes de enviar quadros para o decodificador.

  • Extrator WebM:
  • Decodificador VP9:
    • O decodificador recebe fluxos de bits do Profile2 e os decodifica como fluxos VP9 normais.
    • O decodificador recebe quaisquer metadados estáticos HDR da estrutura.
    • O decodificador recebe metadados estáticos por meio das unidades de acesso de fluxo de bits para fluxos VP9 PQ.
    • O decodificador VP9 deve ser capaz de propagar os metadados estáticos/dinâmicos HDR para o monitor.

Ações do fornecedor

  1. Implementar suporte para índice: OMX.google.android.index.describeHDRColorInfo
  2. Implementar suporte para índice: OMX.google.android.index.describeColorAspects
  3. Propague metadados estáticos de HDR