Transcodificação de mídia compatível

A transcodificação de mídia compatível, lançada no Android 12, é um recurso que permite que os dispositivos usem formatos de mídia mais modernos e de armazenamento eficiente para captura de vídeo, como HEVC, mantendo a compatibilidade com apps. Com esse recurso, os fabricantes de dispositivos podem usar o formato HEVC em vez do AVC por padrão para melhorar a qualidade do vídeo e reduzir os requisitos de armazenamento e largura de banda. Para dispositivos com a transcodificação de mídia compatível ativada, o Android pode converter automaticamente vídeos (de até um minuto de duração) gravados em formatos como HEVC ou HDR quando os vídeos forem abertos por um app que não oferece suporte ao formato. Isso permite que os apps funcionem mesmo quando os vídeos são capturados em formatos mais recentes no dispositivo.

O recurso de transcodificação de mídia compatível fica desativado por padrão. Para solicitar a transcodificação de mídia, os apps precisam declarar os recursos de mídia. Para mais informações sobre como declarar recursos de mídia, consulte Transcodificação de mídia compatível no site para desenvolvedores Android.

Como funciona

O recurso de transcodificação de mídia compatível consiste em duas partes principais:

  • Serviços de transcodificação no framework de mídia:esses serviços convertem arquivos de um formato para outro usando hardware para conversões de baixa latência e alta qualidade. Isso inclui a API de transcodificação, o serviço de transcodificação, um plug-in de OEM para filtros personalizados e o hardware. Para mais detalhes, consulte Visão geral da arquitetura.
  • Recurso de transcodificação de mídia compatível em provedores de mídia:esse componente encontrado em provedores de mídia intercepta apps que acessam arquivos de mídia e veicula o arquivo original ou um arquivo transcodificado com base nos recursos declarados do app. Se um app oferece suporte ao formato do arquivo de mídia, nenhum processamento especial é necessário. Se um app não oferecer suporte ao formato, o framework vai converter o arquivo para um formato mais antigo, como AVC, quando o app acessar o arquivo.

A figura 1 mostra uma visão geral do processo de transcodificação de mídia.

Processo de transcodificação de mídia compatível

Figura 1. Visão geral da transcodificação de mídia compatível.

Formatos com suporte

O recurso de transcodificação de mídia compatível aceita as conversões de formato abaixo:

  • HEVC (8 bits) para AVC:as conversões de codec são realizadas pela conexão de um decodificador de mediacodec e um de codificador de mediacode.
  • HDR10+ (10 bits) para AVC (SDR): as conversões de HDR para SDR são realizadas usando instâncias de mediacodec e um plug-in de fornecedor nas instâncias do decodificador. Para mais informações, consulte Codificação de HDR para SDR.

Origens de conteúdo compatíveis

O recurso de transcodificação de mídia compatível oferece suporte à mídia no dispositivo gerada pelo app de câmera do OEM nativo armazenada na pasta DCIM/Camera/ no volume externo principal. O recurso não é compatível com mídia no armazenamento secundário. O conteúdo transmitido aos dispositivos por e-mail ou cartões SD não é compatível.

Os aplicativos acessam os arquivos com base em vários caminhos. Veja a seguir os caminhos de arquivo em que a transcodificação é ativada ou ignorada:

  • Transcodificação ativada:

    • Acesso ao app pelas APIs MediaStore
    • Acesso ao app por meio de APIs de caminho de arquivo direto, incluindo Java e código nativo
    • Acesso a apps pelo Framework de acesso ao armazenamento (SAF, na sigla em inglês)
    • Acesso de apps pelas intents da planilha de compartilhamento do SO. (Somente URI do MediaStore)
    • Transferência de arquivos MTP/PTP do telefone para o PC
  • Transcodificação ignorada:

    • Transferindo arquivo de um dispositivo ejetando o cartão SD
    • Transferir arquivos de um dispositivo para outro usando opções como Compartilhar por proximidade ou transferência por Bluetooth.

Adicionar caminhos de arquivo personalizados para transcodificação

Os fabricantes de dispositivos podem adicionar caminhos de arquivo para transcodificação de mídia no diretório DCIM/. Todos os caminhos fora do diretório DCIM/ são rejeitados. A adição desses caminhos de arquivo pode ser necessária para atender aos requisitos da operadora ou às regulamentações locais.

Para adicionar um caminho de arquivo, use a sobreposição de recursos no ambiente de execução (RRO, na sigla em inglês) do caminho de transcodificação, config_supported_transcoding_relative_paths. Veja a seguir um exemplo de como adicionar um caminho de arquivo:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

Para verificar os caminhos de arquivo configurados, use:

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

Visão geral da arquitetura

Esta seção descreve a arquitetura do recurso de transcodificação de mídia.

arquitetura-de-transcodificação-de-mídia

Figura 2. Arquitetura de transcodificação de mídia.

A arquitetura de transcodificação de mídia consiste nos seguintes componentes:

  • API do sistema MediaTransEncodingManager:interface que permite que o cliente se comunique com o serviço MediaTransEncoding. O módulo MediaProvider usa essa API.
  • MediaTranscodingService: serviço nativo que gerencia conexões de clientes, programa solicitações de transcodificação e gerencia a contabilidade de TranscodingSessions.
  • MediaTranscoder:biblioteca nativa que executa transcodificação. Essa biblioteca foi criada com base no NDK do framework de mídia para oferecer compatibilidade com módulos.

O recurso de transcodificação de mídia compatível registra métricas de transcodificação no serviço e no transcodificador de mídia. O lado do cliente e o código do lado do serviço estão no módulo MediaProvider para permitir correções de bugs e atualizações em tempo hábil.

Acesso ao arquivo

A transcodificação de mídia compatível é criada com base no sistema de arquivos no espaço do usuário (FUSE), que é usado para armazenamento com escopo. O FUSE permite que o módulo MediaProvider examine as operações de arquivos no espaço do usuário e bloqueie o acesso a arquivos com base na política para permitir, negar ou encobrir o acesso.

Quando um app tenta acessar um arquivo, o daemon do FUSE intercepta o acesso de leitura do arquivo. Se o app for compatível com um formato mais recente (como HEVC), o arquivo original será retornado. Se o app não oferecer suporte ao formato, o arquivo será transcodificado para um formato mais antigo (como AVC) ou retornado do cache se uma versão transcodificada estiver disponível.

Solicitar arquivos transcodificados

O recurso de transcodificação de mídia compatível é desativado por padrão. Isso significa que, se o dispositivo oferecer suporte a HEVC, o Android não transcodificará arquivos, a menos que seja especificado por um app em um arquivo de manifesto ou na lista para forçar a transcodificação.

Os apps podem solicitar recursos transcodificados usando as seguintes opções:

  • Declarar formatos sem suporte no arquivo de manifesto. Para mais detalhes, consulte Declarar funcionalidades em um recurso e Declarar funcionalidades no código.
  • Adicione apps à lista de transcodificação forçada incluída no módulo MediaProvider. Isso permite a transcodificação para apps que não atualizaram o arquivo de manifesto. Depois que um app atualiza o arquivo de manifesto com formatos sem suporte, ele precisa ser removido da lista de transcodificação forçada. Os fabricantes de dispositivos podem indicar que os apps serão adicionados ou removidos da lista de transcodificação forçada enviando um patch ou informando um bug. A equipe do Android analisa periodicamente a lista e pode remover apps dela.
  • Desative formatos com suporte no framework de compatibilidade de apps no ambiente de execução. Os usuários também podem desativar essa opção para cada app nas configurações.
  • Abra um arquivo com MediaStore enquanto especifica explicitamente formatos sem suporte com a API openTypedAssetFileDescriptor.

Para transferências por USB (dispositivo para PC), a transcodificação é desativada por padrão, mas os usuários podem optar por ativá-la usando a opção Converter vídeos para AVC na tela de configuração Preferências de USB, como mostrado na Figura 3.

Alterne para ativar a transcodificação de mídia

Figura 3. Alterne para ativar a transcodificação de mídia na tela "Preferências de USB".

Restrições à solicitação de arquivos transcodificados

Para evitar que as solicitações de transcodificação bloqueiem recursos do sistema por períodos prolongados, os apps que solicitam sessões de transcodificação são limitados a:

  • 10 sessões consecutivas
  • um tempo total de execução de três minutos

Se um app exceder todas essas restrições, o framework retornará o descritor do arquivo original.

Requisitos do dispositivo

Para oferecer suporte ao recurso de transcodificação de mídia compatível, os dispositivos precisam atender aos seguintes requisitos:

  • O dispositivo tem a codificação HEVC ativada por padrão no app de câmera nativo.
  • (Dispositivos com suporte à transcodificação de HDR para SDR) O dispositivo oferece suporte à captura de vídeo HDR.

Para garantir o desempenho do dispositivo para transcodificação de mídia, o hardware de vídeo e o desempenho do acesso de leitura/gravação ao armazenamento precisam ser otimizados. Quando os codecs de mídia são configurados com prioridade igual a 1, eles precisam operar com a maior capacidade possível. Recomendamos que o desempenho da transcodificação atinja no mínimo 200 QPS. Para testar o desempenho do seu hardware, execute a comparação do transcodificador de mídia em frameworks/av/media/libmediatranscoding/transcoder/benchmark.

Validação

Para validar o recurso de transcodificação de mídia compatível, execute os seguintes testes CTS:

  • android.media.mediatranscoding.cts
  • android.mediaprovidertranscode.cts

Ativar a transcodificação de mídia globalmente

Para testar o framework de transcodificação de mídia ou o comportamento do app com transcodificação, ative ou desative o recurso de transcodificação de mídia compatível globalmente. Na página Configurações > Sistema > Desenvolvedor > Transcodificação de mídia, defina o botão Substituir padrões de transcodificação como ativado e defina o botão Ativar transcodificação como ativado ou desativado. Se essa configuração estiver ativada, a transcodificação de mídia poderá ocorrer em segundo plano para outros apps diferentes do que você está desenvolvendo.

Verificar o status da transcodificação

Durante o teste, é possível usar o seguinte comando de shell do ADB para verificar o status da transcodificação, incluindo sessões atuais e anteriores:

adb shell dumpsys media.transcoding

Estender o limite de duração do vídeo

Para fins de teste, estenda o limite de um minuto de duração do vídeo para transcodificação usando o comando a seguir. Pode ser necessário reinicializar depois da execução desse comando.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Origem e referências do AOSP

Confira a seguir o código-fonte do AOSP relacionado à transcodificação de mídia compatível.

Codificação de HDR para SDR

Para oferecer suporte à codificação HDR para SDR, os fabricantes de dispositivos podem usar o plug-in de filtro de exemplo AOSP 2.0 do AOSP localizado em /platform/frameworks/av/media/codec2/hidl/plugin/. Esta seção descreve como o plug-in de filtro funciona, como implementá-lo e como testá-lo.

Se um dispositivo não incluir um plug-in com suporte à codificação HDR para SDR, um app que acessar um vídeo HDR vai receber o descritor do arquivo original, independente dos recursos de mídia do app declarados no manifesto.

Como funciona

Esta seção descreve o comportamento geral do plug-in de filtros Codec 2.0.

Contexto

O Android oferece uma implementação de camada de adaptação entre a interface Codec 2.0 e a interface HAL android.hardware.media.c2 em android::hardware::media::c2. Para plug-ins de filtro, o AOSP inclui um mecanismo de wrapper que une os decodificadores aos plug-ins de filtro. O MediaCodec reconhece esses componentes encapsulados como decodificadores com recursos de filtragem.

Informações gerais

A classe FilterWrapper usa os codecs do fornecedor e retorna codecs encapsulados de volta à camada de adaptação media.c2. A classe FilterWrapper carrega libc2filterplugin.so usando a API FilterWrapper::Plugin e registra os filtros disponíveis do plug-in. Na criação, FilterWrapper instancia todos os filtros disponíveis. Somente os filtros que alteram o buffer são iniciados no início.

Filtrar arquitetura do plug-in

Figura 1. Arquitetura do plug-in de filtro.

Interface do plug-in de filtros

A interface FilterPlugin.h define as seguintes APIs para expor os filtros:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Retorna um objeto C2ComponentStore que contém filtros. Isso é diferente do que a implementação Codec 2.0 do fornecedor expõe. Normalmente, esse armazenamento contém apenas os filtros usados pela classe FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

    Descreve os filtros, além do que está disponível em C2ComponentStore. As seguintes descrições são definidas:

    • controlParam: parâmetros que controlam o comportamento dos filtros. Por exemplo, no mapeador de tons HDR para SDR, o parâmetro de controle é a função de transferência de destino.
    • affectedParams: parâmetros afetados pelas operações de filtragem. Por exemplo, no mapeador de tons HDR para SDR, os parâmetros afetados são os aspectos de cor.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Retornará true se o componente de filtro alterar o buffer. Por exemplo, o filtro de mapeamento de tons vai retornar true se a função de transferência de destino for SDR e a função de transferência de entrada for HDR (HLG ou PQ).

Detalhes de FilterWrapper

A seção descreve os detalhes da classe FilterWrapper.

com base em trends

O componente encapsulado instancia o decodificador subjacente e todos os filtros definidos na criação.

Consulta e configuração

O componente encapsulado separa os parâmetros recebidos das consultas ou solicitações de configuração de acordo com a descrição do filtro. Por exemplo, a configuração do parâmetro de controle de filtros é encaminhada para o filtro correspondente, e os parâmetros afetados dos filtros estão presentes nas consultas (em vez de fazer a leitura no decodificador que não tem parâmetros não afetados).

Consulta e configuração

Figura 2. Consulta e configuração.

Começar

No início, o componente encapsulado inicia o decodificador e todos os filtros que alteram os buffers. Se nenhum filtro estiver ativado, o componente encapsulado iniciará o decodificador e os buffers de passagem e enviará comandos ao próprio decodificador.

Processamento de buffer

Processamento de buffer

Figura 3. Processamento do buffer.

Os buffers na fila para o decodificador encapsulado vão para o decodificador subjacente. O componente encapsulado captura o buffer de saída do decodificador usando um callback onWorkDone_nb() e o coloca na fila dos filtros. O buffer de saída final do último filtro é informado ao cliente.

Para que esse processamento de buffer funcione, o componente encapsulado precisa configurar C2PortBlockPoolsTuning para o último filtro, de modo que a saída do framework seja armazenada em buffer do pool de blocos esperado.

Parar, redefinir e soltar

No fim, o componente encapsulado interrompe o decodificador e todos os filtros ativados que foram iniciados. Na redefinição e no lançamento, todos os componentes são redefinidos ou liberados, independentemente de estarem ativados ou não.

Implementar o plug-in de filtro de amostra

Para ativar o plug-in, faça o seguinte:

  1. Implemente a interface FilterPlugin em uma biblioteca e solte-a em /vendor/lib[64]/libc2filterplugin.so..
  2. Adicione outras permissões a mediacodec.te, se necessário.
  3. Atualize a camada de adaptação para o Android 12 e recrie o serviço media.c2.

Testar o plug-in

Para testar o plug-in de amostra, faça o seguinte:

  1. Recrie e atualize o dispositivo.
  2. Crie o plug-in de amostra usando o seguinte comando:

    m sample-codec2-filter-plugin
    
  3. Remonte o dispositivo e renomeie o plug-in do fornecedor para que ele seja reconhecido pelo serviço de codec.

    adb root
    adb remount
    adb reboot
    adb wait-for-device
    adb root
    adb remount
    adb
    push /out/target/<...>/lib64/sample-codec2-filter-plugin.so \
    
    /vendor/lib64/libc2filterplugin.so
    adb push
    /out/target/<...>/lib/sample-codec2-filter-plugin.so \
    
    /vendor/lib/libc2filterplugin.so
    adb reboot