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 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) gravados em formatos como HEVC ou HDR quando os vídeos são abertos por um app que não é compatível com o formato. Isso permite que os apps funcionem mesmo quando os vídeos são gravados 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 as funcionalidades 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 na estrutura de mídia:esses serviços convertem arquivos de um formato para outro usando hardware para baixa latência e conversões de alta qualidade. Isso inclui a API de transcodificação, o serviço de transcodificação, um plug-in OEM para filtros personalizados e 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 disponibiliza o arquivo original ou um arquivo transcodificado com base nos recursos declarados do app. Se um app for compatível com o formato do arquivo de mídia, não será necessário um tratamento especial. Se um app não for compatível com o 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.
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 seguintes conversões de formato:
- HEVC (8 bits) para AVC:as conversões de codec são realizadas conectando um decodificador e um codificador mediacodec.
- HDR10+ (10 bits) para AVC (SDR): as conversões de HDR para SDR são realizadas usando instâncias do mediacodec e um hook de plug-in do 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 aceita mídia gerada no dispositivo
pelo app de câmera nativo do OEM, 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 transferido para dispositivos por e-mail ou cartões SD não é compatível.
Os apps acessam os arquivos com base em vários caminhos de arquivo. A seguir, descrevemos os caminhos de arquivo em que a transcodificação é ativada ou ignorada:
Transcodificação ativada:
- Acesso de apps pelas APIs MediaStore
- Acesso ao app por APIs de caminho de arquivo direto, incluindo Java e código nativo
- Acesso de apps pelo Framework de acesso ao armazenamento (SAF)
- Acesso a apps por intents da planilha de compartilhamento do SO. (Somente URI do MediaStore)
- Transferência de arquivos MTP/PTP do smartphone para o PC
Transcodificação ignorada:
- Transferir arquivos de um dispositivo removendo 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 o caminho de transcodificação
sobreposição de recursos de tempo de execução (RRO),
config_supported_transcoding_relative_paths
. Confira abaixo 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.
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 essa API.
- MediaTranscodingService:serviço nativo que gerencia conexões de clientes, agenda solicitações de transcodificação e gerencia a contabilidade do
TranscodingSessions
. - MediaTranscoder:biblioteca nativa que realiza a transcodificação. Essa biblioteca é criada com base no NDK do framework de mídia 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 serviço está no módulo MediaProvider para permitir correções de bugs e atualizações em tempo hábil.
Acesso a arquivos
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 operações de arquivo no espaço do usuário e controle o acesso a arquivos com base na política para permitir, negar ou censurar o acesso.
Quando um app tenta acessar um arquivo, o daemon FUSE intercepta o acesso de leitura do arquivo pelo app. Se o app for compatível com um formato mais recente (como HEVC), o arquivo original será retornado. Se o app não for compatível com o formato, o arquivo será transcodificado para um formato mais antigo (como AVC) ou será retornado do cache se uma versão transcodificada estiver disponível.
Solicitar arquivos transcodificados
O recurso de transcodificação de mídia compatível fica desativado por padrão. Os apps podem solicitar recursos transcodificados usando as seguintes opções:
- Declare formatos não compatíveis no arquivo de manifesto. Para mais detalhes, consulte Declarar funcionalidades em um recurso e Declarar funcionalidades no código.
- Desative os formatos compatíveis com a estrutura de compatibilidade de apps no tempo de execução. Os usuários também podem desativar essa opção para cada app em "Configurações".
- Abra um arquivo com
MediaStore
e especifique explicitamente formatos não compatíveis com a APIopenTypedAssetFileDescriptor
.
Para transferências USB (dispositivo para PC), a transcodificação fica desativada por padrão, mas os usuários podem ativar a transcodificação usando a chave Converter vídeos para AVC na tela de configurações Preferências de USB, conforme mostrado na Figura 3.
Figura 3. Ative a transcodificação de mídia na tela "Preferências de USB".
Restrições para solicitar arquivos transcodificados
Para evitar que solicitações de transcodificação bloqueiem recursos do sistema por longos períodos, os apps que pedem 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 vai retornar o descritor de 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 compatíveis com transcodificação HDR para SDR) O dispositivo é compatível com captura de vídeo HDR
Para garantir o desempenho do dispositivo na transcodificação de mídia, é necessário otimizar o desempenho de leitura/gravação do hardware de vídeo e do armazenamento. 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 a performance de transcodificação alcance um mínimo de 200 fps. Para testar o desempenho do hardware, execute o comparativo de mercado 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 do 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, você pode ativar ou desativar o recurso de transcodificação de mídia compatível globalmente. Na página de opções do desenvolvedor Configurações > Sistema > Desenvolvedor > Transcodificação de mídia, defina a opção Substituir padrões de transcodificação como ativada e, em seguida, defina a opção Ativar transcodificação como ativada ou desativada. Se essa configuração estiver ativada, a transcodificação de mídia poderá ocorrer em segundo plano para apps diferentes daquele que você está desenvolvendo.
Verificar o status da transcodificação
Durante o teste, use o seguinte comando do shell ADB para verificar o status da transcodificação, incluindo sessões atuais e anteriores:
adb shell dumpsys media.transcoding
Aumentar o limite de duração do vídeo
Para fins de teste, é possível estender a limitação de um minuto de duração do vídeo para transcodificação usando o seguinte comando. Talvez seja necessário reiniciar o dispositivo depois de executar esse comando.
adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>
Origem e referências do AOSP
Confira abaixo o código-fonte do AOSP relacionado à transcodificação de mídia compatível.
API do sistema de transcodificação (usada apenas pelo MediaProvider)
API ApplicationMediaCapabilities
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
MediaTranscoding Service
frameworks/av/services/mediatranscoding/
frameworks/av/media/libmediatranscoding/
Native MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder
Plug-in de exemplo de HDR para MediaTranscoder
Intercepção de arquivos MediaProvider e código de transcodificação
Comparativo de MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder/benchmark
Testes do CTS
cts/tests/tests/mediatranscoding/
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 do Codec 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 compatível com a codificação HDR para SDR, um app que acessar um vídeo HDR vai receber o descritor de arquivo original, independente das capacidades de mídia do app declaradas no manifesto.
Como funciona
Esta seção descreve o comportamento geral do plug-in de filtro Codec 2.0.
Contexto
O Android fornece 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 agrupa decodificadores com plug-ins de filtro.
O MediaCodec
reconhece esses componentes encapsulados como decodificadores com recursos de filtragem.
Visão geral
A classe FilterWrapper
usa codecs do fornecedor e retorna
codecs encapsulados para a camada de adaptação media.c2
. A classe FilterWrapper
carrega libc2filterplugin.so
pela API FilterWrapper::Plugin
e
registra os filtros disponíveis do plug-in. Na criação, FilterWrapper
instancia todos os filtros disponíveis. Apenas filtros que alteram o buffer são iniciados na inicialização.
Figura 4. Arquitetura de plug-in de filtro.
Interface do plug-in 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 é separado do que a implementação do Codec 2.0 do fornecedor expõe. Normalmente, essa loja contém apenas os filtros usados pela classeFilterWrapper
.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 um 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 o mapeador de tons HDR para SDR, os parâmetros afetados são os aspectos de cor.
bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)
Retorna
true
se o componente de filtro alterar o buffer. Por exemplo, o filtro de mapeamento de tons retornatrue
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 detalhes da classe FilterWrapper
.
Criação
O componente encapsulado cria uma instância do decodificador subjacente e de todos os filtros definidos na criação.
Consulta e configuração
O componente encapsulado 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 de filtro é encaminhada ao filtro correspondente, e os parâmetros afetados dos filtros estão presentes nas consultas (em vez de serem lidos do decodificador que tem parâmetros não afetados).
Figura 5. Consulta e configuração.
Iniciar
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 vai iniciar o decodificador e os buffers de passagem e enviar comandos para o próprio decodificador.
Tratamento de buffer
Figura 6. Tratamento de buffers.
Os buffers enfileirados no decodificador encapsulado vão para o decodificador subjacente. O componente
encapsulado extrai o buffer de saída do decodificador por um callback onWorkDone_nb()
e o enfileira nos 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. Assim, o framework gera buffers de saída
do pool de blocos esperado.
Parar, redefinir e liberar
Ao parar, o componente encapsulado interrompe o decodificador e todos os filtros ativados que foram iniciados. Na redefinição e na liberação, 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:
- Implemente a interface
FilterPlugin
em uma biblioteca e solte-a em/vendor/lib[64]/libc2filterplugin.so.
- Adicione outras permissões a
mediacodec.te
, se necessário. - Atualize a camada de adaptação para o Android 12 e
recompile o serviço
media.c2
.
Testar o plug-in
Para testar o plug-in de exemplo, faça o seguinte:
- Recrie e faça o flash do dispositivo.
Crie o plug-in de exemplo usando o seguinte comando:
m sample-codec2-filter-plugin
Coloque o dispositivo no suporte novamente 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