Zgodne transkodowanie multimediów

Zgodne transkodowanie multimediów, wprowadzone w systemie Android 12, to funkcja, która umożliwia urządzeniom korzystanie z nowszych, oszczędzających pamięć formatów multimediów do przechwytywania wideo, takich jak HEVC, przy jednoczesnym zachowaniu zgodności z aplikacjami. Dzięki tej funkcji producenci urządzeń mogą domyślnie używać formatu HEVC zamiast AVC, aby poprawić jakość wideo, jednocześnie zmniejszając wymagania dotyczące pamięci i przepustowości. W przypadku urządzeń z włączonym transkodowaniem zgodnych multimediów Android może automatycznie konwertować filmy (o długości do jednej minuty) nagrane w formatach takich jak HEVC lub HDR, gdy filmy zostaną otwarte w aplikacji, która nie obsługuje tego formatu. Dzięki temu aplikacje mogą działać nawet wtedy, gdy na urządzeniu nagrywane są filmy w nowszych formatach.

Funkcja transkodowania zgodnych multimediów jest domyślnie wyłączona. Aby zażądać transkodowania multimediów, aplikacje muszą zadeklarować swoje możliwości multimediów. Aby uzyskać więcej informacji na temat deklarowania możliwości multimediów, zobacz Zgodne transkodowanie multimediów w witrynie dla programistów Androida.

Jak to działa

Funkcja transkodowania zgodnych multimediów składa się z dwóch głównych części:

  • Usługi transkodowania w środowisku multimediów: usługi te konwertują pliki z jednego formatu na inny przy użyciu sprzętu w celu zapewnienia konwersji o niskim opóźnieniu i wysokiej jakości. Obejmuje to interfejs API transkodowania, usługę transkodowania, wtyczkę OEM do filtrów niestandardowych i sprzęt. Aby uzyskać więcej informacji, zobacz Omówienie architektury .
  • Zgodna funkcja transkodowania multimediów u dostawców multimediów: ten komponent dostępny u dostawców multimediów przechwytuje aplikacje uzyskujące dostęp do plików multimedialnych i udostępnia albo plik oryginalny, albo plik transkodowany w oparciu o zadeklarowane możliwości aplikacji. Jeśli aplikacja obsługuje format pliku multimedialnego, nie jest wymagana żadna specjalna obsługa. Jeśli aplikacja nie obsługuje tego formatu, platforma konwertuje plik na starszy format, taki jak AVC, gdy aplikacja uzyskuje dostęp do pliku.

Rysunek 1 przedstawia przegląd procesu transkodowania multimediów.

Zgodny proces transkodowania multimediów

Rysunek 1. Przegląd zgodnego transkodowania multimediów.

Obsługiwane formaty

Zgodna funkcja transkodowania multimediów obsługuje następujące konwersje formatów:

  • HEVC (8-bitowy) na AVC: Konwersja kodeków odbywa się poprzez podłączenie jednego dekodera mediacodec i jednego kodera mediacode.
  • HDR10+ (10-bitowy) do AVC (SDR): Konwersje HDR do SDR są wykonywane przy użyciu instancji mediacodec i wtyczki dostawcy podłączonej do instancji dekodera. Aby uzyskać więcej informacji, zobacz Kodowanie HDR do SDR .

Obsługiwane źródła treści

Zgodna funkcja transkodowania multimediów obsługuje multimedia na urządzeniu generowane przez natywną aplikację aparatu OEM, która jest przechowywana w folderze DCIM/Camera/ na głównym woluminie zewnętrznym. Ta funkcja nie obsługuje multimediów w dodatkowej pamięci masowej. Treści przekazywane na urządzenia za pośrednictwem poczty e-mail lub kart SD nie są obsługiwane.

Aplikacje uzyskują dostęp do plików w oparciu o różne ścieżki plików. Poniżej opisano ścieżki plików, w których transkodowanie jest włączone lub pominięte:

  • Transkodowanie włączone:

    • Dostęp do aplikacji poprzez interfejsy API MediaStore
    • Dostęp do aplikacji poprzez interfejsy API bezpośredniej ścieżki plików, w tym Java i kod natywny
    • Dostęp do aplikacji poprzez platformę dostępu do pamięci masowej (SAF)
    • Dostęp do aplikacji poprzez arkusz udostępniania systemu operacyjnego. Intencje. (Tylko identyfikator URI MediaStore)
    • Przesyłanie plików MTP/PTP z telefonu na komputer
  • Transkodowanie pominięte:

    • Przesyłanie pliku z urządzenia poprzez wysunięcie karty SD
    • Przesyłanie plików z urządzenia na urządzenie za pomocą opcji takich jak Udostępnianie w pobliżu lub transfer Bluetooth.

Dodaj niestandardowe ścieżki plików do transkodowania

Producenci urządzeń mogą opcjonalnie dodać ścieżki plików do transkodowania multimediów w katalogu DCIM/ . Wszelkie ścieżki poza katalogiem DCIM/ są odrzucane. Dodanie takich ścieżek plików może być wymagane ze względu na wymagania operatora lub lokalne przepisy.

Aby dodać ścieżkę pliku, użyj nakładki zasobów wykonawczych ścieżki transkodowania (RRO) , config_supported_transcoding_relative_paths . Poniżej znajduje się przykład dodania ścieżki pliku:

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

Aby zweryfikować skonfigurowane ścieżki plików, użyj:

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

Przegląd architektury

W tej sekcji opisano architekturę funkcji transkodowania multimediów.

architektura transkodowania multimediów

Rysunek 2. Architektura transkodowania multimediów.

Architektura transkodowania multimediów składa się z następujących komponentów:

  • API systemu MediaTranscodingManager: Interfejs umożliwiający klientowi komunikację z usługą MediaTranscoding. Moduł MediaProvider korzysta z tego interfejsu API.
  • MediaTranscodingService: natywna usługa zarządzająca połączeniami klientów, planująca żądania transkodowania i zarządzająca księgowością dla TranscodingSessions .
  • MediaTranscoder: Natywna biblioteka wykonująca transkodowanie. Ta biblioteka jest zbudowana na bazie platformy multimedialnej NDK, aby była kompatybilna z modułami .

Zgodna funkcja transkodowania multimediów rejestruje metryki transkodowania zarówno w usłudze, jak i w transkoderze multimediów. Kody po stronie klienta i usługi znajdują się w module MediaProvider, co pozwala na terminowe naprawianie błędów i aktualizacje.

Dostęp do plików

Transkodowanie zgodnych multimediów opiera się na systemie plików Filesystem in Userspace (FUSE) , który jest używany do przechowywania o ograniczonym zakresie. FUSE umożliwia modułowi MediaProvider sprawdzanie operacji na plikach w przestrzeni użytkownika i blokowanie dostępu do plików w oparciu o politykę zezwalania, odmawiania lub redagowania dostępu.

Gdy aplikacja próbuje uzyskać dostęp do pliku, demon FUSE przechwytuje dostęp aplikacji do odczytu pliku. Jeśli aplikacja obsługuje nowszy format (taki jak HEVC), zwracany jest oryginalny plik. Jeśli aplikacja nie obsługuje tego formatu, plik jest transkodowany do starszego formatu (np. AVC) lub zwracany z pamięci podręcznej, jeśli dostępna jest transkodowana wersja.

Poproś o transkodowane pliki

Funkcja transkodowania zgodnych multimediów jest domyślnie wyłączona, co oznacza, że ​​jeśli urządzenie obsługuje format HEVC, system Android nie transkoduje plików, chyba że zostanie to określone przez aplikację w pliku manifestu lub na liście wymuszania transkodowania .

Aplikacje mogą żądać transkodowanych zasobów, korzystając z następujących opcji:

  • Zadeklaruj nieobsługiwane formaty w pliku manifestu. Aby uzyskać szczegółowe informacje, zobacz Deklarowanie możliwości w zasobie i Deklarowanie możliwości w kodzie .
  • Dodaj aplikacje do listy wymuszania transkodowania zawartej w module MediaProvider . Umożliwia to transkodowanie aplikacji, które nie zaktualizowały swojego pliku manifestu. Gdy aplikacja zaktualizuje swój plik manifestu o nieobsługiwane formaty, należy ją usunąć z listy wymuszania transkodowania. Producenci urządzeń mogą wyznaczyć swoje aplikacje do dodania lub usunięcia z listy wymuszania transkodowania, przesyłając poprawkę lub zgłaszając błąd . Zespół Androida okresowo przegląda tę listę i może usuwać z niej aplikacje.
  • Wyłącz obsługiwane formaty w ramach zgodności aplikacji w czasie wykonywania (użytkownicy mogą również wyłączyć tę opcję dla każdej aplikacji w Ustawieniach).
  • Otwórz plik w MediaStore , określając jednocześnie nieobsługiwane formaty za pomocą interfejsu API openTypedAssetFileDescriptor .

W przypadku transferu USB (urządzenie do komputera) transkodowanie jest domyślnie wyłączone, ale użytkownicy mogą włączyć transkodowanie za pomocą przełącznika Konwertuj filmy na AVC na ekranie ustawień Preferencje USB , jak pokazano na rysunku 3.

Przełącz, aby włączyć transkodowanie multimediów

Rysunek 3. Przełącz, aby włączyć transkodowanie multimediów na ekranie Preferencje USB.

Ograniczenia dotyczące żądań transkodowanych plików

Aby zapobiec blokowaniu zasobów systemowych przez żądania transkodowania na dłuższy czas, aplikacje żądające sesji transkodowania są ograniczone do:

  • 10 kolejnych sesji
  • całkowity czas trwania trzech minut

Jeśli aplikacja przekracza wszystkie te ograniczenia, struktura zwraca oryginalny deskryptor pliku.

Wymagania dotyczące urządzenia

Aby obsługiwać funkcję transkodowania zgodnych multimediów, urządzenia muszą spełniać następujące wymagania:

  • Urządzenie ma domyślnie włączone kodowanie HEVC w natywnej aplikacji aparatu
  • (Urządzenia obsługujące transkodowanie HDR na SDR) Urządzenie obsługuje przechwytywanie wideo HDR

Aby zapewnić wydajność urządzenia w zakresie transkodowania multimediów, należy zoptymalizować wydajność dostępu do odczytu/zapisu sprzętu wideo i pamięci masowej. Gdy kodeki multimedialne są skonfigurowane z priorytetem równym 1 , kodeki muszą działać z najwyższą możliwą przepustowością. Zalecamy, aby wydajność transkodowania osiągnęła minimum 200 fps. Aby przetestować wydajność sprzętu, uruchom test porównawczy transkodera multimediów pod adresem frameworks/av/media/libmediatranscoding/transcoder/benchmark .

Walidacja

Aby sprawdzić zgodną funkcję transkodowania multimediów, uruchom następujące testy CTS:

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

Włącz transkodowanie multimediów na całym świecie

Aby przetestować platformę transkodowania multimediów lub działanie aplikacji podczas transkodowania, możesz globalnie włączyć lub wyłączyć zgodną funkcję transkodowania multimediów. Na stronie Ustawienia > System > Deweloper > Opcje programisty transkodowania multimediów ustaw przełącznik Zastąp ustawienia domyślne transkodowania na włączony , a następnie ustaw przełącznik Włącz transkodowanie na włączony lub wyłączony . Jeśli to ustawienie jest włączone, transkodowanie multimediów może odbywać się w tle w przypadku aplikacji innych niż ta, którą tworzysz.

Sprawdź stan transkodowania

Podczas testowania możesz użyć następującego polecenia powłoki ADB, aby sprawdzić status transkodowania, w tym bieżące i poprzednie sesje transkodowania:

adb shell dumpsys media.transcoding

Rozszerz ograniczenie długości wideo

Do celów testowych możesz przedłużyć jednominutowe ograniczenie długości wideo do transkodowania, używając następującego polecenia. Po uruchomieniu tego polecenia może być konieczne ponowne uruchomienie komputera.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Źródło i odniesienia AOSP

Poniżej znajduje się kod źródłowy AOSP związany z transkodowaniem kompatybilnych multimediów.

Kodowanie HDR do SDR

Aby obsługiwać kodowanie HDR do SDR, producenci urządzeń mogą korzystać z przykładowej wtyczki filtrującej AOSP Codec 2.0 znajdującej się w /platform/frameworks/av/media/codec2/hidl/plugin/ . W tej sekcji opisano, jak działa wtyczka filtrująca, jak ją zaimplementować i jak przetestować wtyczkę.

Jeśli urządzenie nie zawiera wtyczki obsługującej kodowanie HDR do SDR, aplikacja uzyskująca dostęp do wideo HDR otrzymuje oryginalny deskryptor pliku niezależnie od możliwości multimedialnych aplikacji zadeklarowanych w manifeście.

Jak to działa

W tej sekcji opisano ogólne zachowanie wtyczki filtrującej Codec 2.0.

Tło

Android zapewnia implementację warstwy adaptacyjnej pomiędzy interfejsem Codec 2.0 a interfejsem HAL android.hardware.media.c2 pod android::hardware::media::c2 . W przypadku wtyczek filtrów AOSP zawiera mechanizm opakowania, który otacza dekodery razem z wtyczkami filtrów. MediaCodec rozpoznaje te opakowane komponenty jako dekodery z funkcjami filtrowania.

Przegląd

Klasa FilterWrapper pobiera kodeki dostawcy i zwraca opakowane kodeki z powrotem do warstwy adaptacyjnej media.c2 . Klasa FilterWrapper ładuje plik libc2filterplugin.so poprzez interfejs API FilterWrapper::Plugin i rejestruje dostępne filtry z wtyczki. Podczas tworzenia FilterWrapper tworzy instancję wszystkich dostępnych filtrów. Na początku uruchamiane są tylko filtry zmieniające bufor.

Filtruj architekturę wtyczki

Rysunek 1. Architektura wtyczki filtrującej.

Interfejs wtyczki filtrującej

Interfejs FilterPlugin.h definiuje następujące interfejsy API umożliwiające udostępnianie filtrów:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Zwraca obiekt C2ComponentStore zawierający filtry. Różni się to od tego, co ujawnia implementacja Codec 2.0 dostawcy. Zazwyczaj ten magazyn zawiera tylko filtry używane przez klasę FilterWrapper .

  • bool describe(C2String name, Descriptor *desc)

    Opisuje filtry oprócz tego, co jest dostępne w C2ComponentStore . Zdefiniowano następujące opisy:

    • controlParam : Parametry kontrolujące zachowanie filtrów. Na przykład w przypadku mapowania tonów HDR do SDR parametrem kontrolnym jest docelowa funkcja transferu.
    • affectedParams : Parametry, na które mają wpływ operacje filtrowania. Na przykład w przypadku mapowania tonów HDR do SDR parametrami, których to dotyczy, są aspekty kolorów.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Zwraca wartość true , jeśli składnik filtrujący zmienia bufor. Na przykład filtr mapowania tonów zwraca true , jeśli docelową funkcją przesyłania jest SDR, a funkcją przesyłania sygnału wejściowego jest HDR (HLG lub PQ).

Szczegóły FilterWrappera

W tej sekcji opisano szczegóły klasy FilterWrapper .

kreacja

Opakowany komponent tworzy instancję bazowego dekodera i wszystkich zdefiniowanych filtrów podczas tworzenia.

Zapytanie i konfiguracja

Opakowany komponent oddziela przychodzące parametry od zapytań lub żądań konfiguracji zgodnie z opisem filtra. Na przykład konfiguracja parametru sterującego filtrem jest kierowana do odpowiedniego filtra, a parametry z filtrów, których to dotyczy, są obecne w zapytaniach (zamiast odczytywania z dekodera, który ma nienaruszone parametry).

Zapytanie i konfiguracja

Rysunek 2. Zapytanie i konfiguracja.

Początek

Na początku opakowany komponent uruchamia dekoder i wszystkie filtry zmieniające bufory. Jeśli żaden filtr nie jest włączony, opakowany komponent uruchamia dekoder i bufory przekazujące oraz wysyła polecenia do samego dekodera.

Obsługa bufora

Obsługa bufora

Rysunek 3. Obsługa bufora.

Bufory ustawione w kolejce do opakowanego dekodera trafiają do dekodera bazowego. Opakowany komponent pobiera bufor wyjściowy z dekodera poprzez wywołanie zwrotne onWorkDone_nb() , a następnie umieszcza go w kolejce do filtrów. Ostateczny bufor wyjściowy z ostatniego filtra jest raportowany do klienta.

Aby ta obsługa buforów działała, opakowany komponent musi skonfigurować C2PortBlockPoolsTuning do ostatniego filtru, tak aby struktura buforowała dane wyjściowe z oczekiwanej puli bloków.

Zatrzymaj, zresetuj i zwolnij

Po zatrzymaniu opakowany komponent zatrzymuje dekoder i wszystkie włączone filtry, które zostały uruchomione. Podczas resetowania i zwalniania wszystkie komponenty są resetowane lub zwalniane, niezależnie od tego, czy są włączone, czy nie.

Zaimplementuj wtyczkę filtra próbek

Aby włączyć wtyczkę, wykonaj następujące czynności:

  1. Zaimplementuj interfejs FilterPlugin w bibliotece i upuść go na /vendor/lib[64]/libc2filterplugin.so.
  2. W razie potrzeby dodaj dodatkowe uprawnienia do mediacodec.te .
  3. Zaktualizuj warstwę adaptacyjną do Androida 12 i odbuduj usługę media.c2 .

Przetestuj wtyczkę

Aby przetestować przykładową wtyczkę, wykonaj następujące czynności:

  1. Odbuduj i flashuj urządzenie.
  2. Zbuduj przykładową wtyczkę za pomocą następującego polecenia:

    m sample-codec2-filter-plugin
    
  3. Zamontuj ponownie urządzenie i zmień nazwę wtyczki dostawcy, aby została rozpoznana przez usługę kodeka.

    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