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.
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.
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:
- Dichiara i formati non supportati nel file manifest. Per maggiori dettagli, vedi Dichiarare le funzionalità in una risorsa e Dichiarare le funzionalità nel codice.
- Disattiva i formati supportati con il framework di compatibilità delle app in fase di esecuzione (gli utenti possono anche disattivare questa opzione per ogni app nelle Impostazioni).
- Apri un file con
MediaStore
specificando esplicitamente i formati non supportati con l'APIopenTypedAssetFileDescriptor
.
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.
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.
API Transcoding System (utilizzata solo da MediaProvider)
API ApplicationMediaCapabilities
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
Servizio MediaTranscoding
frameworks/av/services/mediatranscoding/
frameworks/av/media/libmediatranscoding/
Native MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder
Plug-in di esempio HDR per MediaTranscoder
Codice di intercettazione e transcodifica dei file MediaProvider
Benchmark di MediaTranscoder
frameworks/av/media/libmediatranscoding/transcoder/benchmark
Test CTS
cts/tests/tests/mediatranscoding/
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.
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 classeFilterWrapper
.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à restituiscetrue
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).
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
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:
- Implementa l'interfaccia
FilterPlugin
in una libreria e rilasciala in/vendor/lib[64]/libc2filterplugin.so.
- Se necessario, aggiungi autorizzazioni aggiuntive a
mediacodec.te
. - 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:
- Ricostruisci e flasha il dispositivo.
Crea il plug-in di esempio utilizzando il seguente comando:
m sample-codec2-filter-plugin
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