Transcodifica di contenuti multimediali compatibili

La transcodifica di contenuti multimediali compatibili, introdotta in Android 12, è una funzionalità che consente ai dispositivi di utilizzare formati multimediali più moderni ed efficienti in termini di spazio di archiviazione per l'acquisizione video, come HEVC, mantenendo la compatibilità con le app. Con questa funzionalità, i produttori di dispositivi possono utilizzare HEVC anziché AVC per impostazione predefinita per migliorare la qualità video e ridurre al contempo i requisiti di archiviazione e larghezza di banda. Per i dispositivi su cui è attivata la transcodifica multimediale compatibile, Android può convertire automaticamente i video (fino a un minuto di durata) registrati in formati come HEVC o HDR quando vengono aperti da un'app che non supporta il formato. In questo modo, le app possono 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 il transcoding dei contenuti multimediali, le app devono dichiarare le proprie funzionalità multimediali. Per ulteriori informazioni sulla dichiarazione delle funzionalità multimediali, consulta Transcodifica di contenuti multimediali compatibili sul sito Android for Developers.

Come funziona

La funzionalità di transcodifica in contenuti multimediali compatibili è composta da due parti principali:

  • Servizi di transcodifica nel framework multimediale: questi servizi convertono i file da un formato a un altro utilizzando l'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 maggiori dettagli, vedi 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 del file multimediale, non è necessaria alcuna gestione speciale. Se un'app non supporta il formato, il framework lo converte in un formato precedente, ad esempio 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 funzionalità di transcodifica in contenuti multimediali compatibili supporta le seguenti conversioni di formato:

  • HEVC (8 bit) ad AVC: le conversioni di codec vengono eseguite collegando un decodificatore mediacodec e un codificatore mediacode.
  • 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 dei contenuti multimediali compatibili supporta i contenuti multimediali sul dispositivo generati dall'app nativa della fotocamera OEM memorizzati 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 file. Di seguito sono descritti i percorsi file in cui la transcodifica è attivata o ignorata:

  • Transcodifica attivata:

    • Accesso alle app tramite le API MediaStore
    • Accesso alle app tramite API di percorso file diretti, inclusi 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 ignorata:

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

Aggiungere percorsi file personalizzati per la transcodifica

I produttori di dispositivi possono facoltativamente aggiungere percorsi file per la transcodifica dei contenuti multimediali 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.

media-transcoding-architecture

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 dei 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 funzionalità di transcodifica in contenuti multimediali compatibili registra le metriche di transcodifica sia nel servizio sia nel transcoder multimediale. 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 controllare l'accesso ai file in base alle norme 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 dei contenuti multimediali compatibili è disattivata per impostazione predefinita, il che significa che se il dispositivo supporta HEVC, Android non esegue la transcodifica dei file, a meno che non sia specificato da un'app in un file manifest o nell'elenco di transcodifica forzata.

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 le app all'elenco di transcodifica forzata incluso nel modulo MediaProvider. Questa opzione consente la transcodifica per le app che non hanno aggiornato il file manifest. Dopo che il file manifest di un'app viene aggiornato con formati non supportati, l'app deve essere rimossa dall'elenco di transcodifiche forzate. I produttori di dispositivi possono indicare le proprie app da aggiungere o rimuovere dall'elenco di transcodifica forzata inviando una patch o segnalando un bug. Il team di Android esamina periodicamente l'elenco e potrebbe rimuoverne alcune app.
  • Disattivare i formati supportati con il framework di compatibilità delle app in fase di esecuzione (gli utenti possono disattivare questa opzione anche per ogni app nelle Impostazioni).
  • Aprire un file con MediaStore specificando esplicitamente i formati non supportati con l'API openTypedAssetFileDescriptor.

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

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

Figura 3. Attiva/disattiva l'opzione per attivare la transcodifica dei 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 sono limitate a:

  • 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:

  • La codifica HEVC è abilitata per impostazione predefinita nell'app della fotocamera nativa
  • (Dispositivi che supportano la transcodifica da HDR a SDR) Il dispositivo supporta la registrazione di video HDR

Per garantire le prestazioni del dispositivo per la transcodifica dei contenuti multimediali, è necessario ottimizzare le prestazioni di accesso in lettura/scrittura dell'hardware video e dello spazio di archiviazione. Quando i codec multimediali sono configurati con priorità pari a 1, devono operare con il throughput possibile più elevato. Consigliamo di ottenere un rendimento della transcodifica di almeno 200 fps. 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 dei contenuti multimediali o il comportamento dell'app con la transcodifica, puoi attivare o disattivare la funzionalità di transcodifica dei contenuti multimediali compatibili a livello globale. Nella pagina delle opzioni sviluppatore Impostazioni > Sistema > Sviluppatore > Transcodifica multimediale, imposta l'opzione Sostituisci i valori predefiniti della transcodifica su On e poi imposta l'opzione Attiva la transcodifica su On o Off. Se questa impostazione è attiva, la transcodifica multimediale potrebbe avvenire in background per app diverse da quella che stai sviluppando.

Controllare lo stato della transcodifica

Durante il test, puoi utilizzare il seguente comando ADB shell 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

Per scopi di test, puoi estendere la limitazione della durata di un minuto per la transcodificazione utilizzando il seguente comando. Dopo aver eseguito questo comando potrebbe essere necessario riavviare il dispositivo.

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 HDR in SDR, i produttori di dispositivi possono utilizzare il plug-in di filtro Codec 2.0 di esempio AOSP, che si trova in /platform/frameworks/av/media/codec2/hidl/plugin/. Questa sezione descrive il funzionamento del plug-in di filtro, come implementarlo e come testarlo.

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

Questa sezione descrive il comportamento generale del plug-in del filtro Codec 2.0.

Background

Android fornisce un'implementazione del livello di adattamento tra l'interfaccia Codec 2.0 e l'interfaccia HAL android.hardware.media.c2 in android::hardware::media::c2. Per i plug-in di filtro, AOSP include un meccanismo di wrapping che racchiude i decodificatori insieme ai plug-in di filtro. MediaCodec riconosce questi componenti con wrapping come decodificatori 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 inizializza tutti i filtri disponibili. All'inizio vengono avviati solo i filtri che alterano il buffer.

Architettura del plug-in di filtro

Figura 1. Architettura del plug-in di filtro.

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 contenente i filtri. Si tratta di un elemento distinto da quanto viene mostrato dall'implementazione di 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 il mappatore di tonalità HDR-SDR, i parametri interessati sono gli aspetti del colore.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

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

Dettagli FiltraWrapper

La sezione descrive i dettagli della classe FilterWrapper.

Creazione

Il componente con wrapping esegue l'inizializzazione del decodificatore 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.

Inizia

All'avvio, il componente con wrapping avvia il decodificatore e tutti i filtri che alterano 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 decodificatore con wrapping vengono inviati al decodificatore sottostante. Il componente wrapped acquisisce il buffer di output dal decoder tramite un onWorkDone_nb() callback e poi lo mette in coda per i filtri. Il buffer di output finale dell'ultimo filtro viene segnalato al client.

Affinché questa gestione degli buffer funzioni, il componente con wrapping deve configurare C2PortBlockPoolsTuning per l'ultimo filtro in modo che gli output del framework vengano bufferizzati dal pool di blocchi previsto.

Interrompi, reimposta e rilascia

All'arresto, il componente con wrapping arresta il decodificatore e tutti i filtri abilitati che sono stati avviati. Al riavvio e al rilascio, tutti i componenti vengono reimpostati o rilasciati, indipendentemente dal fatto che siano attivati o meno.

Implementa il plug-in del filtro di esempio

Per attivare il plug-in:

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

Testa il plug-in

Per testare il plug-in di esempio:

  1. Ricostruisci e 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