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

Совместимое перекодирование мультимедиа, представленное в 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)
    • Доступ к приложению через общий доступ к ОС. (только 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, что обеспечивает своевременное исправление ошибок и обновление.

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

Перекодирование совместимого мультимедиа построено на основе файловой системы «Файловая система в пользовательском пространстве» (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 производители устройств могут использовать образец плагина фильтра 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 создает экземпляры всех доступных фильтров. При запуске запускаются только фильтры, изменяющие буфер.

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

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

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

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

  • std::shared_ptr<C2ComponentStore>getComponentStore()

    Возвращает объект C2ComponentStore , содержащий фильтры. Это отличается от того, что предоставляет реализация кодека 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 в библиотеке и поместите его в /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