O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

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, mantendo 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 (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 aplicativos devem declarar seus recursos de mídia. Para mais informações sobre recursos de mídia declarando, consulte mídia suportados transcodificação no site Android Developers.

Como funciona

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

  • Transcodificação serviços no âmbito de mídia: Estes serviços converter 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 .
  • Mídia compatíveis recurso transcodificação em provedores de mídia: Este componente encontrados em provedores de mídia intercepta aplicativos acessando arquivos de mídia e serve tanto o arquivo original ou um arquivo decodificado com base em capacidades declarados do aplicativo. Se um aplicativo for compatível com o formato do arquivo de mídia, nenhum tratamento especial será necessário. Se um aplicativo não for compatível com o 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 de transcodificação de mídia compatível.

Formatos compatíveis

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

  • HEVC (8 bits) de AVC: conversões Codec são realizadas através de um descodificador de ligação mediacodec e um codificador Mediacode.
  • HDR10 + (10 bits) de AVC (SDR): HDR para SDR conversões são realizadas utilizando instâncias mediacodec e um gancho de encaixe fornecedor para os casos de descodificador. Para mais informações, consulte HDR a codificação SDR .

Fontes de conteúdo compatíveis

Os meios de comunicação compatíveis transcodificação suporta o recurso on-dispositivo de mídia gerados pelo aplicativo da câmera OEM nativa que é armazenado no DCIM/Camera/ pasta no volume externo primário. O recurso não oferece suporte a mídia no armazenamento secundário. O conteúdo passado para dispositivos por e-mail ou cartões SD não é compatível.

Os aplicativos acessam os arquivos com base em vários caminhos de arquivo. O seguinte descreve os caminhos de arquivo em que a transcodificação é habilitada ou ignorada:

  • Transcodificação ativada:

    • Acesso ao aplicativo por meio de APIs do 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 dos 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:

    • 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 arquivo personalizados para transcodificação

Fabricantes de dispositivos pode opcionalmente adicionar filepaths para mídia transcodificação sob o DCIM/ diretório. Todos os caminhos fora da DCIM/ diretório são rejeitados. A adição desses caminhos de arquivo pode ser necessária para atender aos requisitos da operadora ou aos regulamentos locais.

Para adicionar um caminho de arquivo, use o caminho transcodificação sobreposição de recursos de tempo de execução (RRO) , 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-transcodificação de mídia

Figura 2. mídia transcodificação arquitetura.

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

  • MediaTranscodingManager sistema API: Interface que permite que o cliente para se comunicar com o serviço MediaTranscoding. O MediaProvider módulo usa esta API.
  • MediaTranscodingService: serviço nativo que gerencia conexões de clientes, horários transcodificação pedidos, e administra contabilidade para TranscodingSessions .
  • MediaTranscoder: biblioteca nativa que executa a transcodificação. Esta biblioteca é construído em cima do quadro NDK mídia para ser compatível com os módulos .

O recurso de transcodificação de mídia compatível registra as 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ão no módulo MediaProvider para permitir correções de bugs e atualizações oportunas.

Acesso ao arquivo

Transcodificação meios compatível é construído na parte superior do sistema de arquivos em Userspace (FUSÍVEL) sistema de ficheiros , que é usado para o armazenamento 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 aos arquivos com base na política para permitir, negar ou editar o acesso.

Quando um aplicativo tenta acessar um arquivo, o daemon FUSE intercepta o acesso de leitura do arquivo do aplicativo. Se o aplicativo for compatível com um formato mais recente (como HEVC), o arquivo original será retornado. Se o aplicativo 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

Os meios de comunicação compatíveis recurso transcodificação é desativado por padrão, o que significa que se o dispositivo suporta HEVC, Android não arquivos transcodificar a menos que especificado por um aplicativo em um arquivo de manifesto ou na lista vigor transcodificação .

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

  • Declare formatos não suportados no arquivo de manifesto. Para mais detalhes, consulte recursos de declarar por um recurso e Declare capacidades em código .
  • Adicionar aplicativos à lista de transcodificação força que está incluído no MediaProvider módulo. Isso permite a transcodificação para aplicativos que não atualizaram seu arquivo de manifesto. Depois que um aplicativo atualiza seu arquivo de manifesto com formatos não compatíveis, ele deve ser removido da lista de transcodificação forçada. Os fabricantes de dispositivos pode indicar as suas aplicações para ser adicionado ou removido da lista de transcodificação força pela apresentação de um adesivo ou por comunicar um erro . A equipe do Android revisa periodicamente a lista e pode remover aplicativos da lista.
  • Desabilite os formatos suportados com a estrutura de compatibilidade do aplicativo em tempo de execução (os usuários também podem desabilitar isso para cada aplicativo em Configurações).
  • Abra um arquivo com MediaStore enquanto especifica explicitamente formatos não suportados com o openTypedAssetFileDescriptor API.

Para transferências USB (dispositivo para PC), transcodificação está desativado por padrão, mas os usuários podem optar por ativar a transcodificação usando os vídeos converter para AVC alternância nas Preferências USB definição tela como mostrado na Figura 3.

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

Figura 3. Alterne para permitir mídia transcodificação na tela Preferências USB.

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

Para evitar que solicitações de transcodificação bloqueiem recursos do sistema por longos períodos, os aplicativos 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 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 a codificação HEVC habilitada por padrão no aplicativo de câmera nativo
  • (Dispositivos que suportam transcodificação HDR para SDR) O dispositivo suporta 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 de acesso de leitura/gravação de armazenamento devem ser otimizados. Quando codecs de mídia está configurado com prioridade igual a 1 , os codecs deve operar no maior rendimento possível. Recomendamos que o desempenho de transcodificação atinja um mínimo de 200 fps. Para testar o seu desempenho de hardware, execute o transcodificador referência media 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 habilitar ou desabilitar o recurso de transcodificação de mídia compatível globalmente. No Configurações> Sistema> Desenvolvedor> Mídia página de opções desenvolvedor transcodificação, defina a transcodificação Override defaults alternar para ligado e, em seguida, definir o Ativar transcodificação de alternância para ligado ou desligado. Se essa 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

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

Para fins de teste, você pode estender a limitação de duração de 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

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

Codificação HDR para SDR

Para apoiar HDR de codificação SDR, os fabricantes de dispositivos pode usar a amostra AOSP Codec filtro 2.0 de encaixe localizados em /platform/frameworks/av/media/codec2/hidl/plugin/ . Esta seção descreve como o plug-in de filtro funciona, como implementar o plug-in e como testá-lo.

Se um dispositivo não inclui um plug-in compatível com codificação HDR para SDR, um aplicativo que acessa um vídeo HDR obtém 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 plug-in de filtro Codec 2.0.

Fundo

Android fornece uma implementação camada de adaptação entre o Codec 2,0 interface e o android.hardware.media.c2 interface de HAL 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. MediaCodec reconhece esses componentes embrulhadas como decodificadores com funcionalidades de filtragem.

Visão geral

O FilterWrapper classe leva codecs de fornecedores e retornos codecs embrulhadas voltar para o media.c2 camada de adaptação. Os FilterWrapper cargas classe libc2filterplugin.so através do FilterWrapper::Plugin API e registros de filtros disponíveis a partir do plugin. Na criação, FilterWrapper instancia todos os filtros disponíveis. Somente os filtros que alteram o buffer são iniciados no início.

Arquitetura do plug-in de filtro

Figura 1. Filtro arquitetura plugin.

Filtrar interface do plug-in

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

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Retorna uma C2ComponentStore objeto que contém filtros. Isso é separado do que a implementação do Codec 2.0 do fornecedor expõe. Normalmente, esta loja contém apenas os filtros usados por te FilterWrapper classe.

  • bool describe(C2String name, Descriptor *desc)

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

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

    Retorna true se se altera componente de filtro do buffer. Por exemplo, o filtro de tom de mapeamento devolve true se a função de transferência alvo é SDR e a função de transferência de entrada é HDR (GAN ou PQ).

Detalhes do FilterWrapper

A seção descreve detalhes da FilterWrapper classe.

Criação

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 de entrada 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 filtro é roteada para o filtro correspondente e os parâmetros afetados dos filtros estão presentes nas consultas (em vez de ler do decodificador que possui parâmetros não afetados).

Consulta e configuração

Figura 2. Pesquisa 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 encapsulado inicia o decodificador e os buffers de passagem e envia comandos para o próprio decodificador.

Manipulação de buffer

Manipulação de buffer

Manuseamento Figura 3. Tampão.

Buffers enfileirados para o decodificador encapsulado vão para o decodificador subjacente. O componente envolvido agarra o tampão a partir do descodificador de saída através de um onWorkDone_nb() chamada de retorno, e, em seguida, enfileira-a para os filtros. O buffer de saída final do último filtro é relatado ao cliente.

Por esta manipulação de trabalho tampão, o componente deve configurar envolto C2PortBlockPoolsTuning ao último filtro para que os buffers de saída quadro da piscina bloco esperado.

Pare, reinicie e solte

Na parada, o componente encapsulado para o decodificador e todos os filtros ativados que foram iniciados. Na reinicialização e liberação, todos os componentes são reinicializados ou liberados, independentemente de estarem habilitados ou não.

Implemente o plug-in de filtro de amostra

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

  1. Implementar o FilterPlugin interface em uma biblioteca e soltá-lo em /vendor/lib[64]/libc2filterplugin.so.
  2. Adicionar permissões adicionais para mediacodec.te se necessário.
  3. Atualizar a camada de adaptação para Android 12 e reconstruir o media.c2 serviço.

Teste o plug-in

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

  1. Reconstrua 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 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