Поддержка аппаратного ускорения кодирования видео Hantro H1 в версии mainline Linux

С ростом потребности в кодировании видео появились некоторые прорывные разработки в области кодирования видео с аппаратным ускорением для Linux. Bootlin работает над реализацией кодирования видео с аппаратным ускорением Hantro H1 для поддержки кодирования H.264 в Linux, что следует за работой компании над ранее выпущенным драйвером VPU с открытым исходным кодом для процессоров Allwinner.

Оборудование Hantro H1

Hantro H1 – это обычный аппаратный кодировщик H.264, он также может обрабатывать VP8 и JPEG. Он находится в нескольких процессорах ARM, включая множество Rockchip (RK3288RK3328RK3399PX30RK1808) и NXP (i.MX 8M Mini). В зависимости от версии он может поддерживать до 1080p при 30 или 60 кадрах в секунду.

Здесь мы видим разные блоки, используемые для кодирования. Hantro H1 – это аппаратная реализация без сохранения состояния, что означает, что в нем не работает микроконтроллер или прошивка. Как видно на диаграмме, у него есть препроцессор, который может делать такие вещи, как обрезка, вращение, масштабирование, стабилизация и CSC. Он будет производить NALU среза, что означает отсутствие метаданных. Также существуют некоторые ограничения на определенные параметры. Он поддерживает только срезы I и P (без B-срезов) для встроенного кодирования. Он будет брать ссылки из P-фрагментов, которые необходимо сохранить в определенных буферах реконструкции. Hantro H1 также имеет внутренние механизмы контроля скорости.

Семантика H.264


Некоторые из приведенных выше аббревиатур могут потребовать пояснений. H.264 имеет семантику и специфические блоки, которые называются блоками уровня абстракции сети (NALU). Каждый из них имеет заголовок данных с определенным типом, который указывает данные внутри каждого блока. Например, в NALU есть метаданные, такие как набор параметров последовательности (SPS). Итак, это метаданные для всей последовательности.

По сути, метаданные – это просто последовательность битов, которые необходимо понимать в соответствии с синтаксисом H.264. Точно так же для каждого изображения существует набор параметров изображения (PPS). Это для метаданных, аналогично для кодированных данных мы закодировали данные среза. Существует специальный формат, называемый Annex-B, в котором префикс ставится перед началом каждого NALU. Это упрощает поиск начала следующего.

Макроблоки – это подразделения изображений на блоки размером 16 × 16 пикселей. Они сгруппированы как фрагменты. Таким образом, в основном кодированная информация в данных кодированных срезов в NALU будет состоять из данных вокруг макроблоков.

Кодирование без сохранения состояния V4L2

Для Hantro H1 можно установить множество параметров, управляющих кодировкой. Некоторым из них необходимо установить конкретное значение, чтобы битовый поток был действительным. В случае без сохранения состояния состояние отслеживается драйвером V4L2 и кодом пользовательского пространства. Bootlin использует API медиа-запросов, как и при декодировании без сохранения состояния, для связывания буферов и параметров. О буферах реконструкции также нужно позаботиться, так как они должны быть присоединены к входным буферам. Текущее управление скоростью в случаях без сохранения состояния может быть реализовано драйвером V4L2 и пользовательским пространством, которое будет считывать данные обратной связи самостоятельно.

Уже существует некий код Hantro H1, например, в Chromium OS он используется с нисходящим драйвером ядра, который практически не имеет состояния. Также существует реализация пользовательского пространства, которая доступна как реализация libv412plugins. Кроме того, Rockchip имеет собственную реализацию собственного нисходящего ядра, которое называется MPP и поддерживает Hantro H1.

Итак, подход, который был использован для поддержки этого кодировщика, заключался в использовании основного драйвера hantro, который поддерживает декодирование с помощью Hantro G1. Затем Bootlin добавил в драйвер поддержку кодировки H.264 Hantro H1. Реализация ядра вместе со стороной пользовательского пространства доступна на GitHub.

Планы на будущее?

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

Источник: все изображения были взяты из презентации Bootlin’s Embedded Linux Engineer, слайдов презентации Пола Коциалковски с

Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments