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 per lo 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 funzionalità di transcodifica in contenuti multimediali compatibili è 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 all'altro utilizzando hardware per conversioni di alta qualità e bassa latenza. Sono inclusi l'API di transcodifica, il servizio di transcodifica, un plug-in OEM per i filtri personalizzati e l'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 serve 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 della procedura di transcodifica dei contenuti multimediali.

Procedura di transcodifica di contenuti multimediali compatibili

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.
  • HDR10+ (10 bit) ad AVC (SDR): le conversioni da HDR a SDR vengono eseguite utilizzando istanze mediacodec e un plug-in del fornitore collegato alle istanze di decodifica. Per ulteriori informazioni, consulta la sezione Codifica HDR in SDR.

Origini di contenuti 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 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 estraendo la 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 al di fuori della directory DCIM/ vengono rifiutati. L'aggiunta di questi percorsi file potrebbe essere necessaria per soddisfare i requisiti dell'operatore 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 dei contenuti multimediali.

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 è basata sul filesystem Filesystem in Userspace (FUSE), che viene utilizzato per lo spazio di archiviazione basato sugli ambiti. 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 al file da parte dell'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:

  • Dichiarare 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. In questo modo, la transcodifica viene attivata per le app che non hanno aggiornato il file manifest. Una volta che un'app aggiorna il file manifest con formati non supportati, deve essere rimossa dall'elenco di transcodifica forzata. 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/disattiva l&#39;opzione per abilitare la transcodifica dei contenuti multimediali

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

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

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

Requisiti del dispositivo

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

  • La codifica HEVC è attiva per impostazione predefinita nell'app 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 transcoder media a 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 multimediale, imposta l'opzione di attivazione/disattivazione Sostituisci i valori predefiniti della transcodifica su On e poi imposta l'opzione di attivazione/disattivazione 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

Estendere il limite di durata del 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 è 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 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 HDR in SDR, un'app che accede a un video HDR riceve il descrittore 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.

Sfondo

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 prende i codec del fornitore e restituisce nuovamente 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. Solo i filtri che alterano 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 contenente i filtri. Si tratta di un elemento distinto da quanto esposto dall'implementazione di Codec 2.0 del fornitore. In genere, questo magazzino contiene solo i filtri utilizzati dal corso FilterWrapper.

  • bool describe(C2String name, Descriptor *desc)

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

    • controlParam: parametri che controllano il comportamento dei filtri. Ad esempio, per il mappatore di tonalità HDR-SDR, il parametro di controllo è la funzione di trasferimento target.
    • affectedParams: parametri interessati dalle operazioni di filtraggine. 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 altera 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 di FilterWrapper

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 con wrapping separa i parametri in arrivo dalle query o dalle richieste di configurazione in base alla descrizione del filtro. Ad esempio, la configurazione del parametro di controllo filtro viene indirizzata al filtro corrispondente e i parametri interessati dai filtri sono presenti nelle query (anziché essere letti dal decodificatore con parametri non interessati).

Query e configurazione

Figura 5. Query e configurazione.

Inizia

All'avvio, il componente con wrapping avvia il decodificatore e tutti i filtri che alterano i buffer. Se non è attivato alcun filtro, il componente con 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 con wrapping vengono inviati al decoder 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 inseriscila 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. Compila 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