Репозиторий содержит утилиты для тестирования устройств 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.
VPU поддерживает только формат пикселей M420.
Утилита предназначена для преобразования видеопотока из входного видеофайла в видеофайл в формате YUV4MPEG2 с форматом пикселей M420.
Входные видеофайлы могут иметь форматы, поддерживаемые FFmpeg.
Пример вызова:
any2m420 -o output.y4m input.y4mУтилита предназначена для тестирования кодирования видео по стандарту 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> недетерминировано и зависит от порядка инициализации устройств.
Утилита предназначена для чтения несжатого видео из заданного 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> недетерминировано и зависит от порядка инициализации устройств.
Утилита предназначена для тестирования декодирования видео по стандарту 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}'