Transcodage de contenus multimédias dans un format compatible

Le transcodage multimédia compatible, introduit dans Android 12, est une fonctionnalité qui permet aux appareils d'utiliser des formats multimédias plus modernes et plus efficaces en termes de stockage pour la capture vidéo, tels que HEVC, tout en maintenant la compatibilité avec les applications. Grâce à cette fonctionnalité, les fabricants d'appareils peuvent utiliser HEVC au lieu d'AVC par défaut pour améliorer la qualité vidéo tout en réduisant les besoins en stockage et en bande passante. Pour les appareils sur lesquels le transcodage multimédia compatible est activé, Android peut convertir automatiquement les vidéos (d'une durée maximale d'une minute) enregistrées dans des formats tels que HEVC ou HDR lorsque les vidéos sont ouvertes par une application qui ne prend pas en charge le format. Cela permet aux applications de fonctionner même lorsque les vidéos sont enregistrées dans des formats plus récents sur l'appareil.

La fonctionnalité de transcodage de contenus multimédias dans un format compatible est désactivée par défaut. Pour demander le transcodage de contenus multimédias, les applications doivent déclarer leurs fonctionnalités multimédias. Pour en savoir plus sur la déclaration des fonctionnalités multimédias, consultez Transcodage multimédia compatible sur le site pour les développeurs Android.

Fonctionnement

La fonctionnalité de transcodage de contenus multimédias compatibles se compose de deux parties principales :

  • Services de transcodage dans le framework multimédia : ces services convertissent les fichiers d'un format à un autre à l'aide de matériel pour des conversions de haute qualité et à faible latence. Cela inclut l'API de transcodage, le service de transcodage, un plug-in OEM pour les filtres personnalisés et le matériel. Pour en savoir plus, consultez la présentation de l'architecture.
  • Fonctionnalité de transcodage multimédia compatible dans les fournisseurs de contenu multimédia : ce composant des fournisseurs de contenu multimédia intercepte les applications qui accèdent aux fichiers multimédias et fournit le fichier d'origine ou un fichier transcodé en fonction des fonctionnalités déclarées de l'application. Si une application est compatible avec le format du fichier multimédia, aucune gestion spéciale n'est requise. Si une application ne prend pas en charge le format, le framework convertit le fichier dans un format plus ancien, tel que AVC, lorsque l'application accède au fichier.

La figure 1 présente une vue d'ensemble du processus de transcodage des contenus multimédias.

Processus de transcodage de contenus multimédias dans un format compatible

Figure 1 : Présentation du transcodage de contenus multimédias dans un format compatible.

Formats compatibles

La fonctionnalité de transcodage multimédia compatible prend en charge les conversions de format suivantes :

  • HEVC (8 bits) vers AVC : les conversions de codec sont effectuées en connectant un décodeur mediacodec et un encodeur mediacode.
  • HDR10+ (10 bits) vers AVC (SDR) : les conversions HDR vers SDR sont effectuées à l'aide d'instances mediacodec et d'un hook de plug-in fournisseur dans les instances de décodeur. Pour en savoir plus, consultez Encodage HDR vers SDR.

Sources de contenu compatibles

La fonctionnalité de transcodage de contenu multimédia compatible prend en charge les contenus multimédias générés sur l'appareil par l'application Appareil photo OEM native et stockés dans le dossier DCIM/Camera/ du volume externe principal. Cette fonctionnalité n'est pas compatible avec les contenus multimédias sur le stockage secondaire. Le contenu transféré sur des appareils par e-mail ou sur des cartes SD n'est pas compatible.

Les applications accèdent aux fichiers en fonction de différents chemins d'accès. Vous trouverez ci-dessous les chemins d'accès aux fichiers où le transcodage est activé ou ignoré :

  • Transcodage activé :

    • Accès aux applications via les API MediaStore
    • Accès aux applications via des API de chemin d'accès direct aux fichiers, y compris le code Java et natif
    • Accès aux applications via le framework d'accès au stockage (SAF)
    • Accès aux applications via les intents de la feuille de partage de l'OS. (URI MediaStore uniquement)
    • Transfert de fichiers MTP/PTP du téléphone vers un PC
  • Transcodage ignoré :

    • Transférer des fichiers depuis un appareil en éjectant la carte SD
    • Transférer des fichiers d'un appareil à un autre à l'aide d'options telles que le partage à proximité ou le transfert Bluetooth.

Ajouter des chemins d'accès personnalisés pour le transcodage

Les fabricants d'appareils peuvent éventuellement ajouter des chemins d'accès aux fichiers pour le transcodage multimédia dans le répertoire DCIM/. Tous les chemins en dehors du répertoire DCIM/ sont refusés. L'ajout de tels chemins d'accès aux fichiers peut être nécessaire pour répondre aux exigences des opérateurs ou aux réglementations locales.

Pour ajouter un chemin d'accès au fichier, utilisez le chemin de transcodage, config_supported_transcoding_relative_paths. Voici un exemple d'ajout d'un chemin d'accès :

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

Pour vérifier les chemins d'accès aux fichiers configurés, utilisez la commande suivante :

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

Présentation de l'architecture

Cette section décrit l'architecture de la fonctionnalité de transcodage multimédia.

media-transcoding-architecture

Figure 2. Architecture de transcodage des contenus multimédias.

L'architecture de transcodage multimédia se compose des composants suivants :

  • API système MediaTranscodingManager : interface qui permet au client de communiquer avec le service MediaTranscoding. Le module MediaProvider utilise cette API.
  • MediaTranscodingService : service natif qui gère les connexions client, planifie les demandes de transcodage et gère la comptabilité pour TranscodingSessions.
  • MediaTranscoder : bibliothèque native qui effectue le transcodage. Cette bibliothèque est basée sur le framework multimédia NDK pour être compatible avec les modules.

La fonctionnalité de transcodage de contenus multimédias dans un format compatible enregistre les métriques de transcodage dans le service et dans le transcodeur multimédia. Le code côté client et côté service se trouve dans le module MediaProvider pour permettre des corrections de bugs et des mises à jour rapides.

Accès aux fichiers

Le transcodage de contenu multimédia compatible repose sur le système de fichiers FUSE (Filesystem in Userspace), qui est utilisé pour le stockage cloisonné. FUSE permet au module MediaProvider d'examiner les opérations sur les fichiers dans l'espace utilisateur et de contrôler l'accès aux fichiers en fonction de la règle (autoriser, refuser ou masquer l'accès).

Lorsqu'une application tente d'accéder à un fichier, le démon FUSE intercepte l'accès en lecture au fichier depuis l'application. Si l'application est compatible avec un format plus récent (tel que HEVC), le fichier d'origine est renvoyé. Si l'application ne prend pas en charge le format, le fichier est transcodé dans un format plus ancien (tel que AVC) ou est renvoyé à partir du cache si une version transcodée est disponible.

Demander des fichiers transcodés

La fonctionnalité de transcodage de contenus multimédias dans un format compatible est désactivée par défaut. Les applications peuvent demander des éléments transcodés à l'aide des options suivantes :

Pour les transferts USB (de l'appareil vers le PC), le transcodage est désactivé par défaut, mais les utilisateurs peuvent choisir de l'activer à l'aide du bouton bascule Convertir les vidéos au format AVC sur l'écran des paramètres Préférences USB, comme illustré à la figure 3.

Activer/Désactiver le transcodage des contenus multimédias

Figure 3. Activez le transcodage multimédia sur l'écran des préférences USB.

Restrictions concernant les demandes de fichiers transcodés

Pour éviter que les requêtes de transcodage ne bloquent les ressources système pendant de longues périodes, les applications qui demandent des sessions de transcodage sont limitées à :

  • 10 sessions consécutives
  • une durée totale de trois minutes ;

Si une application dépasse toutes ces restrictions, le framework renvoie le descripteur de fichier d'origine.

Configuration d'appareil requise

Pour être compatible avec la fonctionnalité de transcodage de contenu multimédia, les appareils doivent répondre aux exigences suivantes :

  • L'encodage HEVC est activé par défaut sur l'application Appareil photo native de l'appareil.
  • (Appareils compatibles avec le transcodage HDR vers SDR) L'appareil est compatible avec la capture vidéo HDR

Pour garantir les performances de l'appareil pour le transcodage multimédia, les performances d'accès en lecture/écriture au matériel vidéo et au stockage doivent être optimisées. Lorsque les codecs multimédias sont configurés avec une priorité égale à 1, ils doivent fonctionner au débit le plus élevé possible. Nous vous recommandons d'obtenir des performances de transcodage d'au moins 200 FPS. Pour tester les performances de votre matériel, exécutez le benchmark du transcodeur multimédia sur frameworks/av/media/libmediatranscoding/transcoder/benchmark.

Validation

Pour valider la fonctionnalité de transcodage de contenu multimédia compatible, exécutez les tests CTS suivants :

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

Activer le transcodage multimédia de manière globale

Pour tester le framework de transcodage de contenus multimédias ou le comportement de l'application avec le transcodage, vous pouvez activer ou désactiver la fonctionnalité de transcodage de contenus multimédias compatibles à l'échelle mondiale. Sur la page des options pour les développeurs Paramètres > Système > Développeur > Transcodage multimédia, définissez le bouton à bascule Remplacer les paramètres de transcodage par défaut sur Activé, puis définissez le bouton à bascule Activer le transcodage sur Activé ou Désactivé. Si ce paramètre est activé, le transcodage multimédia peut se produire en arrière-plan pour les applications autres que celle que vous développez.

Vérifier l'état du transcodage

Lors des tests, vous pouvez utiliser la commande shell ADB suivante pour vérifier l'état du transcodage, y compris les sessions de transcodage actuelles et passées :

adb shell dumpsys media.transcoding

Augmenter la limite de durée des vidéos

Pour les tests, vous pouvez étendre la limite de durée d'une minute pour le transcodage à l'aide de la commande suivante. Un redémarrage peut être nécessaire après l'exécution de cette commande.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Source et références AOSP

Vous trouverez ci-dessous le code source AOSP lié au transcodage de contenus multimédias compatibles.

Encodage HDR vers SDR

Pour prendre en charge l'encodage HDR vers SDR, les fabricants d'appareils peuvent utiliser l'exemple de plug-in de filtre Codec 2.0 AOSP situé dans /platform/frameworks/av/media/codec2/hidl/plugin/. Cette section décrit le fonctionnement du plug-in de filtre, comment l'implémenter et comment le tester.

Si un appareil n'inclut pas de plug-in compatible avec l'encodage HDR vers SDR, une application accédant à une vidéo HDR obtient le descripteur de fichier d'origine, quelles que soient les capacités multimédias de l'application déclarées dans le fichier manifeste.

Fonctionnement

Cette section décrit le comportement général du plug-in de filtre Codec 2.0.

Arrière-plan

Android fournit une implémentation de couche d'adaptation entre l'interface Codec 2.0 et l'interface HAL android.hardware.media.c2 à android::hardware::media::c2. Pour les plug-ins de filtre, AOSP inclut un mécanisme d'encapsulation qui encapsule les décodeurs avec les plug-ins de filtre. MediaCodec reconnaît ces composants encapsulés comme des décodeurs avec des fonctionnalités de filtrage.

Présentation

La classe FilterWrapper prend les codecs du fournisseur et renvoie les codecs encapsulés à la couche d'adaptation media.c2. La classe FilterWrapper charge libc2filterplugin.so via l'API FilterWrapper::Plugin et enregistre les filtres disponibles à partir du plug-in. Lors de la création, FilterWrapper instancie tous les filtres disponibles. Seuls les filtres qui modifient le tampon sont démarrés au début.

Architecture des plug-ins de filtre

Figure 4. Architecture des plug-ins de filtre.

Interface du plug-in de filtre

L'interface FilterPlugin.h définit les API suivantes pour exposer les filtres :

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Renvoie un objet C2ComponentStore contenant des filtres. Cela est distinct de ce que l'implémentation Codec 2.0 du fournisseur expose. En règle générale, ce magasin ne contient que les filtres utilisés par la classe FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

    Décrit les filtres en plus de ceux disponibles sur C2ComponentStore. Les descriptions suivantes sont définies :

    • controlParam : paramètres qui contrôlent le comportement des filtres. Par exemple, pour le mappeur de tonalités HDR vers SDR, le paramètre de contrôle est la fonction de transfert cible.
    • affectedParams : paramètres concernés par les opérations de filtrage. Par exemple, pour le tone mapper HDR vers SDR, les paramètres concernés sont les aspects de couleur.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Renvoie true si le composant de filtre modifie le tampon. Par exemple, le filtre de mappage de tonalités renvoie true si la fonction de transfert cible est SDR et que la fonction de transfert d'entrée est HDR (HLG ou PQ).

Détails de FilterWrapper

Cette section décrit les détails de la classe FilterWrapper.

Création

Le composant encapsulé instancie le décodeur sous-jacent et tous les filtres définis lors de la création.

Requête et configuration

Le composant encapsulé sépare les paramètres entrants des requêtes ou des demandes de configuration en fonction de la description du filtre. Par exemple, la configuration du paramètre de commande de filtrage est routée vers le filtre correspondant, et les paramètres affectés des filtres sont présents dans les requêtes (au lieu d'être lus à partir du décodeur dont les paramètres ne sont pas affectés).

Requête et configuration

Figure 5. Requête et configuration.

Démarrer

Au démarrage, le composant encapsulé lance le décodeur et tous les filtres qui modifient les tampons. Si aucun filtre n'est activé, le composant encapsulé démarre le décodeur et les tampons de transfert, et envoie des commandes au décodeur lui-même.

Gestion des tampons

Gestion des tampons

Figure 6. Gestion des tampons.

Les tampons mis en file d'attente pour le décodeur encapsulé sont envoyés au décodeur sous-jacent. Le composant encapsulé récupère le tampon de sortie du décodeur via un rappel onWorkDone_nb(), puis le met en file d'attente pour les filtres. Le tampon de sortie final du dernier filtre est signalé au client.

Pour que cette gestion des tampons fonctionne, le composant encapsulé doit configurer C2PortBlockPoolsTuning sur le dernier filtre afin que les tampons de sortie du framework proviennent du pool de blocs attendu.

Arrêter, réinitialiser et libérer

À l'arrêt, le composant encapsulé arrête le décodeur et tous les filtres activés qui ont été démarrés. Lors de la réinitialisation et de la libération, tous les composants sont réinitialisés ou libérés, qu'ils soient activés ou non.

Implémenter l'exemple de plug-in de filtre

Pour activer le plug-in, procédez comme suit :

  1. Implémentez l'interface FilterPlugin dans une bibliothèque et déposez-la à l'adresse /vendor/lib[64]/libc2filterplugin.so..
  2. Ajoutez des autorisations supplémentaires à mediacodec.te si nécessaire.
  3. Mettez à jour la couche d'adaptation vers Android 12 et recompilez le service media.c2.

Tester le plug-in

Pour tester l'exemple de plug-in, procédez comme suit :

  1. Recompilez et flashez l'appareil.
  2. Créez l'exemple de plug-in à l'aide de la commande suivante :

    m sample-codec2-filter-plugin
    
  3. Remontez l'appareil et renommez le plug-in du fournisseur pour qu'il soit reconnu par le service 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