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.
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.
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'APIopenTypedAssetFileDescriptor
.
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.
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.
API del sistema di transcodifica (utilizzato solo da MediaProvider)
API ApplicationMediaCapabilities
frameworks/base/apex/media/framework/java/android/media/ApplicationMediaCapabilities.java
Servizio di transcodifica multimediale
-
frameworks/av/services/mediatranscoding/
-
frameworks/av/media/libmediatranscoding/
-
MediaTranscoder nativo
-
frameworks/av/media/libmediatranscoding/transcoder
-
Plugin di esempio HDR per MediaTranscoder
Intercettazione file MediaProvider e codice di transcodifica
Punto di riferimento di MediaTranscoder
-
frameworks/av/media/libmediatranscoding/transcoder/benchmark
-
Prove CTS
-
cts/tests/tests/mediatranscoding/
-
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.
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 classeFilterWrapper
.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 restituiscetrue
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).
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
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:
- Implementa l'interfaccia
FilterPlugin
in una libreria e rilasciala in/vendor/lib[64]/libc2filterplugin.so.
- Aggiungi ulteriori autorizzazioni a
mediacodec.te
, se necessario. - 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:
- Ricompilare e eseguire il flashing del dispositivo.
Crea il plugin di esempio utilizzando il seguente comando:
m sample-codec2-filter-plugin
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