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

Совместимое транскодирование мультимедиа, представленное в 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 .

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

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

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

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

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

    • Передача файла с устройства путем извлечения SD-карты
    • Передача файлов с устройства на устройство с помощью таких функций, как «Обмен с окружением» или «Передача по 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, чтобы обеспечить своевременное исправление ошибок и обновление.

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

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

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

Запросить перекодированные файлы

Функция совместимого перекодирования мультимедиа отключена по умолчанию. Это означает, что если устройство поддерживает HEVC, Android не перекодирует файлы, если это не указано приложением в файле манифеста или в списке принудительного перекодирования .

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

  • Объявите неподдерживаемые форматы в файле манифеста. Дополнительные сведения см. в разделах Объявление возможностей в ресурсе и Объявление возможностей в коде .
  • Добавьте приложения в список принудительного перекодирования , включенный в модуль MediaProvider . Это позволяет перекодировать приложения, которые не обновили свой файл манифеста. Как только приложение обновляет свой файл манифеста неподдерживаемыми форматами, оно должно быть удалено из списка принудительного перекодирования. Производители устройств могут назначить свои приложения для добавления или удаления из списка принудительного перекодирования, отправив исправление или сообщив об ошибке . Команда Android периодически просматривает список и может удалять приложения из списка.
  • Отключите поддерживаемые форматы с помощью платформы совместимости приложений во время выполнения (пользователи также могут отключить это для каждого приложения в настройках).
  • Откройте файл в MediaStore , явно указав неподдерживаемые форматы с помощью API openTypedAssetFileDescriptor .

Для передачи через 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 производители устройств могут использовать подключаемый модуль фильтра AOSP Sample Codec 2.0, расположенный в /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 создает экземпляры всех доступных фильтров. При запуске запускаются только фильтры, которые изменяют буфер.

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

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

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

Интерфейс 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

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

Творчество

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

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

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

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

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

Начинать

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

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

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

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

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

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

Остановить, сбросить и отпустить

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

Реализовать подключаемый модуль фильтра образцов

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

  1. FilterPlugin интерфейс 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