Kompatible Medientranskodierung

Die mit Android 12 eingeführte kompatible Medientranskodierung ist eine Funktion, die es Geräten ermöglicht, modernere, speichereffizientere Medienformate wie HEVC für die Videoaufnahme zu verwenden und gleichzeitig die Kompatibilität mit Apps aufrechtzuerhalten. Mit dieser Funktion können Gerätehersteller standardmäßig HEVC anstelle von AVC verwenden, um die Videoqualität zu verbessern und gleichzeitig den Speicher- und Bandbreitenbedarf zu reduzieren. Bei Geräten mit aktivierter kompatibler Medientranskodierung kann Android Videos (bis zu einer Minute Länge), die in Formaten wie HEVC oder HDR aufgenommen wurden, automatisch konvertieren, wenn die Videos von einer App geöffnet werden, die das Format nicht unterstützt. Dadurch können Apps auch dann funktionieren, wenn Videos in neueren Formaten auf dem Gerät aufgenommen werden.

Die Funktion zur kompatiblen Medientranskodierung ist standardmäßig deaktiviert. Um eine Medientranskodierung anzufordern, müssen Apps ihre Medienfunktionen angeben. Weitere Informationen zum Deklarieren von Medienfunktionen finden Sie unter Kompatible Medientranskodierung auf der Website für Android-Entwickler.

Wie es funktioniert

Die Funktion zur kompatiblen Medientranskodierung besteht aus zwei Hauptteilen:

  • Transkodierungsdienste im Medien-Framework: Diese Dienste konvertieren Dateien von einem Format in ein anderes mithilfe von Hardware für geringe Latenz und qualitativ hochwertige Konvertierungen. Dazu gehören die Transkodierungs-API, der Transkodierungsdienst, ein OEM-Plugin für benutzerdefinierte Filter und Hardware. Weitere Einzelheiten finden Sie unter Architekturübersicht .
  • Kompatible Medientranskodierungsfunktion bei Medienanbietern: Diese in Medienanbietern enthaltene Komponente fängt Apps ab, die auf Mediendateien zugreifen, und stellt basierend auf den deklarierten Funktionen der App entweder die Originaldatei oder eine transkodierte Datei bereit. Wenn eine App das Format der Mediendatei unterstützt, ist keine besondere Behandlung erforderlich. Wenn eine App das Format nicht unterstützt, konvertiert das Framework die Datei in ein älteres Format, z. B. AVC, wenn die App auf die Datei zugreift.

Abbildung 1 zeigt einen Überblick über den Medientranskodierungsprozess.

Kompatibler Medientranskodierungsprozess

Abbildung 1. Übersicht über kompatible Medientranskodierung.

Unterstützte Formate

Die Funktion zur kompatiblen Medientranskodierung unterstützt die folgenden Formatkonvertierungen:

  • HEVC (8-Bit) zu AVC: Codec-Konvertierungen werden durch den Anschluss eines Mediacodec-Decoders und eines Mediacode-Encoders durchgeführt.
  • HDR10+ (10-Bit) zu AVC (SDR): HDR-zu-SDR-Konvertierungen werden mithilfe von Mediacodec-Instanzen und einem Hersteller-Plugin-Hook in die Decoder-Instanzen durchgeführt. Weitere Informationen finden Sie unter HDR-zu-SDR-Kodierung .

Unterstützte Inhaltsquellen

Die Funktion zur kompatiblen Medientranskodierung unterstützt geräteinterne Medien, die von der nativen OEM-Kamera-App generiert und im Ordner DCIM/Camera/ im primären externen Volume gespeichert sind. Die Funktion unterstützt keine Medien im sekundären Speicher. Inhalte, die per E-Mail oder SD-Karte an Geräte weitergeleitet werden, werden nicht unterstützt.

Apps greifen über verschiedene Dateipfade auf die Dateien zu. Im Folgenden werden die Dateipfade beschrieben, in denen die Transkodierung aktiviert oder umgangen wird:

  • Transkodierung aktiviert:

    • App-Zugriff über MediaStore-APIs
    • App-Zugriff über direkte Dateipfad-APIs, einschließlich Java und nativem Code
    • App-Zugriff über das Storage Access Framework (SAF)
    • App-Zugriff über die Absichten des Betriebssystem-Freigabeblatts. (Nur MediaStore-URI)
    • MTP/PTP-Dateiübertragung vom Telefon zum PC
  • Transkodierung umgangen:

    • Übertragen von Dateien von einem Gerät durch Auswerfen der SD-Karte
    • Übertragen von Dateien von Gerät zu Gerät mithilfe von Optionen wie Nearby Share oder Bluetooth-Übertragung.

Fügen Sie benutzerdefinierte Dateipfade für die Transkodierung hinzu

Gerätehersteller können optional Dateipfade für die Medientranskodierung im DCIM/ -Verzeichnis hinzufügen. Alle Pfade außerhalb des DCIM/ -Verzeichnisses werden abgelehnt. Das Hinzufügen solcher Dateipfade kann erforderlich sein, um die Anforderungen des Netzbetreibers oder lokale Vorschriften zu erfüllen.

Um einen Dateipfad hinzuzufügen, verwenden Sie das Transcode Path Runtime Resource Overlay (RRO) config_supported_transcoding_relative_paths . Im Folgenden finden Sie ein Beispiel für das Hinzufügen eines Dateipfads:

<string-array name="config_supported_transcoding_relative_paths" translatable="false">
    <item>DCIM/JCF/</item>
</string-array>

Um die konfigurierten Dateipfade zu überprüfen, verwenden Sie:

adb shell dumpsys activity provider com.google.android.providers.media.module/com.android.providers.media.MediaProvider | head -n 20

Architekturübersicht

In diesem Abschnitt wird die Architektur der Medientranskodierungsfunktion beschrieben.

Medientranskodierungsarchitektur

Abbildung 2. Medientranskodierungsarchitektur.

Die Medientranskodierungsarchitektur besteht aus den folgenden Komponenten:

  • MediaTranscodingManager-System-API: Schnittstelle, die es dem Client ermöglicht, mit dem MediaTranscoding-Dienst zu kommunizieren. Das MediaProvider- Modul verwendet diese API.
  • MediaTranscodingService: Nativer Dienst, der Clientverbindungen verwaltet, Transkodierungsanfragen plant und die Buchhaltung für TranscodingSessions verwaltet.
  • MediaTranscoder: Native Bibliothek, die die Transkodierung durchführt. Diese Bibliothek basiert auf dem Medienframework NDK, um mit Modulen kompatibel zu sein.

Die Funktion zur kompatiblen Medientranskodierung protokolliert Transkodierungsmetriken sowohl im Dienst als auch im Medientranskodierer. Der clientseitige und dienstseitige Code befindet sich im MediaProvider-Modul, um zeitnahe Fehlerbehebungen und Updates zu ermöglichen.

Dateizugriff

Die kompatible Medientranskodierung basiert auf dem Filesystem in Userspace (FUSE)-Dateisystem , das für die bereichsbezogene Speicherung verwendet wird. FUSE ermöglicht es dem MediaProvider-Modul, Dateivorgänge im Benutzerbereich zu untersuchen und den Zugriff auf Dateien basierend auf der Richtlinie zu sperren, um den Zugriff zuzulassen, zu verweigern oder zu schwärzen.

Wenn eine App versucht, auf eine Datei zuzugreifen, fängt der FUSE-Daemon den Dateilesezugriff der App ab. Wenn die App ein neueres Format unterstützt (z. B. HEVC), wird die Originaldatei zurückgegeben. Wenn die App das Format nicht unterstützt, wird die Datei in ein älteres Format (z. B. AVC) transkodiert oder aus dem Cache zurückgegeben, wenn eine transkodierte Version verfügbar ist.

Fordern Sie transkodierte Dateien an

Die Funktion zur kompatiblen Medientranskodierung ist standardmäßig deaktiviert. Das heißt, wenn das Gerät HEVC unterstützt, transkodiert Android keine Dateien, es sei denn, dies wird von einer App in einer Manifestdatei oder in der Liste „Transkodierung erzwingen“ angegeben.

Apps können transkodierte Assets mit den folgenden Optionen anfordern:

  • Deklarieren Sie nicht unterstützte Formate in der Manifestdatei. Einzelheiten finden Sie unter Deklarieren von Funktionen in einer Ressource und Deklarieren von Funktionen im Code .
  • Fügen Sie Apps zur Force-Transcode-Liste hinzu, die im MediaProvider- Modul enthalten ist. Dies ermöglicht die Transkodierung für Apps, deren Manifestdatei nicht aktualisiert wurde. Sobald eine App ihre Manifestdatei mit nicht unterstützten Formaten aktualisiert, muss sie aus der Liste „Transkodierung erzwingen“ entfernt werden. Gerätehersteller können vorschlagen, dass ihre Apps zur Force-Transcode-Liste hinzugefügt oder daraus entfernt werden sollen, indem sie einen Patch einreichen oder einen Fehler melden . Das Android-Team überprüft die Liste regelmäßig und entfernt möglicherweise Apps aus der Liste.
  • Deaktivieren Sie unterstützte Formate mit dem App-Kompatibilitäts-Framework zur Laufzeit (Benutzer können dies auch für jede App in den Einstellungen deaktivieren).
  • Öffnen Sie eine Datei mit MediaStore und geben Sie dabei explizit nicht unterstützte Formate mit der openTypedAssetFileDescriptor API an.

Bei USB-Übertragungen (Gerät zum PC) ist die Transkodierung standardmäßig deaktiviert, Benutzer können die Transkodierung jedoch mithilfe der Schaltfläche „Videos in AVC konvertieren“ im Einstellungsbildschirm „USB-Einstellungen“ aktivieren, wie in Abbildung 3 dargestellt.

Schalten Sie um, um die Medientranskodierung zu aktivieren

Abbildung 3. Aktivieren Sie die Medientranskodierung im Bildschirm „USB-Einstellungen“.

Einschränkungen beim Anfordern transkodierter Dateien

Um zu verhindern, dass Transkodierungsanfragen Systemressourcen für längere Zeit blockieren, sind Apps, die Transkodierungssitzungen anfordern, auf Folgendes beschränkt:

  • 10 aufeinanderfolgende Sitzungen
  • eine Gesamtlaufzeit von drei Minuten

Wenn eine App alle diese Einschränkungen überschreitet, gibt das Framework den ursprünglichen Dateideskriptor zurück.

Geräteanforderungen

Um die kompatible Medientranskodierungsfunktion zu unterstützen, müssen Geräte die folgenden Anforderungen erfüllen:

  • Auf dem Gerät ist in der nativen Kamera-App standardmäßig die HEVC-Kodierung aktiviert
  • (Geräte, die die Transkodierung von HDR zu SDR unterstützen) Das Gerät unterstützt die Aufnahme von HDR-Videos

Um die Geräteleistung für die Medientranskodierung sicherzustellen, müssen die Videohardware und die Lese-/Schreibzugriffsleistung des Speichers optimiert werden. Wenn Mediencodecs mit der Priorität 1 konfiguriert sind, müssen die Codecs mit dem höchstmöglichen Durchsatz arbeiten. Wir empfehlen, dass die Transkodierungsleistung mindestens 200 fps erreicht. Um die Leistung Ihrer Hardware zu testen, führen Sie den Medientranscoder-Benchmark unter frameworks/av/media/libmediatranscoding/transcoder/benchmark aus.

Validierung

Führen Sie die folgenden CTS-Tests aus, um die kompatible Medientranskodierungsfunktion zu validieren:

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

Aktivieren Sie die globale Medientranskodierung

Um das Medientranskodierungs-Framework oder das App-Verhalten bei der Transkodierung zu testen, können Sie die kompatible Medientranskodierungsfunktion global aktivieren oder deaktivieren. Stellen Sie auf der Seite „Einstellungen“ > „System“ > „Entwickler“ > „Medientranskodierung“ mit den Entwickleroptionen den Schalter „Standardwerte für Transkodierung überschreiben“ auf „ Ein “ und dann den Schalter „ Transkodierung aktivieren“ auf „ Ein “ oder „Aus“ . Wenn diese Einstellung aktiviert ist, erfolgt möglicherweise im Hintergrund eine Medientranskodierung für andere Apps als die, die Sie entwickeln.

Überprüfen Sie den Transkodierungsstatus

Während des Tests können Sie den folgenden ADB-Shell-Befehl verwenden, um den Transkodierungsstatus zu überprüfen, einschließlich aktueller und vergangener Transkodierungssitzungen:

adb shell dumpsys media.transcoding

Erweitern Sie die Videolängenbeschränkung

Zu Testzwecken können Sie die Videolängenbeschränkung von einer Minute für die Transkodierung erweitern, indem Sie den folgenden Befehl verwenden. Nach der Ausführung dieses Befehls ist möglicherweise ein Neustart erforderlich.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

AOSP-Quelle und Referenzen

Im Folgenden finden Sie AOSP-Quellcode im Zusammenhang mit der kompatiblen Medientranskodierung.

HDR-zu-SDR-Kodierung

Um die HDR-zu-SDR-Kodierung zu unterstützen, können Gerätehersteller das AOSP-Beispiel-Codec 2.0-Filter-Plugin verwenden, das sich in /platform/frameworks/av/media/codec2/hidl/plugin/ befindet. In diesem Abschnitt wird beschrieben, wie das Filter-Plugin funktioniert, wie das Plugin implementiert wird und wie das Plugin getestet wird.

Wenn ein Gerät kein Plugin enthält, das die HDR-zu-SDR-Kodierung unterstützt, erhält eine App, die auf ein HDR-Video zugreift, den ursprünglichen Dateideskriptor, unabhängig von den im Manifest deklarierten Medienfunktionen der App.

Wie es funktioniert

In diesem Abschnitt wird das allgemeine Verhalten des Codec 2.0-Filter-Plugins beschrieben.

Hintergrund

Android bietet eine Anpassungsschichtimplementierung zwischen der Codec 2.0- Schnittstelle und der HAL-Schnittstelle android.hardware.media.c2 unter android::hardware::media::c2 . Für Filter-Plugins enthält AOSP einen Wrapper-Mechanismus, der Decoder zusammen mit Filter-Plugins verpackt. MediaCodec erkennt diese verpackten Komponenten als Decoder mit Filterfunktionen.

Überblick

Die FilterWrapper Klasse übernimmt Codecs von Anbietern und gibt verpackte Codecs zurück an die Adaptionsschicht media.c2 . Die FilterWrapper Klasse lädt libc2filterplugin.so über die FilterWrapper::Plugin API und zeichnet verfügbare Filter vom Plugin auf. Bei der Erstellung instanziiert FilterWrapper alle verfügbaren Filter. Beim Start werden nur Filter gestartet, die den Puffer verändern.

Filter-Plugin-Architektur

Abbildung 1. Filter-Plugin-Architektur.

Filter-Plugin-Schnittstelle

Die FilterPlugin.h Schnittstelle definiert die folgenden APIs, um die Filter verfügbar zu machen:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Gibt ein C2ComponentStore Objekt zurück, das Filter enthält. Dies unterscheidet sich von dem, was die Codec 2.0-Implementierung des Anbieters offenlegt. Normalerweise enthält dieser Speicher nur die von der FilterWrapper Klasse verwendeten Filter.

  • bool describe(C2String name, Descriptor *desc)

    Beschreibt die Filter zusätzlich zu dem, was im C2ComponentStore verfügbar ist. Folgende Beschreibungen sind definiert:

    • controlParam : Parameter, die das Verhalten der Filter steuern. Beim HDR-zu-SDR-Tonmapper ist der Steuerparameter beispielsweise die Zielübertragungsfunktion.
    • affectedParams : Parameter, die von den Filtervorgängen betroffen sind. Beim HDR-zu-SDR-Tonmapper sind beispielsweise die Farbaspekte die betroffenen Parameter.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Gibt true zurück, wenn die Filterkomponente den Puffer ändert. Der Tone-Mapping-Filter gibt beispielsweise true zurück, wenn die Zielübertragungsfunktion SDR und die Eingabeübertragungsfunktion HDR (HLG oder PQ) ist.

FilterWrapper-Details

Der Abschnitt beschreibt Details der FilterWrapper Klasse.

Schaffung

Die verpackte Komponente instanziiert den zugrunde liegenden Decoder und alle definierten Filter bei der Erstellung.

Abfrage und Konfiguration

Die umschlossene Komponente trennt eingehende Parameter von Abfragen oder Konfigurationsanfragen entsprechend der Filterbeschreibung. Beispielsweise wird die Konfiguration des Filtersteuerungsparameters an den entsprechenden Filter weitergeleitet und betroffene Parameter der Filter sind in den Abfragen vorhanden (anstatt vom Decoder zu lesen, der nicht betroffene Parameter hat).

Abfrage und Konfiguration

Abbildung 2. Abfrage und Konfiguration.

Start

Beim Start startet die verpackte Komponente den Decoder und alle Filter, die die Puffer ändern. Wenn kein Filter aktiviert ist, startet die verpackte Komponente den Decoder und die Durchgangspuffer und sendet Befehle an den Decoder selbst.

Pufferhandhabung

Pufferhandhabung

Abbildung 3. Pufferhandhabung.

Puffer, die in der Warteschlange des umhüllten Decoders stehen, werden an den zugrunde liegenden Decoder weitergeleitet. Die verpackte Komponente ruft den Ausgabepuffer über einen onWorkDone_nb() -Rückruf vom Decoder ab und stellt ihn dann in die Warteschlange der Filter. Der endgültige Ausgabepuffer des letzten Filters wird dem Client gemeldet.

Damit diese Pufferbehandlung funktioniert, muss die umschlossene Komponente C2PortBlockPoolsTuning auf den letzten Filter konfigurieren, damit das Framework Puffer aus dem erwarteten Blockpool ausgibt.

Stoppen, zurücksetzen und loslassen

Bei Stopp stoppt die verpackte Komponente den Decoder und alle aktivierten Filter, die gestartet wurden. Beim Zurücksetzen und Freigeben werden alle Komponenten zurückgesetzt oder freigegeben, unabhängig davon, ob sie aktiviert sind oder nicht.

Implementieren Sie das Beispielfilter-Plugin

Um das Plugin zu aktivieren, gehen Sie wie folgt vor:

  1. Implementieren Sie die FilterPlugin Schnittstelle in einer Bibliothek und legen Sie sie unter /vendor/lib[64]/libc2filterplugin.so.
  2. Fügen Sie bei Bedarf zusätzliche Berechtigungen zu mediacodec.te hinzu.
  3. Aktualisieren Sie die Anpassungsebene auf Android 12 und erstellen Sie den Dienst media.c2 neu.

Testen Sie das Plugin

Gehen Sie wie folgt vor, um das Beispiel-Plugin zu testen:

  1. Erstellen Sie das Gerät neu und flashen Sie es.
  2. Erstellen Sie das Beispiel-Plugin mit dem folgenden Befehl:

    m sample-codec2-filter-plugin
    
  3. Hängen Sie das Gerät erneut ein und benennen Sie das Hersteller-Plugin um, damit es vom Codec-Dienst erkannt wird.

    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