OMAP L138: Тест производительности видео кодеков H264 и MPEG4.
Попала мне в рука плата OMAPL138 LCDK на основе системы на кристалле OMAP-L138 от Texas
Instruments.
Было принято решение посмотреть, что из себя представляет данная система на задаче записи видео
на HDD под управлением ОС Linux.
OMAP L138 содержит в своем составе процессор ARM926EJ-S + C674x floating point DSP.
По информации производителя(Texas Instruments) система позволяет осуществлять захват и сжатие
видео в реальном времени.
Производитель (TI) дает к данной системе SDK (OMAP-L138 DVSDK) на основе ОС Linux с набором
аудио и видео кодеков.
Данная система обладает широким набором периферии из которой в первую очередь будет
интересовать:
1. VPIF - порт захвата видео к которому на плате подключен видео кодек.
2. SATA порт для подключения HDD.
На плате присутствует TVP5147PFP NTSC/PAL/SECAM 10-Bit Digital Video Decoder к которому можно
подключить обычную D1(720x576) PAL видеокамера. К SATA - обычный HDD.
SDK.
В комплекте SDK помимо исходников ядра и файловой системы, есть набор тестовых программ
примеров позволяющих проверить работу систем ввода вывода и т.п.
SDK и примеры упрощают работу с периферией платы и позволяют создавать своё ПО на основе
примеров за короткое время.
Доработка SDK.
1. Установлено ПО необходимое для работы SDK(apt-get install ....).
2. Была отключена проверка версии системы под которой работает SDK.
По умолчанию SDK настроен на работу в Ubuntu 10.04. После отключения проверки SDK прекрасно
работает на Debian 9 x64.
3. Внесены изменения в ядро драйвер VPIF (захват входного видео сигнала). По умолчанию драйвер
не умеет собирать полный кадр из двух полукадров(входной сигнал PAL, развёртка через строчная,
кадр состоит из двух полукадров).
4. Внесены изменения в примеры, позволяющие захватить и сжать кадр кодеком H264 или MPEG4.
Исходники SDK находятся на GitHub.
Тестирование скорости кодирования видео.
Входной сигнал PAL(720x576), 25 Hz (40 мс).
Настройки кодека по умолчанию.
Запись видео в файл, сырой видео поток (без контейнера MKV или AVI и т.п.).
Лог работы кодека H264.
Starting application...
Frame 0: Read UYVY frame size 829440 (720x576) from file
[1] Encode: 35701us
Frame 1: Read UYVY frame size 829440 (720x576) from file
[2] Encode: 54292us
Frame 2: Read UYVY frame size 829440 (720x576) from file
[3] Encode: 49723us
Frame 3: Read UYVY frame size 829440 (720x576) from file
[4] Encode: 48880us
Frame 4: Read UYVY frame size 829440 (720x576) from file
[5] Encode: 49491us
Frame 5: Read UYVY frame size 829440 (720x576) from file
[6] Encode: 49101us
Frame 6: Read UYVY frame size 829440 (720x576) from file
[7] Encode: 48279us
Frame 7: Read UYVY frame size 829440 (720x576) from file
[8] Encode: 48237us
Frame 8: Read UYVY frame size 829440 (720x576) from file
[9] Encode: 48140us
Frame 9: Read UYVY frame size 829440 (720x576) from file
[10] Encode: 47993us
Frame 10: Read UYVY frame size 829440 (720x576) from file
[11] Encode: 53664us
Frame 11: Read UYVY frame size 829440 (720x576) from file
[12] Encode: 47966us
Frame 12: Read UYVY frame size 829440 (720x576) from file
[13] Encode: 47894us
Frame 13: Read UYVY frame size 829440 (720x576) from file
[14] Encode: 48313us
Frame 14: Read UYVY frame size 829440 (720x576) from file
[15] Encode: 48341us
Frame 15: Read UYVY frame size 829440 (720x576) from file
[16] Encode: 49346us
Frame 16: Read UYVY frame size 829440 (720x576) from file
[17] Encode: 49162us
Frame 17: Read UYVY frame size 829440 (720x576) from file
[18] Encode: 56711us
Frame 18: Read UYVY frame size 829440 (720x576) from file
[19] Encode: 55518us
Frame 19: Read UYVY frame size 829440 (720x576) from file
[20] Encode: 56235us
Frame 20: Read UYVY frame size 829440 (720x576) from file
[21] Encode: 55686us
Время кодирования 1 кадра > 40 мс. Т.е. кодек не успевает сжимать....
Лог работы кодека MPEG4.
Starting application...
Frame 0: Read UYVY frame size 829440 (720x576) from file
[1] Encode: 28449us
Frame 1: Read UYVY frame size 829440 (720x576) from file
[2] Encode: 37915us
Frame 2: Read UYVY frame size 829440 (720x576) from file
[3] Encode: 33136us
Frame 3: Read UYVY frame size 829440 (720x576) from file
[4] Encode: 32917us
Frame 4: Read UYVY frame size 829440 (720x576) from file
[5] Encode: 33229us
Frame 5: Read UYVY frame size 829440 (720x576) from file
[6] Encode: 33172us
Frame 6: Read UYVY frame size 829440 (720x576) from file
[7] Encode: 32878us
Frame 7: Read UYVY frame size 829440 (720x576) from file
[8] Encode: 32837us
Frame 8: Read UYVY frame size 829440 (720x576) from file
[9] Encode: 32791us
Frame 9: Read UYVY frame size 829440 (720x576) from file
[10] Encode: 32765us
Frame 10: Read UYVY frame size 829440 (720x576) from file
[11] Encode: 37999us
Frame 11: Read UYVY frame size 829440 (720x576) from file
[12] Encode: 32642us
Frame 12: Read UYVY frame size 829440 (720x576) from file
[13] Encode: 32664us
Frame 13: Read UYVY frame size 829440 (720x576) from file
[14] Encode: 37779us
Frame 14: Read UYVY frame size 829440 (720x576) from file
[15] Encode: 32823us
Frame 15: Read UYVY frame size 829440 (720x576) from file
[16] Encode: 33165us
.................
Frame 21: Read UYVY frame size 829440 (720x576) from file
[22] Encode: 34483us
Frame 22: Read UYVY frame size 829440 (720x576) from file
[23] Encode: 39310us
Frame 23: Read UYVY frame size 829440 (720x576) from file
[24] Encode: 33541us
Frame 28: Read UYVY frame size 829440 (720x576) from file
[29] Encode: 39142us
Frame 30: Read UYVY frame size 829440 (720x576) from file
[31] Encode: 27391us
.................
Frame 60: Read UYVY frame size 829440 (720x576) from file
[61] Encode: 27631us
.................
Frame 68: Read UYVY frame size 829440 (720x576) from file
[69] Encode: 40825us
.................
Frame 80: Read UYVY frame size 829440 (720x576) from file
[81] Encode: 40125us
Frame 83: Read UYVY frame size 829440 (720x576) from file
[84] Encode: 40781us
MPEG4 уже лучше но время кодирования 1 кадра иногда переваливает за 40 мс.
Т.е. кодек с трудом успевает сжимать....
Есть подозрение, что в силу того что кадр состоит из YUV линейно расположенных в памяти,
DSP тратит дополнительное время на выбор Y и UV компонент. Т.к. приходится осуществлять
выборку прыгая по адресам через один для чтения того или иного компонента.
В DM36x захват совмещен с сортировкой. Т.е. в результате кадр располагается в памяти в
следующем порядке. В начале кадра располагаются Y компоненты, затем располагаются UV
цветоразностные компоненты. Расположение Y, затем UV позволяет быстрее и эффективнее
получать доступ к памяти кадра.
С другой стороны TI и не говорил что OMAP-L138 это мультимедийный процессор.
Сжатие видео это, задача второго - третьего плана.
Проблемы с SATA интерфейсом.
Как выяснилось OMAP L138 может работать только с HDD с интерфейсом SATA-I или SATA-II.
HDD SATA-III OMAP L138 не видит, из-за аппаратной ошибки в модуле SATA.
Увы но найти HDD с SATA-I или II это проблема.
Компьютерная периферия так быстро меняется что за ней не угнаться.
Этаже проблема присутствует и в AM1808. Мда, это сильно ограничивает возможности применения.