Segmentation fault при первой же попытке заграбить кадр (т.е. старте пайплайна).
По GST_DEBUG судя по всему на функции "gst_imx_ipu_map_phys_mem".
Тот же сегфолт и на imxpxpvideotransform и на imxg2dvideotransform.
Проблема возникает именно при использовании appsink. Если вместо него взять imxg2dvideosink (с еще одним videoconvert чтоб он смог принять format=BGR) и запустить данный пайплайн через gst-launch, то все работает, но с предсказуемо отвратительным fps.
Т.е. пока вердикт что videoconvert тормозит но работает. Все аппаратные аналоги - сегфолтятся.
Проблема возникает именно при использовании appsink.
...
Т.е. пока вердикт что videoconvert тормозит но работает. Все аппаратные аналоги - сегфолтятся.
проблемы скорей всего у вас в коде, попробуйте у себя
проблемы скорей всего у вас в коде, попробуйте у себя
https://yadi.sk/d/pm5y_v563RdZFQ
У меня работает и не сегфолтится, вывод изображения на HDMI 1920х1080, бинарник в архиве собран с buildroot-2017.08-sk
sasamy, спасибо за код!
Да, у меня тоже он работает без сегфолта. Поставил gdb, прогнал и ничего дельного не получил кроме того что сегфолтится на стыке OpenCV и GStreamer (https://github.com/opencv/opencv/blob/3.1.0/modules/videoio/src/cap_gstreamer.cpp) в момент чтения кадра. Глубже пока раскопать не могу.
Т.е. проблема судя по всему в том что не нужно использовать OpenCV API для захвата кадра и лучше делать все на базе "голого" GStreamer'а.
Уважаемый sasamy, добрый день!
Наступил на очередные грабли с TW6869, без вас судя по всему никак.
Суть: не могу переподключить TW6869 по mPCIE после remove
Плата iMX6S-SODIMM + SK-TW6869, buildroot2017.08
Цепочка действий:
1. Плата загрузилась.
2. /root/v1.sh - OK
3. echo 1 > /sys/bus/pci/devices/0000\:01\:00.0/remove - OK
4. echo 1 > /sys/class/pci_bus/0000\:01/rescan - OK
5. /root/v1.sh - уже не работает.
Вывод в консоль после пункта 4:
pci 0000:01:00.0: Setting PCI class for tw6869/65 PCIe device
pcieport 0000:00:00.0: BAR 8: assigned [mem 0x01300000-0x013fffff]
pci 0000:01:00.0: BAR 0: assigned [mem 0x01100000-0x01100fff pref]
pcieport 0000:00:00.0: PCI bridge to [bus 01]
pcieport 0000:00:00.0: bridge window [mem 0x01300000-0x013fffff]
pcieport 0000:00:00.0: bridge window [mem 0x01100000-0x011fffff pref]
tw6869 0000:01:00.0: vch0 registered as video0
tw6869 0000:01:00.0: vch1 registered as video1
tw6869 0000:01:00.0: vch2 registered as video2
tw6869 0000:01:00.0: vch3 registered as video3
tw6869 0000:01:00.0: vch4 registered as video4
tw6869 0000:01:00.0: vch5 registered as video5
tw6869 0000:01:00.0: vch6 registered as video6
tw6869 0000:01:00.0: vch7 registered as video7
tw6869 0000:01:00.0: driver loaded
Ошибка в консоли после пункта 5:
irq 306: nobody cared (try booting with the "irqpoll" option)
CPU: 0 PID: 0 Comm: swapper/0 Tainted: G O 4.1.15 #1
Hardware name: Freescale i.MX6 Quad/DualLite (Device Tree)
[<80016698>] (unwind_backtrace) from [<80012640>] (show_stack+0x10/0x14)
[<80012640>] (show_stack) from [<806e0f78>] (dump_stack+0x74/0xb4)
[<806e0f78>] (dump_stack) from [<80067588>] (__report_bad_irq+0x28/0xd0)
[<80067588>] (__report_bad_irq) from [<80067b1c>] (note_interrupt+0x27c/0x2cc)
[<80067b1c>] (note_interrupt) from [<80065580>] (handle_irq_event_percpu+0xe0/0x140)
[<80065580>] (handle_irq_event_percpu) from [<8006561c>] (handle_irq_event+0x3c/0x5c)
[<8006561c>] (handle_irq_event) from [<80068298>] (handle_fasteoi_irq+0xe0/0x198)
[<80068298>] (handle_fasteoi_irq) from [<80064bb8>] (generic_handle_irq+0x2c/0x3c)
[<80064bb8>] (generic_handle_irq) from [<80064e70>] (__handle_domain_irq+0x7c/0xec)
[<80064e70>] (__handle_domain_irq) from [<800093ec>] (gic_handle_irq+0x24/0x5c)
[<800093ec>] (gic_handle_irq) from [<80013140>] (__irq_svc+0x40/0x74)
Exception stack(0x809c3e48 to 0x809c3e90)
3e40: 00000000 80888314 80a180c0 00000000 00000202 00000000
3e60: 00000010 809c2000 00000001 809c4080 88008000 00000000 00000001 809c3e90
3e80: 800304d4 800304e4 200f0113 ffffffff
[<80013140>] (__irq_svc) from [<800304e4>] (__do_softirq+0xa4/0x23c)
[<800304e4>] (__do_softirq) from [<80030934>] (irq_exit+0xc0/0xfc)
[<80030934>] (irq_exit) from [<80064e74>] (__handle_domain_irq+0x80/0xec)
[<80064e74>] (__handle_domain_irq) from [<800093ec>] (gic_handle_irq+0x24/0x5c)
[<800093ec>] (gic_handle_irq) from [<80013140>] (__irq_svc+0x40/0x74)
Exception stack(0x809c3f18 to 0x809c3f60)
3f00: 809c3f60 fffffff7
3f20: ffb899f9 0000000c 8bb25e90 00000000 ffb899f9 0000000c ff223f16 0000000c
3f40: 00000001 00000000 00000017 809c3f60 a6aaaaab 80492dfc 800f0013 ffffffff
[<80013140>] (__irq_svc) from [<80492dfc>] (cpuidle_enter_state+0xcc/0x1f8)
[<80492dfc>] (cpuidle_enter_state) from [<8005ca34>] (cpu_startup_entry+0x1f8/0x318)
[<8005ca34>] (cpu_startup_entry) from [<80975c60>] (start_kernel+0x39c/0x3a8)
handlers:
[<802b8158>] pcie_pme_irq
Disabling IRQ #306
Проверял, IRQ #306 завязана именно на TW6869. Номер самого прерывания каждый раз разный.
Т.е. симптомы: цепочка remove-rescan проходит без видимых ошибок в консоли.
Но при попытке после этого использовать TW6869 ядро ругается на необработанное IRQ и захват видео уже не работает. Помогает только полный reboot.
Т.е. симптомы: цепочка remove-rescan проходит без видимых ошибок в консоли.
станно - у меня сразу trace с ошибкой. Ошибка эта не в драйвере tw6869 - по какой-то причине после remove-rescan ядро назначает для tw6869 левое прерывание от контроллера GPIO
Снова нужна ваша помощь, наступил на ранее не замеченную тонкость в работе драйвера TW6869 и не пойму как ее обойти.
Кратко суть:
1. Для чистоты перезагружаем систему.
2. Запускаем gstreamer без физически подключенной камеры (например /root/v1.sh).
Пайплайн резонно не работает.
3. Подключаем камеру - в консоли видно что TW6869 факт появления видеосигнала видит, но DMA поток не стартует. На экране пусто.
4. Убиваем gstreamer и снова его запускаем уже при подключенной камере. Все работает отлично.
5. А вот теперь интересно - если теперь повторить пункт 2 (сначала запустить gstreamer, а только потом подключить камеру), то DMA поток стартует нормально и опять же все работает отлично.
Т.е. грубо восстановление сигнала при подключении камеры при уже запущенном пайплайне работает только если до этого на этом канале пайплайн уже когда-то корректно работал. С нуля - восстановление сигнала не работает.
Вывод консоли для вышеописанного:
(2) Запускаем gstreamer без физически подключенной камеры:
/root/v1.sh 1
Setting pipeline to PAUSED ...
tw6869 0000:01:00.0: tw6869_querystd: vch1: unknown std detected
tw6869 0000:01:00.0: tw6869_querystd: vch1: unknown std detected
tw6869 0000:01:00.0: tw6869_g_std: vch1: PAL video standard
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
(gst-launch-1.0:492): GStreamer-tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: video not present
tw6869 0000:01:00.0: tw_dma_enable: DMA 1
CRITICAL **: Registering meta implementation 'GstImxV4l2Meta' without init function
tw6869 0000:01:00.0: tw6869_irq: ch1: signal lost
tw6869 0000:01:00.0: tw6869_dma_reset: DMA 1
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: video not present
(3) Подключаем камеру при в первый раз запущенном пайплайне:
tw6869 0000:01:00.0: tw6869_irq: ch1: signal recovered
tw6869 0000:01:00.0: tw6869_dma_reset: DMA 1
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: odd field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: odd field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: odd field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: odd field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: odd field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: odd field
tw6869 0000:01:00.0: tw6869_dma_reset: DMA 1
....
Далее то же самое по кругу
(4) Убиваем gstreamer и снова его запускаем уже при подключенной камере:
# /root/v1.sh 1
Setting pipeline to PAUSED ...
tw6869 0000:01:00.0: tw6869_querystd: vch1: NTSC std detected
tw6869 0000:01:00.0: tw6869_querystd: vch1: NTSC std detected
tw6869 0000:01:00.0: tw6869_g_std: vch1: NTSC video standard
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
(gst-launch-1.0:502): GStreamer-tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: odd field
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
tw6869 0000:01:00.0: tw_dma_enable: DMA 1
CRITICAL **: Registering meta implementation 'GstImxV4l2Meta' without init function
Все работает
(5.1) Запускаем gstreamer не в первый раз, но камера отключена:
# /root/v1.sh 1
Setting pipeline to PAUSED ...
tw6869 0000:01:00.0: tw6869_querystd: vch1: unknown std detected
tw6869 0000:01:00.0: tw6869_querystd: vch1: unknown std detected
tw6869 0000:01:00.0: tw6869_g_std: vch1: NTSC video standard
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
(gst-launch-1.0:511): GStreamer-tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: video not present
tw6869 0000:01:00.0: tw_dma_enable: DMA 1
CRITICAL **: Registering meta implementation 'GstImxV4l2Meta' without init function
tw6869 0000:01:00.0: tw6869_irq: ch1: signal lost
tw6869 0000:01:00.0: tw6869_dma_reset: DMA 1
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: video not present
(5.2) теперь подключаем камеру:
tw6869 0000:01:00.0: tw6869_irq: ch1: signal recovered
tw6869 0000:01:00.0: tw6869_dma_reset: DMA 1
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
tw6869 0000:01:00.0: tw6869_dma_reset: DMA 1
tw6869 0000:01:00.0: tw6869_vch_dma_wait: vch1: even field
Все работает
и в этом кроется проблема - если нет видеосигнала конвеер стартует с дефолтными параметрами - PAL по умолчанию 720x576, если вы потом подклчаете камеру с NTSC у него другое разрешение 720x480. В общем если используете NTSC - поменяйте
#define TW_DEFAULT_V4L2_STD V4L2_STD_NTSC
конвеер не конфигурируется динамически. По хорошему - надо бы добавить параметр для плагина imxv4l2videosrc для дефолтного стандарта а не исходники в ядре править.