Поддержка аппаратных блоков в GStreamer

GStreamer поддерживает следующие аппаратные блоки MCom-03R:

  • VPU Mali-V61 (Video Processing Unit, видеопроцессор);

  • ISP Felix v2505 (Image Signal Processor, процессор обработки изображений);

  • GPU PowerVR Graphics Series8XE (Graphics Processing Unit, графический ускоритель).

Свойства элементов

Просмотреть все доступные свойства элементов GStreamer можно командой:

gst-inspect-1.0 <element>

Например:

gst-inspect-1.0 omxh264enc

Установка свойства для элемента при использовании gst-launch-1.0 осуществляется различными способами в зависимости от типа свойства.

Для типов gint, guint и Enum:

... ! omxh264enc property=1 ! ...

Для целочисленных массивов (массивы GstValueArray типов gint и guint):

... ! omxh264enc property='<1,2,3>' ! ...

VPU Mali-V61

Обзор поддержки

Кодирование и декодирование видео и изображений с использованием VPU поддерживается плагином gst-omx для пакета GStreamer. Организация gst-omx такова, что через gst-inspect-1.0 могут быть выведены свойства, которые не поддерживаются реализацией OpenMAX на базе VPU в MCom-03R. Перечень поддерживаемых элементов плагина и их свойств приведён в данном разделе.

Таблица 1 Элементы GStreamer, поддерживаемые плагином gst-omx

Элемент

Назначение

omxh264dec

Декодирование видео, сжатого кодеком H.264

omxh264enc

Кодирование видео с использованием кодека H.264

omxh265dec

Декодирование видео, сжатого кодеком H.265 (HEVC)

omxh265enc

Кодирование видео с использованием кодека H.265 (HEVC)

omxmjpegdec

Декодирование видео в формате MJPEG и изображений в формате JPEG

omxmjpegenc

Кодирование видео в формате MJPEG и изображений в формате JPEG

Общие свойства кодирующих элементов

dmabuf-fd-list — список файловых дескрипторов DMA-буферов

Тип:

GstValueArray of GValues of type "gint"

Дополнительно:

При передаче DMA-буферов через свойства элемента обязательна одновременная установка свойств dmabuf-fd-list и dmabuf-size.


dmabuf-size — размер DMA-буферов

Тип:

guint

Значение по умолчанию:

0

Возможные значения:

0 - 4294967295

Дополнительно:

При передаче DMA-буферов через свойства элемента обязательна одновременная установка свойств dmabuf-fd-list и dmabuf-size.


mirroring — отражение входных кадров

Тип:

Enum GstOMXVideoEncMirroring

Значение по умолчанию:

0

Возможные значения:
  • (0): none — выключить

  • (1): vertical — вертикальное отражение

  • (2): horizontal — горизонтальное отражение

  • (3): both — вертикальное и горизонтальное отражение


rotation — поворот входных кадров

Тип:

guint

Значение по умолчанию:

0

Возможные значения:

0, 90, 180, 270

Дополнительно:

Значение в градусах.

Свойства элементов omxh264enc и omxh265enc

b-frames — количество B-кадров перед каждым P-кадром

Тип:

guint

Значение по умолчанию:

4294967295

Возможные значения:

0 - 4294967295

Дополнительно:

Для MCom-03R допустимые значения 0-4 и 4294967295 (эквивалентно 0). Установка других значений приводит к зависанию конвейера. При использовании свойства GOP принимает следующий вид:

\[\left \langle I, \left \langle B_{1}, ...,B_{i}, P_{1} \right \rangle , ..., \left \langle B_{1}, ...,B_{i}, P_{k} \right \rangle \right \rangle\]

Размер GOP вычисляется по формуле:

\[k \times (i + 1) + 1\]

Обозначения: \(I\) — IDR, \(B_{1}, ..., B_{i}\) — B-кадры, \(i\) — значение свойства b-frames, \(P_{1}, ..., P_{k}\) — P-кадры, \(k\) — значение свойства interval-intraframes.


contol-rate — метод контроля битрейта

Тип:

Enum GstOMXVideoEncControlRate

Значение по умолчанию:

-1

Возможные значения:
  • (0): disable — выключить, QP константен и устанавливается вручную

  • (2): constant — постоянный битрейт (CBR), QP изменяется автоматически, размер сжатых кадров константен

  • (-1): default — значение по умолчанию для компонента

Дополнительно:

Для MCom-03R при установке значения по умолчанию control-rate=-1 контроль битрейта отключается (аналогично control-rate=0).


interval-intraframes — количество P-кадров между двумя последовательными I-кадрами

Тип:

guint

Значение по умолчанию:

4294967295

Возможные значения:

0 - 4294967295

Дополнительно:

Для MCom-03R значение компонента по умолчанию (4294967295) эквивалентно 29. При использовании B-кадров GOP рассчитывается по специальной формуле (см. описание свойства b-frames).


quant-b-frames — QP для B-кадров

Тип:

guint

Значение по умолчанию:

4294967295

Возможные значения:

0 - 4294967295

Дополнительно:

Для MCom-03R значение компонента по умолчанию (4294967295) эквивалентно 27.


quant-i-frames — QP для I-кадров

Тип:

guint

Значение по умолчанию:

4294967295

Возможные значения:

0 - 4294967295

Дополнительно:

Для MCom-03R значение компонента по умолчанию (4294967295) эквивалентно 27.


quant-p-frames — QP для P-кадров

Тип:

guint

Значение по умолчанию:

4294967295

Возможные значения:

0 - 4294967295

Дополнительно:

Для MCom-03R значение компонента по умолчанию (4294967295) эквивалентно 27.


target-bitrate — целевой битрейт

Тип:

guint

Значение по умолчанию:

4294967295

Возможные значения:

0 - 4294967295

Дополнительно:

Для MCom-03R значение компонента по умолчанию (4294967295) эквивалентно 64000. Значение в бит/с.


max-qp — максимальное значение QP для режима постоянного битрейта (CBR)

Тип:

guint

Значение по умолчанию:

255

Возможные значения:

0 - 255

Дополнительно:

Позволяет установить минимально допустимое качество.


min-qp — минимальное значение QP для режима постоянного битрейта (CBR)

Тип:

guint

Значение по умолчанию:

0

Возможные значения:

0 - 255

Дополнительно:

Позволяет установить максимально допустимое качество.

Свойства элемента omxh264enc

sps-id — идентификатор SPS блока

Тип:

guint

Значение по умолчанию:

1

Возможные значения:

0 - 31

Дополнительно:

Переопределяются идентификаторы SPS блоков и ссылки из PPS блоков. Установка идентификатора может потребоваться для соответствия ограничениям при трансляции видеопотока по сети.

Свойства элемента omxmjpegenc

qfactor — качество сжатия кадров

Тип:

guint

Значение по умолчанию:

0

Возможные значения:

0 - 100

Дополнительно:

1 - низкое качество, маленький размер; 100 - высокое качество, большой размер. Для MCom-03R значение компонента по умолчанию (0) эквивалентно 75.

DMA-буферы

Для ускорения обработки видео в конвейерах GStreamer могут быть использованы DMA-буферы (экспортируются модулем dmabuf_exporter). DMA-буферы поддерживают следующие элементы gst-omx:

  • omxh264enc;

  • omxh265enc;

  • omxmjpegenc.

Для этого вышестоящий (upstream) элемент конвейера должен отправить запрос типа GST_QUERY_CUSTOM, содержащий структуру dmabuf_query. Содержимое структуры описано в таблице.

Таблица 2 Содержимое структуры dmabuf_query

Имя поля

Тип поля

Описание

fd_list

GValue

Массив GstValueArray значений GValue, каждый из которых содержит gint с дескриптором DMA-буфера

buffer_size

guint

Размер одного DMA-буфера в байтах

При получении и успешной обработке запроса элементом gst-omx будут импортированы DMA-буферы и функция gst_pad_peer_query() вернёт TRUE. В противном случае функция вернёт FALSE и элемент gst-omx самостоятельно выделит буферы для копирования данных.

Альтернативный способ передачи DMA-буферов кодирующим элементам — использование свойств dmabuf-fd-list и dmabuf-size.

Примеры запуска

Кодирование H.264 видео:

gst-launch-1.0 filesrc location=/tmp/input.yuv blocksize=3110400 ! \
  video/x-raw,format=I420,width=1920,height=1080,framerate=25/1 ! queue ! omxh264enc ! \
  filesink location=/tmp/output.h264

Декодирование H.264 видео:

gst-launch-1.0 filesrc location=/tmp/input.h264 ! h264parse ! omxh264dec ! \
  filesink location=/tmp/output.yuv

Транскодирование из H.264 в MJPEG:

gst-launch-1.0 filesrc location=/tmp/input.h264 ! h264parse ! omxh264dec ! omxmjpegenc ! \
  filesink location=/tmp/output.mjpeg

Транскодирование видео H.265 (HEVC):

gst-launch-1.0 filesrc location=/tmp/input.h265 ! h265parse ! omxh265dec ! omxh265enc ! \
  filesink location=/tmp/output.h265

Декодирование MJPEG:

gst-launch-1.0 filesrc location=/tmp/input.mjpeg ! jpegparse ! omxmjpegdec ! \
  filesink location=/tmp/output.yuv

ISP Felix v2505

В MCom-03R входные данные для блока ISP поступают с MIPI/Parallel-видеосенсоров, преобразуются в RAW-изображение в формате Байера и затем поступают в конвейер обработки данных.

Конвейер ISP позволяет обрабатывать:

  • один или два источника видео;

  • один или два источника контекста, обрабатываемых конвейером в режиме разделения времени;

  • кроппинг в начале конвейера обработки, параметры обрезки независимы для контекстов;

  • дробное масштабирование в конце конвейера обработки в форматах YCbCr (например, для кодирования) и RGB (например, для вывода на дисплей).

Обзор поддержки

Захват и обработка видео с сенсора изображения с использованием ISP поддерживается плагином gst-felix для пакета GStreamer. Перечень поддерживаемых элементов плагина приведён в таблице.

Таблица 3 Элементы GStreamer, поддерживаемые плагином gst-felix

Элемент

Назначение

felixsrc

Захват видео с видеосенсора, один источник

felixmultisrc

Захват видео с видеосенсора, несколько источников

DMA-буферы

Элементы gst-felix используют DMA-буферы (выделяют с помощью модуля dmabuf_exporter), если задана опция -use_dmabuf. Для поддержки элементов gst-omx, элементы gst-felix возвращают информацию о DMA-буферах в структуре dmabuf_query.

Свойства

Для вывода свойств элементов Таблица 3 использовать gst-inspect-1.0, например, для просмотра свойств felixsrc:

gst-inspect-1.0 felixsrc

GStreamer-элемент felixmultisrc

Элемент предоставляет несколько источников (GStreamer source) с различными параметрами с одного видеосенсора, изменение разрешения и формата выполняется аппаратно на ISP. Элемент имеет свойства и сигналы подобные felixsrc. Одновременно поддерживается до 4 различных видео форматов: максимум 2 формата могут быть из классов Bayer и RGB, и максимум 2 формата - из класса YUV.

Большинство свойств элемента являются общими для всех контекстов.

Координаты окна автоэкспозиции в свойствах exposure-auto-bottom, exposure-auto-top, exposure-auto-left, exposure-auto-right устанавливаются относительно границ основного контекста (основной контекст определяется свойством context).

Для каждого источника могут быть установлены индивидуальные значения свойств buf-mode и context. Свойство context дополнительно может принимать значение -1 (по умолчанию), означающее, что контекст выбирается автоматически. Свойство current-context возвращает номер текущего контекста для источника. Каждый источник имеет независимые свойства dmabuf-fd-list, dmabuf-size, bounds-x, bounds-y, bounds-width, bounds-height.

Утилита gst-rtsp-multi-launch

Утилита gst-rtsp-multi-launch позволяет запустить RTSP-стрим с несколькими потоками. Для элементов felix*src поддерживается печать измеренной коррелированной цветовой температуры и значения фокуса. Для просмотра всех доступных параметров используйте команду:

gst-rtsp-multi-launch --help

Совместимые модули сенсоров

Список видеомодулей, поддерживаемых ISP Felix:

Примечание

Сравнение возможностей сенсоров и модулей камеры RPi перечислено на странице Raspberry Pi Camera: Comparison of High Quality Camera with Camera Module V2.

В зависимости от используемой платы-носителя максимальный видеорежим сенсоров может быть ограничен. Описание разъемов подключения сенсоров на поддерживаемых платах-носителях содержится в таблице Расположение разъемов подключения сенсоров на платах-носителях.

Таблица 4 Расположение разъемов подключения сенсоров на платах-носителях

Модуль

CSI0

CSI1

ELV-SMARC-CB r3.3.0

XS12 22-pin 2 лейна

XS13 22-pin 4 лейна

Конфигурационные файлы поддержки модулей находятся в директории /etc/felix на файловой системе устройства.

Примеры запуска

Общий вид команды запуска захвата видео с выводом на дисплей:

gst-launch-1.0 felixsrc setup-file=<setup-file> sensor=<sensor> sensor-mode=<sensor-mode> \
  exposure-auto=true awb-enable=true awb-algorithm=pid awb-mode=high-lum ! \
  queue max-size-buffers=1 ! video/x-raw,format=BGRx ! kmssink driver-name=mali-dp

Общий вид команды запуска потоковой передачи видео по протоколу RTSP:

gst-rtsp-test-launch "felixsrc setup-file=<setup-file> sensor=<sensor> sensor-mode=<sensor-mode> \
  alloc-buffers=10 buf-mode=query exposure-auto=true awb-enable=true awb-algorithm=pid \
  awb-mode=high-lum ! queue max-size-buffers=1 ! video/x-raw,format=NV12 ! \
  omxh264enc control-rate=constant target-bitrate=10000000 ! rtph264pay name=pay0 pt=96"

Примечание

Параметр sensor-mode должен соответствовать разрешению устройства видеовывода. Для вывода доступных режимов устройства видеовывода можно воспользоваться командой modetest -M mali-dp -c.

Для принудительного масштабирования захватываемого видео под устройство видеовывода можно задать разрешение видеопотока для вывода, например: video/x-raw,format=BGRx,width=1920,height=1080.

Для корректного проигрывания RAW-видео при записи в файл рекомендуется использовать размер картинки кратный 64, например, 640х320.

Для вывода доступных модулей сенсоров и их режимов sensor-mode можно воспользоваться утилитой felix-sensor-test.

Перечень возможных значений параметров setup-file и sensor в зависимости от используемого сенсора приведён в таблице:

Таблица 5 Значения параметров setup-file и sensor GStreamer-элемента felixsrc

Сенсоры

Параметр setup-file

Параметр sensor

RPi Camera (B)

/etc/felix/ov5647/ov5647-arducam.cfg

OV5647_0, OV5647_1

Arducam 5MP OV5647 Camera Module

/etc/felix/ov5647/ov5647-arducam.cfg

OV5647_0, OV5647_1

Raspberry Pi camera module V2

/etc/felix/imx219/imx219.cfg

IMX219_0, IMX219_1

Arducam 12MP IMX477 UC-517

/etc/felix/imx477/imx477.cfg

IMX477_0, IMX477_1

Vision Components VC MIPI IMX335

/etc/felix/imx335/imx335.cfg

IMX335

Примечание

Если в параметре sensor отсутствует номер интерфейса, то конфигурация применима только к интерфейсу CSI0.

Примеры запуска для плат с модулем ELV-MC03-SMARC r3.0.0

Потоковая передача видео по протоколу RTSP с Arducam 12MP IMX477 UC-517 на модуле ELV-SMARC-CB r3.3.0 с подключенным видеосенсором к разъему CSI1 с разрешением 1920x1080@30:

gst-rtsp-test-launch "felixsrc setup-file=/etc/felix/imx477/imx477.cfg sensor=IMX477_1 \
  sensor-mode=5 alloc-buffers=10 buf-mode=query exposure-auto=true awb-enable=true \
  awb-algorithm=pid awb-mode=high-lum ! queue max-size-buffers=1 ! video/x-raw,format=NV12 ! \
  omxh264enc control-rate=constant target-bitrate=10000000 ! rtph264pay name=pay0 pt=96"

При вызове команды gst-rtsp-test-launch в консоль модуля будет выведено сообщение:

stream ready at rtsp://127.0.0.1:8554/test

Для приёма и вывода видео на ПК запустить ffplay (camera-address — IP-адрес модуля):

ffplay rtsp://<camera-address>:8554/test

Потоковая передача 4-х потоков видео с разрешениями 1920x1080, 1280x720, 640x480 и 320x240 по протоколу RTSP с видеомодуля Raspberry Pi camera module V2 на модуле ELV-SMARC-CB r3.3.0, подключенного к разъему CSI0:

gst-rtsp-multi-launch \
  -s 'felixmultisrc name=multi setup-file=/etc/felix/imx219/imx219.cfg
  sensor=IMX219_0 sensor-mode=2 alloc-buffers=20
  ! video/x-raw,format=NV12,width=1920,height=1080
  ! interpipesink name=src0
  multi.
  ! video/x-raw,format=NV12,width=1280,height=720
  ! interpipesink name=src1
  multi.
  ! video/x-raw,format=BGR,width=640,height=480
  ! interpipesink name=src2
  multi.
  ! video/x-raw,format=BGR,width=320,height=240
  ! interpipesink name=src3' \
  -k '{
    "/stream0":
      "interpipesrc stream-sync=restart-ts is-live=true listen-to=src0
      ! queue
      ! omxh264enc control-rate=constant target-bitrate=6000000
      ! rtph264pay name=pay0",
    "/stream1":
      "interpipesrc stream-sync=restart-ts is-live=true listen-to=src1
      ! queue
      ! omxh264enc control-rate=constant target-bitrate=3000000
      ! rtph264pay name=pay0",
    "/stream2":
      "interpipesrc stream-sync=restart-ts is-live=true listen-to=src2
      ! queue
      ! videoconvert ! video/x-raw,format=NV12
      ! omxh264enc control-rate=constant target-bitrate=3000000
      ! rtph264pay name=pay0",
    "/stream3":
      "interpipesrc stream-sync=restart-ts is-live=true listen-to=src3
      ! queue
      ! videoconvert ! video/x-raw,format=NV12
      ! omxh264enc control-rate=constant target-bitrate=1000000
      ! rtph264pay name=pay0"
    }' \
  -p 8554

При вызове утилиты gst-rtsp-multi-launch в консоль выводятся адреса RTSP-потоков для источников stream0, stream1, stream2, stream3. Для приёма и вывода видео на ПК можно воспользоваться утилитой ffplay аналогично примерам выше.

GPU PowerVR Graphics Series8XE

В дистрибутиве Buildroot GStreamer собирается с поддержкой плагинов OpenGL. Для запуска конвейеров с OpenGL-элементами требуется предварительный запуск Weston, подробнее см. Поддержка Wayland. Была проверена работа следующих стандартных элементов:

  • glcolorconvert

  • glcolorscale

  • glshader

  • gltransformation

  • glvideoflip

Пример конвейера для понижения разрешения видеопотока:

gst-launch-1.0 videotestsrc ! \
  video/x-raw,width=1920,height=1080,format=RGBA ! \
  glupload ! glcolorscale ! gldownload ! video/x-raw,width=640,height=360 ! \
  fpsdisplaysink -v text-overlay=false sync=false video-sink=fakesink

Также возможна одновременная работа элементов с поддержкой GPU и других аппаратных блоков, например:

gst-launch-1.0 felixsrc setup-file=/etc/felix/imx219/imx219.cfg \
  sensor=IMX219_0 context=0 ! video/x-raw,format=BGR ! glupload ! \
  glcolorconvert ! gldownload ! video/x-raw,format=BGRA ! \
  fpsdisplaysink -v text-overlay=false sync=false video-sink=fakesink

Примеры конвейеров с использованием других элементов плагина GstOpengl приведены в официальной документации GStreamer.