Transcodifica multimediale compatibile

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 archiviazione per l'acquisizione video, come HEVC, mantenendo al contempo 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 i requisiti di archiviazione e larghezza di banda. Per i dispositivi con transcodifica multimediale compatibile abilitata, 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 funzionalità di transcodifica multimediale compatibile è disattivata per impostazione predefinita. Per richiedere la transcodifica multimediale, le app devono dichiarare le proprie capacità multimediali. Per ulteriori informazioni sulla dichiarazione delle funzionalità multimediali, consulta Transcodifica multimediale compatibile nel sito per sviluppatori Android.

Come funziona

La funzionalità di transcodifica multimediale compatibile è composta da due parti principali:

  • Servizi di transcodifica nel framework multimediale: questi servizi convertono file da un formato a un 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 ulteriori dettagli, vedere Panoramica dell'architettura .
  • Funzionalità di transcodifica multimediale compatibile 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 è richiesta alcuna 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 multimediale compatibile.

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 collegando un decoder mediacodec e un codificatore mediacode.
  • Da HDR10+ (10 bit) a AVC (SDR): le conversioni da HDR a SDR vengono eseguite utilizzando istanze mediacodec e un plug-in del fornitore agganciato alle istanze del decodificatore. Per ulteriori informazioni, consulta Codifica da HDR a SDR .

Fonti di contenuto supportate

La funzione di transcodifica multimediale compatibile supporta i contenuti multimediali sul dispositivo generati dall'app nativa della fotocamera OEM archiviata nella cartella DCIM/Camera/ nel volume esterno primario. La funzionalità non supporta i supporti nella memoria secondaria. I contenuti trasmessi ai dispositivi tramite e-mail o schede SD non sono supportati.

Le app accedono ai file in base a vari percorsi di file. Di seguito vengono descritti i percorsi file in cui la transcodifica è abilitata o ignorata:

  • Transcodifica abilitata:

    • Accesso alle app tramite API MediaStore
    • Accesso all'app tramite API del percorso file diretto, inclusi Java e codice nativo
    • Accesso alle app tramite Storage Access Framework (SAF)
    • Accesso all'app tramite il foglio di condivisione del sistema operativo Intenti. (Solo URI MediaStore)
    • Trasferimento di file MTP/PTP dal telefono al PC
  • Transcodifica bypassata:

    • Trasferimento di file da un dispositivo espellendo la scheda SD
    • Trasferimento di file da un dispositivo all'altro utilizzando opzioni come Condivisione nelle vicinanze o Trasferimento Bluetooth.

Aggiungi percorsi file personalizzati per la transcodifica

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

Per aggiungere un percorso file, utilizzare l' overlay delle risorse runtime del percorso di transcodifica (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, utilizzare:

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 di transcodifica multimediale

Figura 2. Architettura di transcodifica multimediale.

L'architettura di transcodifica multimediale è 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 è costruita sul framework multimediale NDK per essere compatibile con i moduli .

La funzionalità di transcodifica multimediale compatibile registra i parametri di transcodifica sia nel servizio che 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 multimediale compatibile è basata sul filesystem Filesystem in Userspace (FUSE) , 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 alla policy per consentire, negare o oscurare l'accesso.

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

Richiedi file transcodificati

La funzionalità di transcodifica multimediale compatibile è disabilitata per impostazione predefinita, il che 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 forzata .

Le app possono richiedere risorse transcodificate utilizzando le seguenti opzioni:

  • Dichiara i formati non supportati nel file manifest. Per informazioni dettagliate, vedere Dichiarare le funzionalità in una risorsa e Dichiarare le funzionalità nel codice .
  • Aggiungi app all'elenco di transcodifica forzata incluso nel modulo MediaProvider . Ciò consente la transcodifica per le app che non hanno aggiornato il file manifest. Una volta che un'app aggiorna il proprio file manifest con formati non supportati, deve essere rimossa dall'elenco di transcodifica forzata. I produttori di dispositivi possono proporre che le loro app vengano aggiunte o rimosse dall'elenco di transcodifica forzata inviando una patch o segnalando un bug . Il team Android esamina periodicamente l'elenco e può rimuovere app dall'elenco.
  • Disabilita i formati supportati con il framework di compatibilità dell'app in fase di esecuzione (gli utenti possono anche disabilitarlo per ciascuna app in Impostazioni).
  • Apri un file con MediaStore specificando esplicitamente i formati non supportati con l'API openTypedAssetFileDescriptor .

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

Attiva/disattiva per abilitare la transcodifica multimediale

Figura 3. Selezionare per abilitare la transcodifica multimediale nella schermata Preferenze USB.

Restrizioni sulla 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
  • una durata complessiva di tre minuti

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

Requisiti del dispositivo

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

  • Il dispositivo ha la codifica HEVC abilitata per impostazione predefinita sull'app nativa della fotocamera
  • (Dispositivi che supportano la transcodifica da 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. Quando i codec multimediali sono configurati con priorità pari a 1 , i codec devono funzionare alla massima velocità effettiva possibile. Consigliamo che le prestazioni di transcodifica raggiungano un minimo di 200 fps. Per testare le prestazioni dell'hardware, esegui il benchmark del transcoder multimediale su frameworks/av/media/libmediatranscoding/transcoder/benchmark .

Validazione

Per convalidare la funzionalità di transcodifica multimediale compatibile, eseguire i seguenti test CTS:

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

Abilita la transcodifica multimediale a livello globale

Per testare il framework di transcodifica multimediale o il comportamento dell'app con la transcodifica, puoi abilitare o disabilitare la funzionalità di transcodifica multimediale compatibile a livello globale. Nella pagina Impostazioni > Sistema > Sviluppatore > Opzioni sviluppatore transcodifica multimediale , imposta l'interruttore Sostituisci impostazioni predefinite transcodifica su attivato , quindi imposta l'interruttore Abilita transcodifica su attivato o disattivato . Se questa impostazione è abilitata, la transcodifica multimediale potrebbe verificarsi in background per app diverse da quella che stai sviluppando.

Controlla lo stato della transcodifica

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

adb shell dumpsys media.transcoding

Estendi la limitazione della durata del video

A scopo di test, puoi estendere il limite di durata video di un minuto per la transcodifica utilizzando il comando seguente. Potrebbe essere necessario un riavvio dopo aver eseguito questo comando.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Fonte e riferimenti AOSP

Di seguito è riportato 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 di filtro Codec 2.0 di esempio AOSP situato in /platform/frameworks/av/media/codec2/hidl/plugin/ . Questa sezione descrive come funziona il plugin filtro, come implementare il plugin e come testare il plugin.

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 plugin filtro Codec 2.0.

Sfondo

Android fornisce un'implementazione del livello di adattamento tra l'interfaccia Codec 2.0 e l'interfaccia HAL android.hardware.media.c2 su android::hardware::media::c2 . Per i plugin di filtro, AOSP include un meccanismo wrapper che avvolge i decodificatori insieme ai plugin di filtro. MediaCodec riconosce questi componenti inseriti come decodificatori con funzionalità di filtraggio.

Panoramica

La classe FilterWrapper accetta i codec del fornitore e restituisce i codec incapsulati al livello di adattamento media.c2 . La classe FilterWrapper carica libc2filterplugin.so tramite l'API FilterWrapper::Plugin e registra i filtri disponibili dal plugin. Al momento della creazione, FilterWrapper crea un'istanza di tutti i filtri disponibili. All'avvio vengono avviati solo i filtri che alterano il buffer.

Filtra l'architettura dei plugin

Figura 1. Architettura del plugin filtro.

Interfaccia del plugin filtro

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

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Restituisce un oggetto C2ComponentStore che contiene 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 in aggiunta a ciò che è disponibile da C2ComponentStore . Sono definite le seguenti descrizioni:

    • controlParam : parametri che controllano il comportamento dei filtri. Ad esempio, per il tone-mapper 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 tonemapper da HDR a SDR, i parametri interessati sono gli aspetti cromatici.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

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

Dettagli FilterWrapper

La sezione descrive i dettagli della classe FilterWrapper .

Creazione

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

Interrogazione e configurazione

Il componente inserito 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 del filtro viene instradata al filtro corrispondente e i parametri interessati dai filtri sono presenti nelle query (invece di leggere dal decodificatore che ha parametri non interessati).

Interrogazione e configurazione

Figura 2. Query e configurazione.

Inizio

All'avvio, il componente avvolto avvia il decoder e tutti i filtri che alterano i buffer. Se nessun filtro è abilitato, il componente avvolto avvia il decodificatore, i buffer pass-through e invia comandi al decodificatore stesso.

Gestione del buffer

Gestione del buffer

Figura 3. Gestione del buffer.

I buffer in coda al decodificatore avvolto vanno al decodificatore sottostante. Il componente avvolto cattura il buffer di output dal decodificatore tramite un callback onWorkDone_nb() e quindi lo accoda ai filtri. Il buffer di output finale dell'ultimo filtro viene segnalato al client.

Affinché la gestione del buffer funzioni, il componente inserito deve configurare C2PortBlockPoolsTuning sull'ultimo filtro in modo che il framework emetta buffer dal pool di blocchi previsto.

Fermati, ripristina e rilascia

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

Implementa il plug-in del filtro di esempio

Per abilitare il plugin, procedi come segue:

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

Prova il plug-in

Per testare il plugin di esempio, procedi come segue:

  1. Ricompilare e eseguire il flashing del dispositivo.
  2. Crea il plugin di esempio utilizzando il seguente comando:

    m sample-codec2-filter-plugin
    
  3. Rimontare il dispositivo e rinominare 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