Передача видео между Виртурилками — различия между версиями

Материал из virt2real wiki
Перейти к: навигация, поиск
 
Строка 28: Строка 28:
 
  fbset -yres 0 -fb /dev/fb2
 
  fbset -yres 0 -fb /dev/fb2
 
  gst-launch videotestsrc ! \
 
  gst-launch videotestsrc ! \
  TIDmaiVideoSink videoStd=D1_PAL videoOutput=composite accelFrameCopy=false noCopy=true sync=false displayDevice=/dev/video2 videoStd=D1_PAL
+
  TIDmaiVideoSink videoStd=D1_PAL videoOutput=composite accelFrameCopy=false noCopy=true sync=false displayDevice=/dev/video2
  
 
(команды fbset необходимы для конфигурации оверлея)
 
(команды fbset необходимы для конфигурации оверлея)

Текущая версия на 19:08, 5 ноября 2014

Содержание

Макет

Передача видео между двумя Виртурилками производилось по следующей схеме:

  • GoPro -> TVP5150 -> Виртурилка (энкодер)
  • WiFi AP (Carambola 2)
  • Виртурилка (декодер) -> TVOut -> Монитор

В обоих случаях использовался родной мезонниный WiFi-модуль из стандартного набора.

Энкодер

Конфигурация энкодера не отличается от традиционных способов трансляции в случае использования TVP5150:

/usr/bin/gst-launch -v v4l2src always-copy=false chain-ipipe=true ! \
    capsfilter caps=video/x-raw-yuv,format='(fourcc)'NV12,width=720,height=576,pitch=736,framerate='(fraction)'25/1 ! \
    dmaiaccel ! \
    dmaienc_h264 targetbitrate=200000 encodingpreset=2 ratecontrol=2 intraframeinterval=25 headers=true ! \
    rtph264pay ! \
    udpsink port=3000 host=192.168.222.128

Донастройки системы не производилось.

Декодер

Для начала была проверена сама возможность вывода в TVOut, что осуществилось простым примером:

fbset -yres 0 -fb /dev/fb0
fbset -yres 0 -fb /dev/fb2
gst-launch videotestsrc ! \
TIDmaiVideoSink videoStd=D1_PAL videoOutput=composite accelFrameCopy=false noCopy=true sync=false displayDevice=/dev/video2

(команды fbset необходимы для конфигурации оверлея)

Далее, была поймана проблема с CMEM error. Суть ее такова, что dmaidec_h264 очень активно использует CMEM для работы с памятью, что требует перераспределения доступного ОЗУ между ядром и CMEM в пользу последнего, а также формирование пулов буферов для дальнейшего использования:

  • В параметрах загрузки ядра было выставлено mem=48M (да, перераспределение значительное)
  • В файле /etc/init.d/S30modules были произведены следующие изменения: увеличен объем памяти под CMEM заменой строк
PHYS_END=`printf '0x%x' $(($PHYS_START + 0xF00000))`
PHYS_END_INT=`printf '%d' $(($PHYS_START + 0xF00000))`  

на (добавилась 3 перед F)

PHYS_END=`printf '0x%x' $(($PHYS_START + 0x3F00000))`
PHYS_END_INT=`printf '%d' $(($PHYS_START + 0x3F00000))`
  • и была произведена разметка пулов заменой
modprobe cmemk phys_start=$PHYS_START phys_end=$PHYS_END allowOverlap=1 useHeapIfPoolUnavailable=1 allowOverlap=1 phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672

на

modprobe cmemk phys_start=$PHYS_START phys_end=$PHYS_END allowOverlap=1 useHeapIfPoolUnavailable=0 \
phys_start_1=0x00001000 phys_end_1=0x00008000 pools_1=1x28672 \
pools=1x16539648,1x4841472,4x1843200,14x1646592,1x282624,1x176128,1x147456,1x69632,1x61440,1x32768,2x20480,1x16384,1x12288,4x8192,69x4096

После чего ошибки с буфером прекратились.

Для декодирования была использована следующая команда:

CE_DEBUG=1 gst-launch udpsrc port=3000 ! \
    "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, sprop-parameter-sets= (string)\"Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQFoJMg\\,aO48sA\\=\\=\", payload=(int)96, ssrc=(uint)655289679, clock-base=(uint)3937981130, seqnum-base=(uint)48955" ! \
    rtph264depay ! \
    dmaidec_h264 numOutputBufs=16 ! \
    TIDmaiVideoSink videoStd=D1_PAL videoOutput=composite accelFrameCopy=false noCopy=true sync=false displayDevice=/dev/video2 

Для включения отладочной информации по декодеру достаточно выставить CE_DEBUG=1. Для отладки GStreamer-а необходимо выставит GST_DEBUG=3 или GST_DEBUG=4. Для настройки производительности следует воспользоваться Dmaiperf.

Попытки воспроизвести обычный файл mkv, специально приготовленный для тестирования (одна видеодорожка, простой фрагмент), обернулась провалом - декодер не успевал обрабатывать полученные данные, как следствие - цепочка зависала:

gst-launch filesrc location=test1.mkv ! \
    matroskademux ! \
    queue ! \
    dmaidec_h264 numOutputBufs=14 ! \
    priority nice=-10 !  \
    queue ! \
    priority nice=-10 ! \
    dmaiperf ! \
    TIDmaiVideoSink videoStd=D1_PAL videoOutput=composite accelFrameCopy=false noCopy=true sync=false displayDevice=/dev/video2 

Результат

Передача видео осуществляется, но качество и задержка оставляет желать лучшего. Возможно, непосредственное подключение (без промежуточных AP), а так же подбор параметров позволит улучшить качество и минимизировать задержку.