Skip to content

elvees/m2m-test

Repository files navigation

Утилиты V4L2 memory-to-memory

Репозиторий содержит утилиты для тестирования устройств V4L2 memory-to-memory, см. драйвер *avico* для VPU VELcore-01 (далее --- VPU) микросхемы 1892ВМ14Я (aka MCom-02).

Репозиторий также включает библиотеку v4l2-utils, которая предоставляет утилитам удобные функции для работы с устройствами V4L2.

Утилиты разработаны на языке Си.

Сборка

Сборка выполняется с использованием CMake. Для сборки утилит требуются заголовочные файлы ядра Linux 4.4 для MCom-02. Сборка с заголовочными файлами других версий ядра Linux не проверялась.

Пакет интегрирован в MCom-02 Buildroot, исходные коды из репозитория можно пересобирать с использованием стандартного механизма Buildroot local.mk (<pkg>_OVERRIDE_SRCDIR) и командами make m2m-test-reconfigure && make m2m-test-rebuild.

Утилита any2m420

VPU поддерживает только формат пикселей M420.

Утилита предназначена для преобразования видеопотока из входного видеофайла в видеофайл в формате YUV4MPEG2 с форматом пикселей M420.

Входные видеофайлы могут иметь форматы, поддерживаемые FFmpeg.

Пример вызова:

any2m420 -o output.y4m input.y4m

Утилита m2m-test

Утилита предназначена для тестирования кодирования видео по стандарту H.264 с использованием кодера VPU. Все опции, поддерживаемые утилитой, можно вывести командой m2m-test -h.

Входное видео может быть в формате YUV4MPEG2 с форматом пикселей M420 или I420. Если входное видео имеет формат пикселей I420, то утилиту необходимо вызывать с опцией -t. В этом случае утилита будет покадрово на CPU выполнять преобразование формата пикселей из I420 в формат пикселей M420. Утилита поддерживает циклическое чтение заданного количества кадров входного видео с заданного номера кадра.

Note

Известна проблема ошибок при кодировании видеофайлов на SD-карте (ошибка не наблюдается при работе с eMMC, NFS, tmpfs).

Выходное сжатое видео имеет формат Byte stream стандарта H.264. Частота кадров видео (количество кадров в секунду) можно установить опцией -r. Параметры SPS и PPS в видеопотоке добавляются перед каждым I-кадром.

Note

Аппаратный блок кодера VPU поддерживает только H.264 Constrained Baseline Profile с отключенной опцией Deblocking Filter.

Кодирование выполняется на максимальной скорости без учёта частоты кадров видео.

Утилита поддерживает установку V4L2 controls с опциями -c. Список поддерживаемых V4L2 controls см. в драйвере avico. Имена V4L2 controls должны передаваться в таком же формате, как в утилитах v4l-utils (все буквы в верхнем регистре заменяются на буквы в нижнем регистре, а символы, отличные от букв и цифр, заменяются на _). Например, для передачи значения 15 в V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP нужно в утилиту добавить опцию -c h264_i_frame_qp_value=15.

Утилита поддерживает выбор типа памяти для входных буферов: USERPTR или MMAP. Если выбран тип памяти USERPTR, то память для входных буферов выделяется через malloc(), иначе для входных буферов выделяется физически непрерывная память драйвером avico .

Note

Не рекомендуется использовать тип памяти USERPTR из-за более медленной скорости кодирования и возможного появления артефактов на видео.

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

Пример вызова:

m2m-test -v -d /dev/v4l/by-path/platform-37100000.codec-video-index0 -o /tmp/output.h264 \
  /tmp/input-m420.y4m

/dev/v4l/by-path/platform-37100000.codec-video-index0 --- устройство V4L2 memory-to-memory. Рекомендуется использовать данное имя устройства вместо имени в формате /dev/video<num>, т.к. значение <num> недетерминировано и зависит от порядка инициализации устройств.

Утилита cap-enc

Утилита предназначена для чтения несжатого видео из заданного V4L2-устройства (см. драйвер *vinc* для ISP VPIN/VINC) и передачи несжатого видео в другое устройство V4L2 memory-to-memory (см. драйвер avico), которое выполняет сжатие видео по стандарту H.264. Все опции, поддерживаемые утилитой, можно вывести командой cap-enc -h.

Несжатое видео должно иметь формат пикселей M420. Формат сжатого видео аналогичен формату в m2m-test.

Установка V4L2 controls поддерживается только для устройства кодера и аналогична утилите m2m-test.

Утилита поддерживает установку частоты кадров, которая применяется ко всем V4L2-устройствам. V4L2-устройство, выдающее несжатое видео, выдаёт кадры с заданной частотой кадров. V4L2-устройство кодера VPU записывает информацию о частоте кадров в видеопоток.

Утилита поддерживает установку разрешения несжатых кадров, выдаваемых V4L2-устройством.

Пример вызова:

cap-enc -v -s 1920x1080 -o encoded.264 \
  /dev/v4l/by-path/platform-37200000.vinc-video-index0 \
  /dev/v4l/by-path/platform-37100000.codec-video-index0

/dev/v4l/by-path/platform-37200000.vinc-video-index0 - V4L2-устройство, выдающее несжатые кадры. /dev/v4l/by-path/platform-37100000.codec-video-index0 - V4L2-устройство кодера VPU. Рекомендуется использовать данные имена устройств вместо имен в формате /dev/video<num>, т.к. значение <num> недетерминировано и зависит от порядка инициализации устройств.

Утилита dec-vpout

Утилита предназначена для тестирования декодирования видео по стандарту H.264 с использованием декодера VPU. Все опции, поддерживаемые утилитой, можно вывести командой dec-vpout -h.

Входное сжатое видео может передаваться в виде файла, стандартного ввода или URI RTSP-стриминга. Входное видео может быть в формате Byte stream стандарта H.264 или в формате MP4. Утилита должна запускаться с опцией -m при передаче входного видео в формате MP4. Утилита поддерживает циклическое чтение заданного количества кадров входного видео. Если видео имеет формат Byte stream стандарта H.264, то декодирование и проигрывание выполняется на максимальной скорости без учёта частоты кадров видео. Если входное видео имеет формат MP4, то декодирование и проигрывание выполняется с учётом частоты кадров видео.

Note

Аппаратный блок декодера VPU поддерживает только H.264 Constrained Baseline Profile с отключенной опцией Deblocking Filter.

Драйвер avico поддерживает декодирование видео, которое закодировано самим драйвером. Возможность декодирования видео, сжатого другими средствами, не проверялась. Драйвер поддерживает декодирование видео с разрешением до 1920x1072, кратным 16 пикселям по ширине и высоте. Декодирование видео поддерживается только на модулях с двумя контроллерами DDR 1892ВМ14Я (Салют-ЭЛ24ПМ). Во время декодирования не следует параллельно использовать какой-либо канал SDMA, т.к. это может привести к аппаратному зависанию (см. ограничение rf#12990 в документе "МИКРОСХЕМА ИНТЕГРАЛЬНАЯ 1892ВМ14Я. Перечень ограничений").

Выходное несжатое видео выдаётся в виде последовательности несжатых кадров в формате пикселей M420, I420 или BGRA. Видео может записываться в файл, дескриптор файла или выводиться на дисплей.

Формат пикселей I420 получается преобразованием формата пикселей M420 в I420 на CPU. Для преобразования формата пикселей в I420 утилиту необходимо вызывать с опцией -t.

Формат пикселей BGRA получается преобразованием формата пикселей M420 в BGRA на Arm Neon. Возможно также преобразование в форматы пикселей: ARGB, RGBA или ABGR (требуется пересборка утилиты dec-vpout). Преобразование формата пикселей M420 в BGRA поддерживается только при использовании пакета ffmpeg из Buildroot для MCom-02, в который добавлена поддержка формата пикселей M420 и преобразования формата пикселей M420 в BGRA, ARGB, RGBA или ABGR. Преобразование в формат пикселей BGRA выполняется только при запуске утилиты с выводом видео на дисплей.

Утилита поддерживает вывод видео на дисплей при запуске утилиты с опцией -d. Утилита использует DRM-устройство /dev/dri/cardX (см. драйвер *vpout-drm* контроллера дисплея VPOUT) и библиотеку libdrm для вывода видео на дисплей. Разрешение дисплея в пикселях устанавливается опцией -s <width>x<height>, где <width> --- ширина, <height> --- высота (по умолчанию используется разрешение 1280x720). Видео перед выводом на дисплей масштабируется до указанного разрешения на CPU.

Утилита поддерживает проигрывание звука из входного MP4-файла при запуске утилиты с опцией -a, в которую передаётся имя устройства проигрывания звука. При проигрывании MP4-файла с видео и звуком вывод видео синхронизируется с выводом звука через метки времени.

Подготовка сжатого видеофайла /tmp/life-1280-720-5.enc.h264 осуществляется в несколько этапов. Длительность генерируемых видеофайлов видео может быть ограничена размером tmpfs.

Генерация видеофайла YUV4MPEG2 с форматом пикселей I420:

ffmpeg -loglevel error -hide_banner -f lavfi \
  -i "life=s=1280x720:random_seed=0xdeadbeef:mold=10:r=30:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1280:720:flags=16" \
  -pix_fmt yuv420p -t 5 -y \
  /tmp/life-1280-720-5.orig-i420.y4m

Конвертация формата пикселей из I420 в M420 (промежуточный файл удаляется):

any2m420 -o \
  /tmp/life-1280-720-5.orig-m420.y4m \
  /tmp/life-1280-720-5.orig-i420.y4m \
&& rm /tmp/life-1280-720-5.orig-i420.y4m

Кодирование видео с форматом пикселей M420 в формат Byte stream стандарта H.264 (промежуточный файл удаляется):

m2m-test -v -r 30 -d \
  /dev/v4l/by-path/platform-37100000.codec-video-index0 \
  -o /tmp/life-1280-720-5.enc.h264 \
  /tmp/life-1280-720-5.orig-m420.y4m \
&& rm /tmp/life-1280-720-5.orig-m420.y4m

Декодирование видео в формате Byte stream стандарта H.264 посредством dec-vpout в видеофайл с форматом пикселей M420:

dec-vpout -v -i /tmp/life-1280-720-5.enc.h264 \
  -o /tmp/life-1280-720-5.dec-vpout.m420.yuv \
  /dev/v4l/by-path/platform-37100000.codec-video-index1

Декодирование видео в формате Byte stream стандарта H.264 посредством dec-vpout с опцией -t (опция снижает производительность, т.к. преобразование формата пикселей из M420 в I420 выполняется на CPU) в видеофайл с форматом пикселей I420:

dec-vpout -v -i /tmp/life-1280-720-5.enc.h264 \
  -t \
  -o /tmp/life-1280-720-5.dec-vpout.i420.yuv \
  /dev/v4l/by-path/platform-37100000.codec-video-index1

Несжатое видео с форматом пикселей I420 можно скопировать на ПК и вывести на монитор с помощью команды:

ffplay -f rawvideo \
  -pix_fmt yuv420p \
  -video_size 1280x720 \
  -framerate 30 \
  life-1280-720-5.dec-vpout.i420.yuv

Декодирование видео в формате Byte stream стандарта H.264 может быть также выполнено с помощью FFmpeg. Пример декодирования в видеофайл с форматом пикселей BGRA:

ffmpeg -loglevel error -hide_banner \
  -re -r 30 \
  -vcodec h264_v4l2m2m \
  -i /tmp/life-1280-720-5.enc.h264 \
  -pix_fmt bgra \
  -f rawvideo -y \
  /tmp/life-1280-720-5.dec-ffmpeg.bgra

Опция -re в ffmpeg используется для чтения видео с частотой кадров, указанной в видео. Для чтения видео с максимальной частотой кадров опцию нужно убрать. Производительность декодирования с преобразованием формата пикселей из M420 в BGRA при использовании FFmpeg ниже, чем у dec-vpout и составляет ~17 FPS для разрешения 1280x720.

Несжатое видео с форматом пикселей BGRA можно скопировать на ПК и вывести на монитор с помощью команды:

ffplay -f rawvideo \
  -pix_fmt bgra \
  -video_size 1280x720 \
  -framerate 30 \
  life-1280-720-5.dec-ffmpeg.bgra

Декодирование видео в формате Byte stream стандарта H.264 посредством FFmpeg в видеофайл с форматом пикселей M420 (производительность выше, т.к. отсутствует преобразование формата пикселей):

ffmpeg -loglevel error -hide_banner \
  -re -r 30 \
  -vcodec h264_v4l2m2m \
  -i /tmp/life-1280-720-5.enc.h264 \
  -pix_fmt M420 \
  -f rawvideo -y \
  /tmp/life-1280-720-5.dec-ffmpeg.m420.yuv

Для конвертации видео в формате Byte stream стандарта H.264 в формат MP4 можно использовать команду:

ffmpeg -r 30 -i /tmp/life-1280-720-5.enc.h264 -vcodec copy /tmp/life-1280-720-5.enc.mp4

Декодирование видео в формате MP4 посредством dec-vpout в видеофайл с форматом пикселей M420:

dec-vpout -v -m -i /tmp/life-1280-720-5.enc.mp4 \
  -o /tmp/life-1280-720-5.dec-vpout.m420.yuv \
  /dev/v4l/by-path/platform-37100000.codec-video-index1

Декодирование видео и вывод на дисплей, подключенный к модулю, посредством dec-vpout:

dec-vpout -v -d \
  -i /tmp/life-1280-720-5.enc.h264 \
  /dev/v4l/by-path/platform-37100000.codec-video-index1

Декодирование и вывод на дисплей, подключенный к модулю, посредством ffmpeg (производительность ниже dec-vpout):

ffmpeg -loglevel error -hide_banner \
  -re \
  -vcodec h264_v4l2m2m \
  -i /tmp/life-1280-720-5.enc.h264 \
  -video_size 1280x720 \
  -pix_fmt bgra \
  -f fbdev /dev/fb0

Генерация аудиофайла:

ffmpeg -f lavfi -i "sine=440:duration=5" -c:a pcm_s16le /tmp/sinewave.wav

Подготовка MP4-файла с дорожками видео и звука:

ffmpeg -r 30 -i /tmp/life-1280-720-5.enc.h264 \
 -i /tmp/sinewave.wav \
 -c:v copy \
 -c:a aac \
 -shortest \
 /tmp/life-1280-720-5.with-audio.enc.mp4

Декодирование видео и звука, вывод видео на дисплей и вывод звука на устройство аудио, подключенные к модулю, посредством dec-vpout:

dec-vpout -v -d -a '<audio-device>, ' \
  -m -i /tmp/life-1280-720-5.with-audio.enc.mp4 \
  /dev/v4l/by-path/platform-37100000.codec-video-index1

где <audio-device> --- имя устройства проигрывания звука. Доступные устройства можно вывести командой:

cat /proc/asound/cards | grep -E '^.+[0-9]' | awk '{print $NF}'

About

V4L2 memory-to-memory utilities

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors