Transcodifica di contenuti multimediali compatibili

La transcodifica multimediale compatibile, 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 riducendo al contempo i requisiti di archiviazione e larghezza di banda. Per i dispositivi con la transcodifica multimediale compatibile attivata, 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. In questo modo, le app possono funzionare anche quando i video vengono acquisiti in formati più recenti sul dispositivo.

La funzionalità di transcodifica in contenuti multimediali compatibili è disattivata per impostazione predefinita. Per richiedere la transcodifica dei contenuti multimediali, le app devono dichiarare le proprie funzionalità multimediali. Per maggiori informazioni sulla dichiarazione delle funzionalità multimediali, consulta Transcodifica multimediale compatibile 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 converte i file da un formato all'altro utilizzando l'hardware per conversioni a bassa latenza e di alta qualità. Ciò include 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 dei contenuti multimediali compatibili nei fornitori di contenuti multimediali:questo componente presente nei fornitori di contenuti multimediali intercetta le app che accedono ai file multimediali e fornisce 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 una gestione speciale. Se un'app non supporta il formato, il framework converte il file in un formato precedente, ad esempio AVC, quando l'app accede al file.

La figura 1 mostra una panoramica della procedura di transcodifica dei contenuti multimediali.

Procedura di transcodifica in contenuti multimediali compatibili

Figura 1. Panoramica della transcodifica in contenuti multimediali compatibili.

Formati supportati:

La funzionalità di transcodifica dei contenuti multimediali compatibili supporta le seguenti conversioni di formato:

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

Origini dei contenuti supportate

La funzionalità di transcodifica dei contenuti multimediali compatibili supporta i contenuti multimediali generati sul dispositivo dall'app fotocamera OEM nativa e archiviati nella cartella DCIM/Camera/ nel volume esterno principale. La funzionalità non supporta i contenuti multimediali sulla memoria secondaria. I contenuti trasferiti ai dispositivi tramite email o schede SD non sono supportati.

Le app accedono ai file in base a vari percorsi. Di seguito sono descritti i percorsi dei 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 diretto, inclusi Java e codice nativo
    • Accesso alle app tramite Storage Access Framework (SAF)
    • Accesso alle app tramite gli intent del foglio di condivisione del sistema operativo. (solo URI MediaStore)
    • Trasferimento di file MTP/PTP dallo smartphone al PC
  • Transcodifica ignorata:

    • Trasferire file da un dispositivo espellendo la scheda SD
    • Trasferimento di file da dispositivo a dispositivo utilizzando opzioni come Condivisione nelle vicinanze o trasferimento Bluetooth.

Aggiungere percorsi di file personalizzati per la transcodifica

I produttori di dispositivi possono facoltativamente aggiungere percorsi di file per la transcodifica dei contenuti multimediali nella directory DCIM/. Tutti i percorsi al di fuori della directory DCIM/ vengono rifiutati. L'aggiunta di questi percorsi di file potrebbe essere necessaria per soddisfare i requisiti del corriere o le normative locali.

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

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

Per verificare i percorsi dei 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 dei contenuti multimediali.

media-transcoding-architecture

Figura 2. Architettura della transcodifica multimediale.

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 funzionalità di transcodifica in contenuti multimediali compatibili registra le metriche di transcodifica sia nel servizio sia nel transcodificatore 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 Filesystem in Userspace (FUSE), che viene utilizzato per lo spazio di archiviazione isolato. FUSE consente al modulo MediaProvider di esaminare le operazioni sui file nello spazio utente e di controllare l'accesso ai file in base alla policy 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 i file transcodificati

La funzionalità di transcodifica in contenuti multimediali compatibili è disattivata per impostazione predefinita. Le app possono richiedere asset transcodificati utilizzando le seguenti opzioni:

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

Attiva/disattiva l&#39;opzione per abilitare la transcodifica dei contenuti multimediali

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

Limitazioni alla richiesta di file transcodificati

Per impedire 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
  • una durata totale di tre minuti

Se un'app supera tutte queste limitazioni, il framework restituisce il descrittore di file originale.

Requisiti del dispositivo

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

  • Il dispositivo ha la codifica HEVC attiva per impostazione predefinita nell'app Fotocamera nativa
  • (Dispositivi che supportano la transcodifica da HDR a SDR) Il dispositivo supporta l'acquisizione di video HDR

Per garantire le prestazioni del dispositivo per la transcodifica dei contenuti multimediali, è necessario ottimizzare le prestazioni di accesso in lettura/scrittura all'hardware video e allo spazio di archiviazione. Quando i codec multimediali sono configurati con priorità uguale a 1, devono funzionare con la velocità effettiva più elevata possibile. Consigliamo che le prestazioni di transcodifica raggiungano un minimo di 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 compatibili, esegui i seguenti test CTS:

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

Attivare la transcodifica dei contenuti multimediali 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 contenuti multimediali, imposta il pulsante di attivazione/disattivazione Override transcodifica predefinita su On e poi imposta il pulsante di attivazione/disattivazione Attiva transcodifica su On o Off. Se questa impostazione è attivata, la transcodifica dei contenuti multimediali potrebbe avvenire in background per app diverse da quella che stai sviluppando.

Controllare lo stato della transcodifica

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

adb shell dumpsys media.transcoding

Estendere la limitazione della durata dei video

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

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Origine e riferimenti AOSP

Di seguito è riportato il codice sorgente AOSP relativo alla transcodifica in contenuti multimediali compatibili.

Codifica da HDR a SDR

Per supportare la codifica HDR in SDR, i produttori di dispositivi possono utilizzare il plug-in di esempio del filtro Codec 2.0 AOSP che si trova in /platform/frameworks/av/media/codec2/hidl/plugin/. Questa sezione descrive come funziona il 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 ottiene il descrittore di file originale indipendentemente dalle funzionalità multimediali dell'app dichiarate nel manifest.

Come funziona

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

Sfondo

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

Panoramica

La classe FilterWrapper prende i codec del fornitore e restituisce i codec wrapper 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 vengono istanziati tutti i filtri disponibili. Solo i filtri che modificano il buffer vengono avviati all'inizio.

Architettura del plug-in di filtro

Figura 4. Architettura del plug-in di filtro.

Interfaccia del plug-in di filtro

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

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Restituisce un oggetto C2ComponentStore che contiene i filtri. Questo è separato da ciò che espone l'implementazione del codec 2.0 del fornitore. In genere, questo archivio contiene solo i filtri utilizzati dalla classe FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

    Descrive i filtri oltre a quelli disponibili su C2ComponentStore. Sono definite le seguenti descrizioni:

    • controlParam: Parametri che controllano il comportamento dei filtri. Ad esempio, per il mapper di tonalità HDR-SDR, il parametro di controllo è la funzione di trasferimento di destinazione.
    • affectedParams: Parametri interessati dalle operazioni di filtro. Ad esempio, per il mapper 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 altera il buffer. Ad esempio, il filtro di mappatura della tonalità restituisce true se la funzione di trasferimento di destinazione è SDR e la funzione di trasferimento di input è HDR (HLG o PQ).

Dettagli di FilterWrapper

La sezione descrive i dettagli della classe FilterWrapper.

Creazione

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

Query e configurazione

Il componente wrapper separa i parametri in entrata dalle query o dalle richieste di configurazione in base alla descrizione del filtro. Ad esempio, la configurazione del parametro del controllo filtro viene indirizzata al filtro corrispondente e i parametri interessati dai filtri sono presenti nelle query (anziché essere letti dal decodificatore che contiene parametri non interessati).

Query e configurazione

Figura 5. Query e configurazione.

Inizia

All'inizio, il componente wrapper avvia il decodificatore e tutti i filtri che modificano i buffer. Se non è attivato alcun filtro, il componente di wrapping avvia il decodificatore e i buffer pass-through e invia comandi al decodificatore stesso.

Gestione del buffer

Gestione del buffer

Figura 6. Gestione del buffer.

I buffer in coda al decoder wrapper vengono inviati al decoder sottostante. Il componente wrapper acquisisce il buffer di output dal decoder tramite un callback onWorkDone_nb() e lo mette in coda ai filtri. Il buffer di output finale dell'ultimo filtro viene segnalato al client.

Affinché la gestione del buffer funzioni, il componente wrapper deve configurare C2PortBlockPoolsTuning all'ultimo filtro in modo che i buffer di output del framework provengano dal pool di blocchi previsto.

Arrestare, reimpostare e rilasciare

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

Implementa il plug-in di 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 ricompila il servizio media.c2.

Testa il plug-in

Per testare il plug-in di esempio:

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