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.
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.
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'APIopenTypedAssetFileDescriptor
.
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.
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.
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/
MediaTranscoder nativo
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 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.
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 corsoFilterWrapper
.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 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 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).
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
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:
- Implementa l'interfaccia
FilterPlugin
in una libreria e inseriscila in/vendor/lib[64]/libc2filterplugin.so.
- Se necessario, aggiungi autorizzazioni aggiuntive a
mediacodec.te
. - 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:
- Ricostruisci e esegui il flashing del dispositivo.
Compila 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 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