Transcodifica di contenuti multimediali compatibili

La transcodifica di contenuti multimediali compatibile, introdotta in Android 12, è una funzionalità che consente ai dispositivi di usare formati multimediali più moderni ed efficienti per lo spazio di archiviazione per l'acquisizione video, ad esempio HEVC, pur mantenendo la compatibilità con le app. Con questa funzionalità, i produttori di dispositivi possono utilizzare per impostazione predefinita l'HEVC anziché l'AVC per migliorare la qualità video, riducendo al contempo i requisiti di archiviazione e larghezza di banda. Per i dispositivi in cui è abilitata la transcodifica di contenuti multimediali compatibili, Android può convertire automaticamente i video (della durata massima di un minuto) registrati in formati come HEVC o HDR quando i video vengono aperti da un'app che non supporta il formato. Ciò consente alle app di funzionare anche quando i video vengono acquisiti in formati più recenti sul dispositivo.

La funzione di transcodifica di contenuti multimediali compatibile è disattivata per impostazione predefinita. Per richiedere la transcodifica di contenuti multimediali, le app devono dichiararne le funzionalità multimediali. Per ulteriori informazioni sulla dichiarazione delle funzionalità multimediali, consulta la pagina Transcodifica multimediale compatibile sul sito Android for Developers.

Come funziona

La funzione di transcodifica di contenuti multimediali compatibile è costituita da due parti principali:

  • Servizi di transcodifica nel framework multimediale: questi servizi convertono i file da un formato a un altro utilizzando hardware per conversioni a bassa latenza e alta qualità. Sono inclusi l'API di transcodifica, il servizio di transcodifica, un plug-in OEM per filtri personalizzati e hardware. Per ulteriori dettagli, consulta Panoramica dell'architettura.
  • Funzionalità di transcodifica di contenuti multimediali compatibile nei fornitori di contenuti multimediali: questo componente presente nei fornitori di contenuti multimediali intercetta le app che accedono ai file multimediali e pubblica il file originale o un file transcodificato in base alle funzionalità dichiarate dell'app. Se un'app supporta il formato dei file multimediali, non è richiesta una gestione speciale. Se un'app non supporta il formato, il framework converte il file in un formato precedente, come AVC, quando l'app accede al file.

La Figura 1 mostra una panoramica del processo di transcodifica multimediale.

Processo di transcodifica multimediale compatibile

Figura 1. Panoramica della transcodifica di contenuti multimediali compatibili.

Formati supportati:

La funzione di transcodifica multimediale compatibile supporta le seguenti conversioni di formato:

  • Da HEVC (8 bit) ad AVC:le conversioni codec vengono eseguite mediante il collegamento di un decodificatore mediacodec e un codificatore di mediacodec.
  • Da HDR10+ (10 bit) ad AVC (SDR): le conversioni da HDR a SDR vengono eseguite utilizzando le istanze Mediacodec e un hook del plug-in del fornitore nelle istanze del decoder. Per ulteriori informazioni, consulta la sezione Codifica da HDR a SDR.

Fonti di contenuto supportate

La funzionalità di transcodifica di contenuti multimediali compatibile supporta i contenuti multimediali on-device generati dall'app nativa della fotocamera OEM e archiviati nella cartella DCIM/Camera/ nel volume esterno principale. La funzionalità non supporta i contenuti multimediali sullo spazio di archiviazione secondario. I contenuti trasmessi ai dispositivi tramite email o schede SD non sono supportati.

Le app accedono ai file in base a vari percorsi dei file. Di seguito sono descritti i percorsi file in cui la transcodifica è abilitata o bypassata:

  • Transcodifica attivata:

    • Accesso alle app tramite le API MediaStore
    • Accesso alle app tramite API di percorso file diretto, tra cui Java e codice nativo
    • Accesso alle app tramite il framework Storage Access Framework (SAF)
    • Accesso alle app tramite gli intent dei fogli di condivisione del sistema operativo. (Solo URI MediaStore)
    • Trasferimento di file MTP/PTP dal telefono al PC
  • Transcodifica bypass:

    • Trasferimento di file da un dispositivo mediante espulsione della scheda SD
    • Trasferimento di file da un dispositivo a un altro tramite opzioni come Condivisione nelle vicinanze o trasferimento Bluetooth.

Aggiungi percorsi di file personalizzati per la transcodifica

I produttori di dispositivi possono aggiungere facoltativamente percorsi file per la transcodifica multimediale nella directory DCIM/. Tutti i percorsi esterni alla directory DCIM/ vengono rifiutati. Potrebbe essere necessario aggiungere questi percorsi file per soddisfare i requisiti degli operatori o le normative locali.

Per aggiungere un percorso file, utilizza il percorso di transcodifica overlay delle risorse di runtime (RRO), config_supported_transcoding_relative_paths. Di seguito è riportato un esempio di come aggiungere un percorso file:

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

Per verificare i percorsi file configurati, utilizza:

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

Panoramica dell'architettura

Questa sezione descrive l'architettura della funzionalità di transcodifica multimediale.

architettura-transcodifica-contenuti

Figura 2. Architettura di transcodifica dei contenuti multimediali.

L'architettura di transcodifica dei contenuti multimediali è costituita dai seguenti componenti:

  • API di sistema MediaTranscodingManager: interfaccia che consente al client di comunicare con il servizio MediaTranscoding. Il modulo MediaProvider utilizza questa API.
  • MediaTranscodingService: servizio nativo che gestisce le connessioni client, pianifica le richieste di transcodifica e gestisce la contabilità per TranscodingSessions.
  • MediaTranscoder: libreria nativa che esegue la transcodifica. Questa libreria è basata sul framework multimediale NDK per essere compatibile con i moduli.

La funzione di transcodifica di contenuti multimediali compatibile registra le metriche di transcodifica sia nel servizio che nello strumento di transcodifica di contenuti multimediali. Il codice lato client e lato servizio si trova nel modulo MediaProvider per consentire correzioni di bug e aggiornamenti tempestivi.

Accesso ai file

La transcodifica dei contenuti multimediali compatibili si basa sul file system FUSE (Filesystem in Userspace), che viene utilizzato per l'archiviazione con ambito. FUSE consente al modulo MediaProvider di esaminare le operazioni sui file nello spazio utente e di limitare l'accesso ai file in base al criterio per consentire, negare o oscurare l'accesso.

Quando un'app tenta di accedere a un file, il daemon FUSE intercetta l'accesso in lettura del file dall'app. Se l'app supporta un formato più recente (ad esempio HEVC), viene restituito il file originale. Se l'app non supporta il formato, il file viene transcodificato in un formato precedente (ad esempio AVC) o viene restituito dalla cache se è disponibile una versione transcodificata.

Richiedere file transcodificati

La funzionalità di transcodifica di contenuti multimediali compatibile è disattivata per impostazione predefinita. Ciò significa che se il dispositivo supporta HEVC, Android non transcodifica i file a meno che non sia specificato da un'app in un file manifest o nell'elenco di transcodifica forzato.

Le app possono richiedere asset transcodificati utilizzando le seguenti opzioni:

  • Dichiara i formati non supportati nel file manifest. Per maggiori dettagli, consulta Dichiarare le funzionalità in una risorsa e Dichiarare le funzionalità nel codice.
  • Aggiungi app all'elenco di transcodifica forza incluso nel modulo MediaProvider. Questa opzione consente la transcodifica per le app che non hanno aggiornato il file manifest. Dopo che un'app aggiorna il proprio file manifest con formati non supportati, devi rimuovere l'app dall'elenco di transcodifiche forzate. I produttori di dispositivi possono richiedere l'aggiunta o la rimozione delle loro app dall'elenco della transcodifica forzata inviando una patch o segnalando un bug. Il team Android riesamina periodicamente l'elenco e potrebbe rimuovere app dall'elenco.
  • Disattiva i formati supportati con il framework di compatibilità delle app in fase di runtime (gli utenti possono anche disabilitare questa funzionalità per ogni app nelle Impostazioni).
  • Apri un file con MediaStore specificando esplicitamente i formati non supportati con l'API openTypedAssetFileDescriptor.

Per i trasferimenti da USB (da dispositivo a PC), la transcodifica è disattivata per impostazione predefinita, ma gli utenti possono scegliere di attivarla utilizzando l'opzione Converti video in AVC nella schermata di impostazione Preferenze USB, come mostrato nella Figura 3.

Attiva l&#39;opzione per abilitare la transcodifica multimediale

Figura 3. Attiva l'opzione per abilitare la transcodifica di contenuti multimediali nella schermata Preferenze USB.

Limitazioni relative alla richiesta di file transcodificati

Per evitare che le richieste di transcodifica blocchino le risorse di sistema per periodi prolungati, le app che richiedono sessioni di transcodifica possono:

  • 10 sessioni consecutive
  • per un tempo di esecuzione totale di tre minuti

Se un'app supera tutte queste restrizioni, il framework restituisce il descrittore del file originale.

Requisiti del dispositivo

Per supportare la funzionalità di transcodifica di contenuti multimediali compatibile, i dispositivi devono soddisfare i seguenti requisiti:

  • Sul dispositivo la codifica HEVC è attivata per impostazione predefinita nell'app nativa della fotocamera
  • (Dispositivi che supportano la transcodifica HDR a SDR) Il dispositivo supporta l'acquisizione video HDR

Per garantire le prestazioni del dispositivo per la transcodifica multimediale, è necessario ottimizzare le prestazioni dell'hardware video e dell'accesso in lettura/scrittura allo spazio di archiviazione. Se i codec multimediali sono configurati con una priorità uguale a 1, i codec devono funzionare alla massima velocità effettiva possibile. Consigliamo di fare in modo che le prestazioni di transcodifica raggiungano un minimo di 200 f/s. Per testare le prestazioni dell'hardware, esegui il benchmark del transcodificatore multimediale all'indirizzo frameworks/av/media/libmediatranscoding/transcoder/benchmark.

Convalida

Per convalidare la funzionalità di transcodifica dei contenuti multimediali compatibile, esegui i seguenti test CTS:

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

Attiva la transcodifica multimediale a livello globale

Per testare il framework di transcodifica multimediale o il comportamento dell'app con la transcodifica, puoi attivare o disattivare la funzionalità di transcodifica multimediale compatibile a livello globale. Nella pagina delle opzioni sviluppatore Impostazioni > Sviluppatore > Transcodifica multimediale, imposta l'opzione Sostituisci i valori predefiniti di transcodifica su On, quindi imposta l'opzione Attiva transcodifica su On o Off. Se questa impostazione è attiva, la transcodifica multimediale potrebbe avvenire in background per app diverse da quella in fase di sviluppo.

Controllare lo stato della transcodifica

Durante il test, puoi utilizzare il seguente comando della shell ADB per controllare lo stato della transcodifica, incluse le sessioni di transcodifica correnti e passate:

adb shell dumpsys media.transcoding

Estensione dei limiti di durata dei video

A scopo di test, puoi estendere il limite di durata del video di un minuto per la transcodifica utilizzando il seguente comando. Dopo l'esecuzione di questo comando potrebbe essere necessario il riavvio.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Origine e riferimenti AOSP

Di seguito sono riportati il codice sorgente AOSP relativo alla transcodifica multimediale compatibile.

Codifica da HDR a SDR

Per supportare la codifica da HDR a SDR, i produttori di dispositivi possono utilizzare il plug-in per filtri AOSP di esempio Codec 2.0 disponibile in /platform/frameworks/av/media/codec2/hidl/plugin/. Questa sezione descrive come funziona il plug-in del filtro, come implementare il plug-in e come testare il plug-in.

Se un dispositivo non include un plug-in che supporta la codifica da HDR a SDR, un'app che accede a un video HDR riceve il descrittore del file originale, indipendentemente dalle funzionalità multimediali dell'app dichiarate nel file manifest.

Come funziona

In questa sezione viene descritto il comportamento generale del plug-in di filtro Codec 2.0.

Premessa

Android fornisce un'implementazione del livello di adattamento tra l'interfaccia Codec 2.0 e l'interfaccia dell'HAL android.hardware.media.c2 su android::hardware::media::c2. Per i plug-in per i filtri, AOSP include un meccanismo di wrapper che aggrega i decoder con i plug-in di filtro. MediaCodec riconosce questi componenti con wrapping come decoder con funzionalità di filtro.

Panoramica

La classe FilterWrapper recupera i codec del fornitore e restituisce i codec con wrapping al livello di adattamento media.c2. La classe FilterWrapper carica libc2filterplugin.so tramite l'API FilterWrapper::Plugin e registra i filtri disponibili dal plug-in. Al momento della creazione, FilterWrapper verifica tutti i filtri disponibili. All'inizio vengono avviati solo i filtri che alterano il buffer.

Filtra architettura dei plug-in

Figura 1. Filtra l'architettura dei plug-in.

Filtra interfaccia plug-in

L'interfaccia FilterPlugin.h definisce le seguenti API per esporre i filtri:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Restituisce un oggetto C2ComponentStore che contiene filtri. Si tratta di un aspetto separato da ciò che è esposto nell'implementazione Codec 2.0 del fornitore. In genere, questo negozio contiene solo i filtri utilizzati dalla classe FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

    Descrive i filtri oltre a quanto disponibile in C2ComponentStore. Sono definite le seguenti descrizioni:

    • controlParam: parametri che controllano il comportamento dei filtri. Ad esempio, per la mappatura dei toni da HDR a SDR, il parametro di controllo è la funzione di trasferimento del target.
    • affectedParams: parametri interessati dalle operazioni di filtro. Ad esempio, per la mappatura dei toni da HDR a SDR, i parametri interessati sono gli aspetti cromatici.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Restituisce true se il componente del filtro modifica il buffer. Ad esempio, il filtro di mappatura dei toni restituisce true se la funzione di trasferimento target è SDR e la funzione di trasferimento dell'input è HDR (HLG o PQ).

Dettagli FiltraWrapper

La sezione descrive i dettagli del corso FilterWrapper.

creazione

Il componente aggregato crea un'istanza del decoder sottostante e di tutti i filtri definiti al momento della creazione.

Query e configurazione

Il componente aggregato separa i parametri in entrata dalle query o dalle richieste di configurazione in base alla descrizione del filtro. Ad esempio, la configurazione del parametro di controllo filtro viene instradata al filtro corrispondente e i parametri interessati dai filtri sono presenti nelle query (anziché leggere dal decoder che ha parametri non interessati).

Query e configurazione

Figura 2. Query e configurazione.

Inizio

All'inizio, il componente sottoposto a wrapping avvia il decoder e tutti i filtri che modificano i buffer. Se non è abilitato alcun filtro, il componente aggregato avvia il decoder e i buffer passthrough e invia i comandi al decoder stesso.

Gestione del buffer

Gestione del buffer

Figura 3. Gestione del buffer.

I buffer in coda al decoder con wrapping vanno al decoder sottostante. Il componente aggregato recupera il buffer di output dal decoder attraverso un callback onWorkDone_nb() e quindi lo accoda ai filtri. Il buffer di output finale dell'ultimo filtro viene segnalato al client.

Affinché questa gestione del buffer funzioni, il componente aggregato deve configurare C2PortBlockPoolsTuning nell'ultimo filtro in modo che l'output del framework esegua il buffer dal pool di blocchi previsto.

Interrompi, reimposta e rilascia

All'arresto, il componente aggregato arresta il decoder e tutti i filtri abilitati che sono stati avviati. Al momento del ripristino e del rilascio, tutti i componenti vengono reimpostati o rilasciati, indipendentemente dal fatto che siano abilitati o meno.

Implementa il plug-in del filtro di esempio

Per attivare il plug-in, procedi nel seguente modo:

  1. Implementa l'interfaccia FilterPlugin in una libreria e rilasciala in /vendor/lib[64]/libc2filterplugin.so.
  2. Se necessario, aggiungi altre autorizzazioni a mediacodec.te.
  3. Aggiorna il livello di adattamento ad Android 12 e ricrea il servizio media.c2.

Testa il plug-in

Per testare il plug-in di esempio, procedi nel seguente modo:

  1. Ricrea ed esegui il flashing del dispositivo.
  2. Crea il plug-in di esempio utilizzando il seguente comando:

    m sample-codec2-filter-plugin
    
  3. Rimonta il dispositivo e rinomina il plug-in del fornitore in modo che sia riconosciuto dal servizio 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