Transcodificação de mídia compatível

A transcodificação de mídia compatível, introduzida no Android 12, é um recurso que permite que os dispositivos usem formatos de mídia mais modernos e com armazenamento eficiente para captura de vídeo, como HEVC, enquanto mantém a compatibilidade com aplicativos. Com esse recurso, os fabricantes de dispositivos podem usar HEVC em vez de AVC por padrão para melhorar a qualidade do vídeo e reduzir os requisitos de armazenamento e largura de banda. Para dispositivos com transcodificação de mídia compatível habilitada, o Android pode converter automaticamente vídeos (com até um minuto de duração) gravados em formatos como HEVC ou HDR quando os vídeos são abertos por um aplicativo que não suporta o formato. Isso permite que os aplicativos 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 está desativado por padrão. Para solicitar a transcodificação de mídia, os apps devem declarar seus recursos de mídia. Para obter mais informações sobre como declarar recursos de mídia, consulte Transcodificação de mídia compatível no site de desenvolvedores Android.

Como funciona

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

  • Serviços de transcodificação na estrutura 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 plugin OEM para filtros personalizados e hardware. Para obter mais detalhes, consulte Visão geral da arquitetura .
  • Recurso de transcodificação de mídia compatível em provedores de mídia: este componente encontrado em provedores de mídia intercepta aplicativos que acessam arquivos de mídia e exibe o arquivo original ou um arquivo transcodificado com base nos recursos declarados do aplicativo. Se um aplicativo suportar o formato do arquivo de mídia, nenhum tratamento especial será necessário. Se um aplicativo não oferecer suporte ao formato, a estrutura converterá o arquivo em um formato mais antigo, como AVC, quando o aplicativo 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 suportados

O recurso de transcodificação de mídia compatível oferece suporte às seguintes conversões de formato:

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

Fontes de conteúdo suportadas

O recurso de transcodificação de mídia compatível suporta mídia no dispositivo gerada pelo aplicativo de câmera OEM nativo que é armazenado na pasta DCIM/Camera/ no volume externo primário. O recurso não oferece suporte a 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 de arquivos. A seguir descrevemos os caminhos de arquivo onde a transcodificação é habilitada ou ignorada:

  • Transcodificação habilitada:

    • Acesso a aplicativos por meio de APIs MediaStore
    • Acesso ao aplicativo por meio de APIs de caminho de arquivo direto, incluindo Java e código nativo
    • Acesso ao aplicativo por meio do Storage Access Framework (SAF)
    • Acesso ao aplicativo por meio das intenções da planilha de compartilhamento do sistema operacional. (somente URI do MediaStore)
    • Transferência de arquivos MTP/PTP do telefone para o PC
  • Transcodificação ignorada:

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

Adicione caminhos de arquivos personalizados para transcodificação

Os fabricantes de dispositivos podem opcionalmente adicionar caminhos de arquivo para transcodificação de mídia no diretório DCIM/ . Quaisquer caminhos fora do diretório DCIM/ serão rejeitados. A adição de tais 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 recurso de tempo de execução (RRO) do caminho de transcodificação, config_supported_transcoding_relative_paths . A seguir está 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 arquivos 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 MediaTranscodingManager: Interface que permite ao cliente se comunicar com o serviço MediaTranscoding. O módulo MediaProvider usa esta API.
  • MediaTranscodingService: serviço nativo que gerencia conexões de clientes, agenda solicitações de transcodificação e gerencia a contabilidade para TranscodingSessions .
  • MediaTranscoder: Biblioteca nativa que realiza transcodificação. Esta biblioteca é construída sobre a estrutura de mídia NDK para ser compatível 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 código do lado do cliente e do lado do serviço está no módulo MediaProvider para permitir correções e atualizações de bugs em tempo hábil.

Acesso a arquivos

A transcodificação de mídia compatível é construída sobre o sistema de arquivos Filesystem in Userspace (FUSE) , que é usado para armazenamento com escopo definido. O FUSE permite que o módulo MediaProvider examine as operações de arquivo no espaço do usuário e bloqueie o acesso aos arquivos com base na política para permitir, negar ou redigir o acesso.

Quando um aplicativo tenta acessar um arquivo, o daemon FUSE intercepta o acesso de leitura do arquivo do aplicativo. Se o aplicativo suportar um formato mais recente (como HEVC), o arquivo original será retornado. Se o aplicativo não suportar o 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 está desativado por padrão, o que significa que se o dispositivo for compatível com HEVC, o Android não transcodificará arquivos, a menos que especificado por um aplicativo em um arquivo de manifesto ou na lista de transcodificação forçada .

Os aplicativos podem solicitar ativos transcodificados usando as seguintes opções:

  • Declare formatos não suportados no arquivo de manifesto. Para obter detalhes, consulte Declarar recursos em um recurso e Declarar recursos no código .
  • Adicione aplicativos à lista de transcodificação forçada incluída no módulo MediaProvider . Isso permite a transcodificação de aplicativos que não atualizaram o arquivo de manifesto. Depois que um aplicativo atualiza seu arquivo de manifesto com formatos não suportados, ele deve ser removido da lista de transcodificação forçada. Os fabricantes de dispositivos podem indicar seus aplicativos para serem adicionados ou removidos da lista de transcodificação forçada enviando um patch ou relatando um bug . A equipe do Android analisa periodicamente a lista e pode remover aplicativos da lista.
  • Desative os formatos suportados com a estrutura de compatibilidade de aplicativos em tempo de execução (os usuários também podem desativar isso para cada aplicativo em Configurações).
  • Abra um arquivo com MediaStore especificando explicitamente formatos não suportados com a API openTypedAssetFileDescriptor .

Para transferências USB (dispositivo para PC), a transcodificação está desabilitada por padrão, mas os usuários podem optar por habilitar a transcodificação usando o botão Converter vídeos em AVC na tela de configuração de Preferências USB , conforme 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 USB.

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

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

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

Se um aplicativo exceder todas essas restrições, a estrutura retornará o descritor de arquivo original.

Requisitos do dispositivo

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

  • O dispositivo tem codificação HEVC ativada por padrão no aplicativo de câmera nativo
  • (Dispositivos que suportam transcodificação de HDR para SDR) O dispositivo suporta captura de vídeo HDR

Para garantir o desempenho do dispositivo para transcodificação de mídia, o desempenho do hardware de vídeo e do acesso de leitura/gravação de armazenamento deve ser otimizado. Quando os codecs de mídia são configurados com prioridade igual a 1 , os codecs devem operar com a taxa de transferência mais alta possível. Recomendamos que o desempenho da transcodificação atinja um mínimo de 200 fps. Para testar o desempenho do seu hardware, execute o benchmark 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

Habilite a transcodificação de mídia globalmente

Para testar a estrutura de transcodificação de mídia ou o comportamento do aplicativo com transcodificação, você pode ativar ou desativar o recurso de transcodificação de mídia compatível globalmente. Na página Configurações > Sistema > Desenvolvedor > Opções do desenvolvedor de transcodificação de mídia , defina o botão Substituir padrões de transcodificação como ativado e, em seguida, defina o botão Ativar transcodificação como ativado ou desativado . Se esta configuração estiver habilitada, a transcodificação de mídia poderá ocorrer em segundo plano para aplicativos diferentes daquele que você está desenvolvendo.

Verifique o status da transcodificação

Durante o teste, você pode usar o seguinte comando shell ADB para verificar o status da transcodificação, incluindo sessões de transcodificação atuais e anteriores:

adb shell dumpsys media.transcoding

Estenda a limitação de duração do vídeo

Para fins de teste, você pode estender a limitação de duração do vídeo de um minuto para transcodificação usando o comando a seguir. Uma reinicialização pode ser necessária após a execução deste comando.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Fonte e referências AOSP

A seguir estão os códigos-fonte AOSP relacionados à transcodificação de mídia compatível.

Codificação HDR para SDR

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

Se um dispositivo não incluir um plug-in compatível com codificação HDR para SDR, um aplicativo que acessa um vídeo HDR obterá o descritor de arquivo original, independentemente dos recursos de mídia do aplicativo declarados no manifesto.

Como funciona

Esta seção descreve o comportamento geral do plugin de filtro Codec 2.0.

Fundo

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

Visão geral

A classe FilterWrapper pega codecs de fornecedores e retorna codecs empacotados de volta para a camada de adaptação media.c2 . A classe FilterWrapper carrega libc2filterplugin.so por meio da API FilterWrapper::Plugin e registra os filtros disponíveis no plug-in. Na criação, FilterWrapper instancia todos os filtros disponíveis. Somente filtros que alteram o buffer são iniciados no início.

Arquitetura do plugin de filtro

Figura 1. Arquitetura do plugin de filtro.

Interface do plugin de filtro

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 do 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, para 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, para 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 tom 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 do FilterWrapper

A seção descreve detalhes da classe FilterWrapper .

Criação

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

Consulta e configuração

O componente empacotado separa os parâmetros recebidos de 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 do filtro é roteada para o filtro correspondente e os parâmetros afetados dos filtros estão presentes nas consultas (em vez de serem lidos no decodificador que possui 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 habilitado, o componente empacotado inicia o decodificador e os buffers de passagem e envia comandos para o próprio decodificador.

Manipulação de buffer

Manipulação de buffer

Figura 3. Manuseio de buffer.

Os buffers enfileirados no decodificador empacotado vão para o decodificador subjacente. O componente encapsulado captura o buffer de saída do decodificador por meio de um retorno de chamada onWorkDone_nb() e o coloca na fila dos filtros. O buffer de saída final do último filtro é relatado ao cliente.

Para que esse manuseio de buffer funcione, o componente encapsulado deve configurar C2PortBlockPoolsTuning para o último filtro para que a estrutura produza buffers do pool de blocos esperado.

Pare, reinicie e solte

Na parada, o componente encapsulado interrompe o decodificador e todos os filtros habilitados que foram iniciados. Na redefinição e na liberação, todos os componentes são redefinidos ou liberados, independentemente de estarem habilitados ou não.

Implemente o plugin de filtro de amostra

Para ativar o plugin, faça o seguinte:

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

Teste o plug-in

Para testar o plugin de amostra, faça o seguinte:

  1. Reconstrua e atualize o dispositivo.
  2. Crie o plugin de amostra usando o seguinte comando:

    m sample-codec2-filter-plugin
    
  3. Remonte o dispositivo e renomeie o plugin do fornecedor para que 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