Hallo Zusammen,
da ich meine liebe Not mit dem vdr-plugin-satip hatte (Beitrag) und auch die gleichen Probleme mit Aufnahmen wie andere (Beitrag) hatte, habe ich mich nach Alternativen dazu umgeschaut.
Gefunden habe ich den 13 Jahre alten vtuner von Honza Petrous und das 9 Jahre alte satip von mc.fishdish. Netterweise wurde der alte vtuner schonmal von jemand anders auf linux 4.x / 5.x portiert. Und auch das satip Programm war so schön standardkonform geschrieben das es sich ohne Probleme übersetzten lies.
Ich habe das mal als Grundlage genommen und mir genauer angeschaut. Vieles war total umständlich umgesetzt, keine Ahnung warum - ich denke es war dem DVBAPI3 geschuldet.
Viele Aufrufe wurden 1:1 durchgereicht was zu 16 internen Meldungen und 7 ioctls führte. Auch im satip-Programm wurde deshalb ein Bitfeld eingebaut mit dem dann geprüft wurde ob schon alle Parameter empfangen wurden
Daraus ist nun vtuner-ng, vtuner 2.0 geworden. Ich habe dort mal mit der Axt ziemlich gewütet, den Support für kernels < 4.16 entsorgt und die Meldungen auf 2 (MSG_SET_FRONTEND, MSG_PIDLIST) und die ioctls auf 3 (VTUNER_GET_MESSAGE, VTUNER_SET_RESPONSE, VTUNER_SET_SIGNAL) gekürzt. Im satip-Programm ist das tunen auch um einiges vereinfacht worden, denn nun werden alle Parameter auf einmal mit MSG_SET_FRONTEND übergeben. Zudem empfängt das satip-Programm manchmal leere RTP-Pakete mit 12 Bytes. In dem Fall schiebe ich dann ein selbstgebasteltes Filler-Paket ohne Payload mit AdaptionOnly (keine Fields), der PID 0x1FFF und 0xFF als Adaptionfiller. Besonderheit solcher Pakete ist, das der Continuity-Counter nicht hochgezählt werden muss. Im VDR habe ich zuvor noch des öfteren "TS-Stream broken" gesehen... bislang nicht mehr..
Anstatt wie früher das Frontend erst beim Öffnen des vtuner-Devices anzulegen wird es nun als Multi-DVB Frontend nach dem Laden des Moduls angelegt.
Im VDR wird das dann so erkannt:
Dec 9 18:02:32 server vdr: [1229] frontend 0/0 provides DVB-T,DVB-C,DVB-S,DVB-S2 with QPSK,QAM16,QAM64,QAM128,QAM256 ("vTuner proxyFE DVB-Multi")
Dec 9 18:02:32 server vdr: [1229] frontend 1/0 provides DVB-T,DVB-C,DVB-S,DVB-S2 with QPSK,QAM16,QAM64,QAM128,QAM256 ("vTuner proxyFE DVB-Multi")
Dec 9 18:02:32 server vdr: [1229] frontend 2/0 provides DVB-T,DVB-C,DVB-S,DVB-S2 with QPSK,QAM16,QAM64,QAM128,QAM256 ("vTuner proxyFE DVB-Multi")
Dec 9 18:02:32 server vdr: [1229] frontend 3/0 provides DVB-T,DVB-C,DVB-S,DVB-S2 with QPSK,QAM16,QAM64,QAM128,QAM256 ("vTuner proxyFE DVB-Multi")
Was natürlich auch ginge aber bislang nicht so programmiert ist, das Frontend ohne bestimmtes DeliverySystem anzulegen und das dann inkl. Parameter (oder Defaults) per ioctl auszuwählen.
Theoretisch wären dann so Sachen möglich einem Frontend min./max. Frequenzen zuzuweisen die es im "normalen DVB-T/C/S/S2" nicht gibt. Dann einen Kanal dafür in der channels.conf erstellen und per satip z.B. einen RTSP-Webcam-Stream holen lassen (sind das auch TS-Streams oder was anders? Kenn' mich da nicht aus). Theoretisch müsste der bestimmte Kanal dann das Bild der Webcam anzeigen...
Zur Zeit habe ich das aber nicht so gemacht damit die Frontends vom VDR erstmal angenommen werden auch wenn auf der "anderen Seite" noch niemand den virtuellen Tuner bedient...
Das Device und die zugehörigen Verbindungen lasse ich vor dem Start vom VDR starten:
/usr/sbin/modprobe vtunerc devices=4
/usr/local/bin/satip -h 10.15.10.30 -d /dev/vtunerc0 -m 2 -l 4 2> /tmp/satip0.log &
/usr/local/bin/satip -h 10.15.10.30 -d /dev/vtunerc1 -m 2 -l 4 2> /tmp/satip1.log &
/usr/local/bin/satip -h 10.15.10.30 -d /dev/vtunerc2 -m 2 -l 4 2> /tmp/satip2.log &
/usr/local/bin/satip -h 10.15.10.30 -d /dev/vtunerc3 -m 2 -l 4 2> /tmp/satip3.log &
Im proc-Verzeichnis wird dann für jeden Adapter eine Datei angelegt:
-r--r--r-- 1 root 0 Dec 9 18:05 vtunerc0
-r--r--r-- 1 root 0 Dec 9 18:05 vtunerc1
-r--r--r-- 1 root 0 Dec 9 18:05 vtunerc2
-r--r--r-- 1 root 0 Dec 9 18:05 vtunerc3
Wenn der VDR dann läuft und das satip-Programm etwas zurückliefert sieht der Inhalt vom vtunerc0 z.B. so aus:
[ vtunerc driver, version 2.0 ]
Used by : 1
Status : FE_HAS_LOCK
Last change : 1162
System : DVB-S2
Modulation : PSK 8
Frequency : 11493
Symbolrate : 22000
FEC : 2/3
Rolloff : 0.35
Pilot : auto
PID tab : 5101 5102 5103 5107 5106 5105 18 20 0 17 16 5100 (len=12)
TS data : 2101758784
Display More
Last change z.B. gibt an seit wievielen Sekunden der letzte MSG_SET_FRONTEND Befehl zum tunen kam, bei EPG-Frontends hab' ich hier noch nie mehr als 20 Sekunden gesehen
Ansonsten gebe ich halt die Tuning-Parameter aus die geschickt wurden. PID-Tabelle und TS data-Zähler gab es auch schon früher...
Wenn das satip-Programm wie oben aufgerufen wird, werden die RTSP-Ausgaben ins tmp-Verzeichnis geloggt, das sieht dann in etwa so aus:
OPTIONS rtsp://10.15.10.30:554/ RTSP/1.0
CSeq: 1
--
SETUP rtsp://10.15.10.30/?src=1&freq=11493.0&pol=h&msys=dvbs2&mtype=8psk&sr=22000&fec=23&ro=0.35&plts=on&pids=5101,5102,5103,5107,5106,5105 RTSP/1.0
CSeq: 2
--
PLAY rtsp://10.15.10.30/stream=1367 RTSP/1.0
CSeq: 3
--
PLAY rtsp://10.15.10.30/stream=1367?addpids=18 RTSP/1.0
CSeq: 4
--
PLAY rtsp://10.15.10.30/stream=1367?addpids=20,0,17,16 RTSP/1.0
CSeq: 5
--
PLAY rtsp://10.15.10.30/stream=1367?addpids=5100 RTSP/1.0
CSeq: 6
--
PLAY rtsp://10.15.10.30/stream=1367?addpids=5110 RTSP/1.0
CSeq: 7
--
PLAY rtsp://10.15.10.30/stream=1367?delpids=5110 RTSP/1.0
CSeq: 8
--
PLAY rtsp://10.15.10.30/stream=1367?addpids=5120 RTSP/1.0
CSeq: 9
--
PLAY rtsp://10.15.10.30/stream=1367?delpids=5120 RTSP/1.0
CSeq: 10
--
PLAY rtsp://10.15.10.30/stream=1367?addpids=5130 RTSP/1.0
CSeq: 11
--
PLAY rtsp://10.15.10.30/stream=1367?delpids=5130 RTSP/1.0
CSeq: 12
--
OPTIONS rtsp://10.15.10.30:554/ RTSP/1.0
CSeq: 13
--
OPTIONS rtsp://10.15.10.30:554/ RTSP/1.0
CSeq: 14
--
OPTIONS rtsp://10.15.10.30:554/ RTSP/1.0
CSeq: 15
--
OPTIONS rtsp://10.15.10.30:554/ RTSP/1.0
CSeq: 16
--
OPTIONS rtsp://10.15.10.30:554/ RTSP/1.0
CSeq: 17
--
Display More
Ich hab' das Log gekürzt, es ist im Original viel ausführlicher... Da hier kein curl verwendet wird sondern alles in Hand programmiert wurde (nicht von mir), werden auch sämtliche Antworten vom satip-Server gelesen. Bei Fehlern beim SETUP warte ich jetzt 65 Sekunden - oftmals war einfach der Receiver noch belegt. Beim Beenden von satip habe ich einen TEARDOWN eingebaut den es zuvor nicht gab. Der hat auch dazu geführt das der Receiver beim nächsten Start noch belegt war.
Was auch geht ist den TS-Stream aus dem virtuellen Device auszugeben, dazu muss nur das vtuner-Device gelesen werden, z.B. so:
Dann kann der Stream z.B. mit
analysiert werden.
Bislang läuft das bei mir recht stabil, ab und an aber habe ich Probleme mit der Ausgabe - dann muss ich den Kanal wechseln. Aber das könnte auch am xineliboutput-Plugin liegen.
Sogar Aufnahmen werden ohne Fehler gemacht (naja, war vielleicht Glück):
Dec 9 18:40:00 server vdr: [1229] timer 78 (47 1730-1840 'Serien~Mord ist ihr Hobby~Der tödliche Stromschlag') finished with 0 errors
Bei mir wurde der kernel leider mit folgender Option übersetzt:
Das führt im Log zu sehr vielen Meldungen dieser Art:
[ 3318.131173] dvb_demux: dvb_dmx_swfilter_section_packet: discontinuity: 8 instead of 5. 188 bytes lost
[ 3318.295006] dvb_demux: dvb_dmx_swfilter_section_packet: discontinuity: 9 instead of 2. 188 bytes lost
[ 3318.527785] dvb_demux: dvb_dmx_swfilter_section_packet: discontinuity: 11 instead of 9. 188 bytes lost
[ 3319.059178] dvb_demux: dvb_dmx_swfilter_section_packet: discontinuity: 5 instead of 11. 188 bytes lost
[ 3319.405629] dvb_demux: dvb_dmx_swfilter_section_packet: discontinuity: 6 instead of 12. 188 bytes lost
[ 3319.450269] dvb_demux: dvb_dmx_swfilter_section_packet: discontinuity: 8 instead of 6. 188 bytes lost
Das liegt daran das die TS-Pakete einfach durchgeschoben werden. Eine Abhilfe könnte sein für jede empfangene PID auf den PUSI-Marker zu warten und zwischendurch Filler-Pakete zu senden. Dann müsste ich mir aber für jede PID merken ob schon mal der PUSI-Marker da war. Mal schauen
[Edit] Abgelegt ist das Ganze hier auf github