FritzBox 6490 DVB-IP Problem - Jetzt wirds angegangen

Da schaut man hier mal für ein paar Tage nicht vorbei um ein anderes Problem anzugehen und schon ist es gelöst...... Ich verweise AVM jetzt noch ein letztes mal auf diesen Thread, dann sollen die zusehen was die machen, mir egal.

Du hast nicht zufällig mal versucht einen 5. Stream zu öffnen (also ohne den cableinfo), oder? :D

Um meinen minisatip entsprechend kompilieren zu können, muss ich natürlich den Aufbau eines streams verstehen:

Code:
   di_alloc_stream_param(0 b728d028 0 c0a80039 1388 d01e 1 b75fe300 10 8065c61) -> b73c1948
    di_alloc_stream(b73c1948) -> b728c000
    di_close_stream(b728c000 bfbd9a98 80527bb) -> 0
    di_tune_stream(b728c000 1f1d1680 694920 0 5 0 5 5) -> 0
    di_open_stream(b728c000) -> 0
    di_add_pid(b728c000 0) -> 0
    di_add_pid(b728c000 10) -> 0
    di_add_pid(b728c000 11) -> 0
    di_add_pid(b728c000 12) -> 0
    di_add_pid(b728c000 14) -> 0
    di_add_pid(b728c000 13ec) -> 0
    di_add_pid(b728c000 13ed) -> 0
    di_add_pid(b728c000 492) -> 0
    di_add_pid(b728c000 498) -> 0
    di_add_pid(b728c000 87b) -> 0
    di_add_pid(b728c000 13ee) -> 0
    di_add_pid(b728c000 13ef) -> 0
    di_add_pid(b728c000 13f0) -> 0
    di_add_pid(b728c000 13f1) -> 0
    di_add_pid(b728c000 13f2) -> 0
    di_add_pid(b728c000 13f4) -> 0
    di_add_pid(b728c000 1434) -> 0
    p_di_recvpid_stream(b728c000 ..)
    ...
    di_close_stream(b728c000 bfbd9a98 80527bb) -> 0

Ich hoffe ja das da schon Informationen drüber existieren was die einzelnen Parameter bei di_alloc_stream_param bedeuten. Oder das zumindest irgendwer eine Idee hat was das sein könnte.

Bei tune_stream müsste das zweite Parameter die Frequenz sein (als Dezimalzahl wäre sie auch lesbar). AVM Schreibt dazu
Code:
debugmsg(
    dword_5BC4,
    "%s tuner:%d channel:%d f:%ld mtype:%d sr:%ld inv:%d",
    "di_tune_stream",
    a1[4],
    a1[5],
    a2,
    a5,
    a3,
    a4);
mtype gibt warscheinlich die Art der Modulation an (QAM256, QAM64 etc.), aber was inv und sr sein sollen ist mir noch nicht ganz klar. Das ist natürlich essentiell um zu den cableinfo komplett zu ersetzen, gegen einen schönen multithreaded minisatip der im idealfall so viele streams liefert wie der Prozessor schafft.

Allerdings befürchte ich, das PeterPawn recht hatte: di_alloc_stream beinhaltet die folgenden Zeilen:
Code:
debugmsg(dword_5BC4, "%s", "alloc_demux");
  v1 = dword_5C64;
  if ( dword_5C64 <= 0 )
    goto LABEL_20;
  v2 = 0;
  while ( dword_5C20[v2] || dword_5C40[v2] < 0 )
  {
    ++v2;
    v1 = dword_5C64;
    if ( v2 >= dword_5C64 )
      goto LABEL_20;
  }
  v3 = slab_dcalloc(1, 412, (int)"dvbif.c", 496);
  v4 = (_DWORD *)v3;
  dword_5C20[v2] = v3;
  if ( !v3 )
  {
    v1 = dword_5C64;
LABEL_20:
    debugmsg(dword_5BC4, "alloc of demux_ts failed, max=%d", v1);
    goto LABEL_18;
  }
  *(_DWORD *)(v3 + 44) = v2;
  *(_DWORD *)(v3 + 52) = -1;
  if ( dword_5C64 <= v2 )
  {
    debugmsg(dword_5BC4, "%s: invalid demux_index %d, max=%u", "MapDemuxToNim", v2, dword_5C64);
    v4[12] = -1;
    goto LABEL_17;
  }

Stark vereinfacht wird der nächste freie demuxer gesucht. Die maximale Anzahl an Demuxern ist in dword_5C64 gespeichert, was im init durch folgenden Code passiert:
Code:
v14 = LODWORD(v41);
        dword_5C64 = 0;
        dword_5C60 = LODWORD(v41);
        v15 = 0;
        v16 = 0;
        do
        {
          if ( _bittest(&v14, v16) )
          {
            debugmsg(dword_5BC4, "map ch:%d to nim %d", v15, v16);
            v17 = dword_5C64;
            v14 = dword_5C60;
            dword_5C40[dword_5C64] = v16;
            v15 = v17 + 1;
            dword_5C64 = v15;
          }
          ++v16;
        }
        while ( v16 != 8 );
        debugmsg(dword_5BC4, "channel_mask 0x%08x -> num %d", v14, v15);

Da wirds dann mit meinen Reverse Engineering Künsten leider auch schon eng, denn wo genau diese Zahl eigentlich herkommt sehe ich da leider nicht, aber vielleicht hat da jemand anders ja mehr Glück/Erfahrung.

Das es die Tuner-Anzahl ist bezweifel ich spätestens seit ich
Code:
int di_get_number_of_tuners()
{
  return dword_5C64;
}
gesehen hab nicht mehr.

Kleiner Edit: SR ist selbstverständlich die Symbolrate.....Invb müsste specinv aus den Parametern sein, also Spectral Inversion. Dann bleiben noch die ganzen Parameter von di_alloc_stream_param die analysiert werden müssen.

Noch ein Edit: Kann der Segfault beim schließen eines Streams eventuell davon kommen, das di_close_stream nur ein Argument erwartet? IDA zeigt es mir als int __cdecl di_close_stream(_DWORD *a1) an.
 
Zuletzt bearbeitet:
Die Stabilitaetsprobleme habe ich, denk ich, behoben, und das ganze etwas generischer gemacht .. siehe README
Einen use-case mit tvheadend habe ich dokumentiert, das funktioniert jetzt soweit gut. Wo ich mir nach wie vor nicht sicher bin ist ob man tvheadend nicht direkt mit einem transport stream fuettern kann.

Was nach wie vor zum stottern fuehrt ist wenn mehrere Kanaele (ich hatte 2xHD) auf einem tuner uebertragen werden (dann aber wohl auch nur auf diesen Kanaelen). Das sieht man auch sofort an den "continuity errors".

Brauchbar ist das natuerlich nur wenn man eh schon einen dedizierten server laufen hat. Aber libdvbif.so komplett zu reverse-engineeren sieht mir nach viel Aufwand aus.

Edit:
Ich bin mir auch nicht mehr sicher ob die Atom CPU genug Wumms hat.
Ich habe da keinerlei Erfahrung und weiss nicht was da alles zu tun ist, aber jeder der 4 dvblast Instanzen belegt ca 4-6 % CPU last .. auf einem Xeon-D. Man darf davon ausgehen dass das auf einem Atom etwas mehr ist ...
 
Zuletzt bearbeitet:
Falls noch von Interesse, ich habe nochmal etwas Hand an meine cableinfo Modifikation gelegt.
- Generierung von RTP, d.h. kein Umweg über externen forwarder (schneller als AVM, langsamer als UDP TS)
- Die send-routine ist jetzt multi-threaded. Das Beschleunigt sogar den original AVM code...
 
also ist dein cableinfo jetzt ein drop in replacement für die original AVM binary aber schneller?
 
Das binary bleibt gleich, es wird nur eine "glue library" zwischen cableinfo und libdvbif.so gehängt. Die beschleunigt das ganze.
 
Ich hab jetzt auch die Methode mit dem "neuen" RTP im Einsatz, habs mit 3 Sendern auf TVHeadend getestet und bin schwer beeindruckt.

Eine Frage bleibt aber: Was ist denn der erhoffte Vorteil von den großen UDP Frames? Irgendwo dort ist die MTU ja auch erreicht, also verstehe ich deinen Gedankengang dabei noch nicht so ganz (bitte nicht als Vorwurf verstehen), vielleicht kannst du das ja nochmal kurz erläutern
 
Zuletzt bearbeitet:
Statt 20 mal "RTP header basteln und writev() aufrufen" nur ein mal pro frame.
 
Ich hab heute das vielversprechende Update, was schon auf der 6590 die Probleme gelöst hat, auf die 6490 gespielt und war um ehrlich zu sein sehr überrascht, das Problem ist leider nicht gelöst sondern eher noch schlimmer geworden.....

@fesc Geht dein Workaround auch mit FritzOS 7 auf der 6490? Ohne Änderungen ist die Funktion jetzt kompltt nicht nutzbar.....
 
@fesc Geht dein Workaround auch mit FritzOS 7 auf der 6490? Ohne Änderungen ist die Funktion jetzt kompltt nicht nutzbar.....
ich glaube fast, es ist etwas sehr früh für eine Frage iBa 6490+7.xx - aber natürlich wird diese früher oder später eh gestellt, daher GW - Du bist erster ;)
 
Es gibt ja schon die FritzOS 7 branch, und die läuft schon lange auf der 6590, und auch auf der 6490 läuft das ganze. Jetzt geht es nur noch um den Wrapper (wo hier ziemlich sicher jeder dachte das der nicht mehr gebraucht wird). Oder kann man einfach den cableinfo daemon von der 6590 auf die 6490 kopieren? Auf der 6590 läuft das Teil nämlich echt gut.
 
Ich hab heute das vielversprechende Update, was schon auf der 6590 die Probleme gelöst hat

Nur um das zu verstehen.. laeuft das 7.00 cableinfo auf 6590 nun besser (schneller) oder so schlecht wie vorher? Welches "Update" meinst du hier?

Generell:
Ich habe leider keine 6590, also haben sich meine bisherigen Versuche darauf beschraenkt mit dem 7.0 image der 6590 auf der 6490 zu arbeiten.
Dass allerdings nur auf meiner Bastelbox und nicht am Kabel (da in dieser Konstellation WLAN nicht funktioniert). Damit kann ich leider auch meinen wrapper nicht testen/anpassen (und die 6490 laborversionen liefen mir zu instabil um sie ans Kabel zu lassen).
Wass ich weiss ist dass er mit der FritzOS7 Version von cableinfo nicht funktioniert (stuerzt recht schnell ab), weshalb er momentan nicht im FritzOS7 branch gebaut wird. Ich nehme an es hat sich die eine oder andere API geandert, es ist ja jetzt wohl auch ein SatIP server mit drinnen.

Angesichts der technisch relativ trivialen Aenderung meinerseits waere es allerdings schon recht enttaeuschend wenn sich da an der Performance nichts getan hat. Wenn sie schon SatIP einbauen waere das auch noch drin gewesen.

Oder kann man einfach den cableinfo daemon von der 6590 auf die 6490 kopieren
Kommt halt auf die toolchain drauf an (uClibc 1). Auf der 7.x laborversion der 6490 sollten auch binaries der releaseversion von 7.x laufen.
 
Auf der 6590 läuft es ohne Probleme, auf der 6490 die heute ja FritzOS 7 erhalten hat aus irgendeinem Grund nicht. Da kriege ich bereits bei einem HD Stream massig continuity errors sowie Bildstörungen, was im Normalfall Paketverlust bedeutet (das war vorher auch das Fehlerbild).
 
die heute ja FritzOS 7 erhalten hat
Oh, gar nicht mitbekommen .. dann vielleicht einfach mal cableinfo rueberkopieren (evtl. mit libdvbif).

Edit: Die binaries sind identisch .. also daran kanns nicht liegen.

Edit2: Es scheint tatsaechlich so dass cableinfo nun effizienter laeuft, bei einem HD kanal ist die CPU last wesentlich niedriger.
Entgegen obiger Aussage laeuft aber auch mein wrapper noch (vielleicht lag es vorher nur daran dass kein Kabel verbunden war).
Ich habe mal das repositiry aktualisiert und ein beta application package fuer 6x90/FritzOS 7 hochgeladen.
 
Zuletzt bearbeitet:
Seit dem Update auf 7.0 auf der 6490 habe ich dort Bildstörungen durch continuity errors (auch bei einem Kanal). Das Problem gibts auf der 6590 nicht, was bei identischen binaries ja noch verwunderlicher ist. Auch vor dem Update war es mit dem Wrapper nicht da. Läuft's denn bei dir flüssig mit einem HD Stream?
 
Ja, und die CPU last war bei ~15% niedrig im Vergleich zu vorher.
 
Also mit dem Wrapper und

Code:
+++ redir[0]: IP=0.0.0.0 PORT=-2
+++ redir[0]: DST_IP=0.0.0.0 DST_PORT=-1

läufts bei mir gar nicht. Der Daemon startet zwar, aber es gibt kein Bild/Ton und nach dem öffnen des Streams spinnt kurze Zeit später die übersichtsseite. Da wurde mir auch kurzzeitig eine negative Frequenz angezeigt.

Ohne Wrapper zeigt VLC mir auch einige Verlorene Bilder und Audio Puffer an, sowie einige ausgelassenen Daten. Das äußert sich im Stream durch einige Fehler im Bild, also keine ganzen Aussetzer mehr sondern eben nur kleine Bildstörungen (als ob der Empfang zu schlecht wäre, aber die Werte sind Top).
 
Hallo, ich habe auch die 6490 und verwende den Sat IP-Server in Verbindung mit TVHeadend.
Ich habe genau die gleichen Probleme mit den Bildstörungen, sobald man mehr als 2 HD-Sender tuned, deshalb habe ich auf FritzOS 7 gewartet.
Seit dem Update gehen über TVHeadend gar keine Sender mehr - auch nicht ARD und ZDF.
Das Backend gibt mir beim Tuningversuch immer folgende Meldungen:

2018-09-29 20:15:29.541 satip: SAT>IP DVB-C Tuner #1 (192.168.4.1) - RTSP cmd error 7 (Unbekannter Fehler -7) [8-408]
2018-09-29 20:15:31.402 subscription: 0032: service instance is bad, reason: Tuning failed

Hat jemand eine erste Idee, woran das liegen könnte?

Liebe Grüße
 
läufts bei mir gar nicht
Da ist eh noch ein Problem, Crash/Haenger beim stream schliessen, irgendwann rebootet die ganze box. Also den wrapper erst mal besser nicht verwenden. Aber prinzipiell gings bei mir.

Hat jemand eine erste Idee, woran das liegen könnte
Hast Du bei tvheadend (configuration->tv adapters->network type) "DVB-C" ausgewaehlt (ich hatte das erst auch, danach gings)?

Generell faengt es bei mir erst ab dem 4ten HD stream zu ruckeln an wenn die CPU last gegen 45% geht.
 
Zuletzt bearbeitet:
@fesc @Flole:
Danke für eure Tipps, das mit specinv auf On hat geklappt.

Mein nächstes Problem ist, dass nur noch Tuner 1 von der FritzBox verwendet wird, obwohl ich DVB-C4 ausgewählt habe und die Tuner an unterschiedliche IP-Adressen gebunden sind.
Hattet ihr zufälligerweise auch das gleiche Problem?

Meine Einstellungen im TVheadend:
Fritzbox:
upload_2018-9-30_12-59-47.png

Tuner 2:
upload_2018-9-30_12-58-41.png

Wenn alles klappt, teste ich das Ganze auch mal und berichte dann über meine Ergebnisse.

Danke euch!

Liebe Grüße

//edit by stoney: Bilder geschrumpft
 
Zuletzt bearbeitet von einem Moderator:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.