Совместимое транскодирование мультимедиа

Функция совместимого транскодирования мультимедиа, представленная в Android 12, позволяет устройствам использовать более современные и экономичные форматы мультимедиа для записи видео, такие как HEVC, сохраняя при этом совместимость с приложениями. Благодаря этой функции производители устройств могут по умолчанию использовать HEVC вместо AVC для улучшения качества видео, одновременно снижая требования к объему памяти и пропускной способности. Для устройств с включенным совместимым транскодированием мультимедиа Android может автоматически конвертировать видео (длиной до одной минуты), записанные в таких форматах, как HEVC или HDR, при открытии видео приложением, не поддерживающим этот формат. Это позволяет приложениям работать даже при записи видео в более новых форматах на устройстве.

Функция совместимого транскодирования мультимедиа по умолчанию отключена. Чтобы запросить транскодирование мультимедиа, приложения должны объявить о своих возможностях работы с мультимедиа. Дополнительную информацию об объявлении возможностей работы с мультимедиа см. в разделе «Совместимое транскодирование мультимедиа» на сайте разработчиков Android.

Как это работает

Функция транскодирования совместимых медиафайлов состоит из двух основных частей:

  • Сервисы транскодирования в медиафреймворке: эти сервисы преобразуют файлы из одного формата в другой с использованием аппаратных средств для обеспечения низкой задержки и высокого качества преобразования. Сюда входят API транскодирования, сервис транскодирования, OEM-плагин для пользовательских фильтров и аппаратные средства. Для получения более подробной информации см. Обзор архитектуры .
  • Функция транскодирования медиафайлов, совместимая с медиапровайдерами: этот компонент, входящий в состав медиапровайдеров, перехватывает приложения, обращающиеся к медиафайлам, и предоставляет либо исходный файл, либо транскодированный файл в зависимости от заявленных возможностей приложения. Если приложение поддерживает формат медиафайла, специальная обработка не требуется. Если приложение не поддерживает формат, фреймворк преобразует файл в более старый формат, например AVC, при обращении приложения к файлу.

На рисунке 1 представлен общий обзор процесса перекодирования медиаконтента.

Совместимый процесс транскодирования медиафайлов

Рисунок 1. Обзор совместимых методов транскодирования мультимедиа.

Поддерживаемые форматы

Функция транскодирования совместимых медиафайлов поддерживает преобразование следующих форматов:

  • Преобразование HEVC (8-бит) в AVC: преобразование кодеков осуществляется путем соединения одного декодера медиакодека и одного кодировщика медиакодека.
  • Преобразование HDR10+ (10-бит) в AVC (SDR): преобразование HDR в SDR выполняется с использованием экземпляров медиакодеков и плагина поставщика, подключающегося к экземплярам декодера. Для получения дополнительной информации см. раздел «Кодирование HDR в SDR» .

Поддерживаемые источники контента

Функция транскодирования мультимедиа поддерживает воспроизведение медиафайлов, созданных собственным приложением камеры производителя и хранящихся в папке DCIM/Camera/ на основном внешнем томе. Эта функция не поддерживает воспроизведение медиафайлов на вторичном носителе. Контент, передаваемый на устройства по электронной почте или через SD-карты, не поддерживается.

Приложения обращаются к файлам по различным путям. Ниже описаны пути к файлам, по которым включено или отключено транскодирование:

  • Транскодирование включено:

    • Доступ к приложению через API MediaStore
    • Доступ к приложениям осуществляется через API с прямым указанием пути к файлам, включая Java и нативный код.
    • Доступ к приложению осуществляется через структуру доступа к хранилищу (SAF).
    • Доступ к приложению осуществляется через Intents в меню общего доступа операционной системы. (Только URI MediaStore)
    • Передача файлов по протоколам MTP/PTP с телефона на компьютер.
  • Транскодирование обойдено:

    • Передача файла с устройства путем извлечения SD-карты.
    • Передача файлов с одного устройства на другое с использованием таких опций, как Nearby Share или передача по Bluetooth.

Добавьте пользовательские пути к файлам для транскодирования.

Производители устройств могут по желанию добавлять пути к файлам для транскодирования мультимедиа в каталог DCIM/ . Любые пути за пределами каталога DCIM/ отклоняются. Добавление таких путей может потребоваться для соответствия требованиям операторов связи или местным нормативным актам.

Чтобы добавить путь к файлу, используйте наложение ресурсов среды выполнения (RRO) для пути к транскодированию, config_supported_transcoding_relative_paths . Ниже приведен пример добавления пути к файлу:

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

Для проверки указанных путей к файлам используйте:

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

Обзор архитектуры

В этом разделе описывается архитектура функции транскодирования медиафайлов.

архитектура транскодирования медиа

Рисунок 2. Архитектура транскодирования медиафайлов.

Архитектура транскодирования медиаконтента состоит из следующих компонентов:

  • API системы MediaTranscodingManager: интерфейс, позволяющий клиенту взаимодействовать со службой MediaTranscoding. Модуль MediaProvider использует этот API.
  • MediaTranscodingService: Встроенный сервис, который управляет подключениями клиентов, планирует запросы на транскодирование и ведет учет сеансов TranscodingSessions .
  • MediaTranscoder: Нативная библиотека для выполнения транскодирования. Эта библиотека построена на основе медиафреймворка NDK и совместима с модулями .

Функция транскодирования совместимых медиафайлов регистрирует метрики транскодирования как в сервисе, так и в самом транскодере. Код на стороне клиента и сервиса находится в модуле MediaProvider, что позволяет своевременно исправлять ошибки и выпускать обновления.

доступ к файлам

Совместимое транскодирование медиафайлов основано на файловой системе FUSE (Filesystem in Userspace) , которая используется для хранения данных в ограниченной области. FUSE позволяет модулю MediaProvider анализировать файловые операции в пользовательском пространстве и ограничивать доступ к файлам на основе политики, разрешая, запрещая или скрывая доступ.

Когда приложение пытается получить доступ к файлу, демон FUSE перехватывает попытку чтения файла из приложения. Если приложение поддерживает более новый формат (например, HEVC), возвращается исходный файл. Если приложение не поддерживает этот формат, файл перекодируется в более старый формат (например, AVC) или возвращается из кэша, если доступна перекодированная версия.

Запрос на преобразованные файлы

Функция транскодирования совместимых медиафайлов по умолчанию отключена. Приложения могут запрашивать транскодированные ресурсы, используя следующие параметры:

При передаче данных через USB (с устройства на ПК) транскодирование по умолчанию отключено, но пользователи могут включить его, используя переключатель « Преобразовать видео в AVC» на экране настроек USB, как показано на рисунке 3.

Переключите эту кнопку, чтобы включить транскодирование мультимедиа.

Рисунок 3. Переключатель для включения транскодирования мультимедиа на экране настроек USB.

Ограничения на запрос файлов, подвергнутых транскодированию.

Чтобы предотвратить блокировку системных ресурсов запросами на транскодирование на длительное время, приложения, запрашивающие сеансы транскодирования, ограничиваются следующими:

  • 10 последовательных сессий
  • общая продолжительность звучания — три минуты.

Если приложение превышает все эти ограничения, платформа возвращает исходный дескриптор файла.

Требования к устройству

Для поддержки функции транскодирования мультимедиа устройства должны соответствовать следующим требованиям:

  • Встроенное приложение камеры устройства по умолчанию поддерживает кодирование HEVC.
  • (Устройства, поддерживающие преобразование HDR в SDR) Устройство поддерживает захват HDR-видео

Для обеспечения высокой производительности устройства при транскодировании мультимедиа необходимо оптимизировать аппаратную производительность видео и скорость чтения/записи данных на носителе. При настройке медиакодеков с приоритетом, равным 1 , кодеки должны работать с максимально возможной пропускной способностью. Мы рекомендуем, чтобы производительность транскодирования достигала минимум 200 кадров в секунду. Для проверки производительности вашего оборудования запустите тест производительности медиатранскодера по адресу frameworks/av/media/libmediatranscoding/transcoder/benchmark .

Валидация

Для проверки совместимости функции транскодирования мультимедиа выполните следующие тесты CTS:

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

Включить транскодирование медиафайлов глобально

Чтобы протестировать работу фреймворка транскодирования мультимедиа или поведение приложения с транскодированием, вы можете включить или отключить совместимую функцию транскодирования мультимедиа глобально. На странице «Параметры разработчика» > «Система» > «Разработчик» > «Параметры разработчика для транскодирования мультимедиа» установите переключатель «Переопределить параметры транскодирования по умолчанию» в положение « вкл.» , а затем переключатель «Включить транскодирование» в положение «вкл .» или «выкл.» . Если этот параметр включен, транскодирование мультимедиа может происходить в фоновом режиме для приложений, отличных от того, которое вы разрабатываете.

Проверить статус транскодирования

Во время тестирования вы можете использовать следующую команду оболочки ADB для проверки состояния транскодирования, включая текущие и прошлые сеансы транскодирования:

adb shell dumpsys media.transcoding

Увеличить ограничение на продолжительность видео.

Для целей тестирования вы можете увеличить ограничение на продолжительность видео в одну минуту для транскодирования, используя следующую команду. После выполнения этой команды может потребоваться перезагрузка.

adb shell device_config put storage_native_boot transcode_max_duration_ms <LARGE_NUMBER_IN_MS>

Исходный код и ссылки AOSP

Ниже представлен исходный код AOSP, относящийся к совместимому транскодированию медиаконтента.

кодирование HDR в SDR

Для поддержки кодирования HDR в SDR производители устройств могут использовать пример плагина фильтра Codec 2.0 из библиотеки AOSP, расположенный в /platform/frameworks/av/media/codec2/hidl/plugin/ . В этом разделе описывается принцип работы плагина фильтра, его реализация и тестирование.

Если устройство не содержит плагина, поддерживающего кодирование HDR в SDR, приложение, обращающееся к HDR-видео, получает исходный дескриптор файла независимо от возможностей приложения по работе с мультимедиа, указанных в манифесте.

Как это работает

В этом разделе описывается общее поведение плагина фильтра Codec 2.0.

Фон

Android предоставляет промежуточный слой адаптации между интерфейсом Codec 2.0 и интерфейсом HAL android.hardware.media.c2 по адресу android::hardware::media::c2 . Для плагинов фильтров AOSP включает механизм обертки, который объединяет декодеры с плагинами фильтров. MediaCodec распознает эти обернутые компоненты как декодеры с функциями фильтрации.

Обзор

Класс FilterWrapper принимает кодеки от поставщиков и возвращает обернутые кодеки обратно в слой адаптации media.c2 . Класс FilterWrapper загружает libc2filterplugin.so через API FilterWrapper::Plugin и записывает доступные фильтры из плагина. При создании FilterWrapper инициализирует все доступные фильтры. При запуске запускаются только те фильтры, которые изменяют буфер.

Архитектура плагина фильтра

Рисунок 4. Архитектура плагина фильтра.

интерфейс плагина фильтра

Интерфейс FilterPlugin.h определяет следующие API для предоставления доступа к фильтрам:

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Возвращает объект C2ComponentStore , содержащий фильтры. Это отдельный объект, не связанный с тем, что предоставляет реализация Codec 2.0 от поставщика. Как правило, это хранилище содержит только фильтры, используемые классом FilterWrapper .

  • bool describe(C2String name, Descriptor *desc)

    Описывает фильтры в дополнение к тем, что доступны в C2ComponentStore . Определены следующие описания:

    • controlParam : Параметры, управляющие поведением фильтров. Например, для тонального преобразователя HDR в SDR параметром управления является целевая передаточная функция.
    • affectedParams : Параметры, на которые влияют операции фильтрации. Например, для преобразования HDR в SDR, на параметры, на которые влияют цветовые характеристики.
  • bool isFilteringEnabled(const std::shared_ptr<C2ComponentInterface> &intf)

    Возвращает true если компонент фильтра изменяет буфер. Например, фильтр тонального отображения возвращает true если целевая передаточная функция — SDR, а входная — HDR (HLG или PQ).

Подробности обертки фильтра

В этом разделе подробно описывается класс FilterWrapper .

Творение

Обернутый компонент при создании создает экземпляр базового декодера и всех определенных фильтров.

Запрос и конфигурация

Обернутый компонент отделяет входящие параметры от запросов или запросов на настройку в соответствии с описанием фильтра. Например, настройка параметра управления фильтром направляется соответствующему фильтру, а затронутые параметры из фильтров присутствуют в запросах (вместо чтения из декодера, который имеет незатронутые параметры).

Запрос и конфигурация

Рисунок 5. Запрос и конфигурация.

Начинать

При запуске обернутый компонент запускает декодер и все фильтры, изменяющие буферы. Если ни один фильтр не включен, обернутый компонент запускает декодер и сквозную передачу буферов, а также отправляет команды самому декодеру.

Обработка буфера

Обработка буфера

Рисунок 6. Обработка буфера.

Буферы, поставленные в очередь для обернутого декодера, передаются базовому декодеру. Обернутый компонент получает выходной буфер от декодера через функцию обратного вызова onWorkDone_nb() и затем ставит его в очередь для фильтров. Окончательный выходной буфер от последнего фильтра передается клиенту.

Для корректной работы этой обработки буферов обернутый компонент должен настроить C2PortBlockPoolsTuning на последний фильтр, чтобы фреймворк выводил буферы из ожидаемого пула блоков.

Остановить, перезагрузить и отпустить

При остановке обернутый компонент останавливает декодер и все запущенные включенные фильтры. При сбросе и освобождении все компоненты сбрасываются или освобождаются независимо от того, включены они или нет.

Реализуйте плагин фильтра для выборок.

Чтобы включить плагин, выполните следующие действия:

  1. Реализуйте интерфейс FilterPlugin в библиотеке и поместите её в /vendor/lib[64]/libc2filterplugin.so.
  2. При необходимости добавьте дополнительные разрешения к mediacodec.te .
  3. Обновите слой адаптации до Android 12 и пересоберите службу media.c2 .

Протестируйте плагин

Для тестирования тестового плагина выполните следующие действия:

  1. Пересоберите и прошейте устройство.
  2. Соберите пример плагина, используя следующую команду:

    m sample-codec2-filter-plugin
    
  3. Переподключите устройство и переименуйте плагин поставщика так, чтобы он распознавался службой кодеков.

    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