VDR startet auf genau einem Sender (N-TV HD) einfach neu

  • reicht schon, wenn man aus der letzten Zeile das "=" entfernt

    Code
    ...
     void cCiCaPmt::AddCaDescriptors(int Length, const uint8_t *Data)
     {
    +  if (Length <= 0) {
    ...


    Hatte ich beim vorherigen Patch so gemacht

  • Also an die Tester: die Prüfung "Length <= 0" durch "Length < 0" ersetzen.
    Ich schau mal, ob ich das mit dem buffer overflow check noch hinbekomme, wird evtl. aber erst am Wochenende was.


    Lars.

  • Ich will aber, dass er bei Length == 0 vorzeitig aus der Funktion aussteigt.

    Ohne Patch wird das im VDR ja schon immer verarbeitet.


    Plan B wäre eine CASE Anweisung. Bei 0 ein return und bei -1 zusätzlich loggen. Aber mit dem jetzigen Patch gibt es ja kein -1 mehr


    Plan C das <= lassen und nicht loggen.


    Ist alles eher kosmetisch. Hauptsache das -1 wird abgefangen wegen dem Segfault! Das sollte dann auf jeden Fall im VDR bleiben, da man ja nie wissen kann...

  • Hallo zusammen,


    erst einmal vielen Dank an alle, die sich um eine Lösung der Problematik bemühen!


    Ich habe den letzten Patch (vdr-2.2.0-caid_buffer-v1.diff) von Lars (mini73) eingespielt, und damit geht jetzt auch bei mir nTV-HD wieder bei aktuellem dvb(api) und os(cam).


    Gruß
    Neo


    PS: Nur eine Frage. Kann es sein, dass der VDR bei "erweiterter Prüfung" der CAIDs etwas länger fürs Umschalten braucht ... ?

  • Hast du auch in ci.c in der Funktion AddCaDescriptors den Vergleich auf "Length < 0" geändert?
    Eventuell ist "Length == 0" genau für diese Funktion wichtig.


    Lars.

  • Plan B wäre eine CASE Anweisung. Bei 0 ein return und bei -1 zusätzlich loggen. Aber mit dem jetzigen Patch gibt es ja kein -1 mehr


    Nein, ich denke, das richtige ist, nur bei "< 0" zu loggen und rauszuspringen.


    Lars.

  • Hast du auch in ci.c in der Funktion AddCaDescriptors den Vergleich auf "Length < 0" geändert?
    Eventuell ist "Length == 0" genau für diese Funktion wichtig.


    Lars.


    Hi Lars,


    habe Deinen Patch so wie er war eingespielt und da stand dann

    Code
    [..]
    if (Length <= 0) {
         dsyslog("DEBUG: calling AddCaDescriptors with Length %d", Length);
         return;
         }
    [..]


    Soll ich die Passage mal auf "Length == 0" abändern und dann testen?

  • Obwohl schon gepostet, hier auch das resultat mit meinem RPI2. Nutze Patch von Lars mit '<=' auf '<' änderung.


    [spoiler]

    [/spoler]

  • crow
    Prima, sieht ja gut aus. Dann könnte man den Standard-Buffer wohl einfach mal auf 1024 oder so erhöhen.


    Ich mache am Wochenende einen neuen Patch fertig, heute hab ich noch Termine...


    Lars

  • Neo68x


    Nein, auf < 0


    Lars


    OK!


    Danke & Gruß
    Neo


    PS: Ich habe mal den "cw-cache" von os(cam) gelöscht - also die *.cwl-Dateien im entsprechenden Verzeichnis - jetzt schaltet der VDR wieder "normal" um, ohne dass ich den Quellcode angepasst habe.

  • So wie es aussieht, wird mit dem Patch auf n-tv HD ein zweites mal umgeschlatet, was die relativ lange Zeit bis zum Bild erklärt.


  • ... das Log zeigt bei mir die gleichen Einträge; aber wie gesagt, nach dem Löschen des CW-Cache geht es wieder "normal schnell".


  • Leider bei mir gibt es viele artefecte:



    Hier war es noch schlimmer

  • Einfach wie von stefan.r vorgeschlagen den Buffer auf 1024 Byte erhöhen. Damit sollte man erstmal auf der sicheren Seite sein und die Umschaltzeiten bleiben auch normal.


    Bei tvheadend z.B. ist die Zahl der caDescriptors auf 16 beschränkt. Dort wird mit linked-lists gearbeitet wenn ich den code richtig verstanden habe und der nötige Speicher so nach Bedarf alloziert.

  • Jetzt habe ich einen Crash hier, obwohl keinen coredump erstellt. Nach umschalten ist einfach OSD geblieben und VDR hat sich neue gestartet. In dmesg auch nichts auffälliges.


  • Das war kein Absturz, sondern es kamen so lange keine Daten, da hat der watchdog zugeschlagen. Da wird wohl was an anderer Stelle geklemmt haben.


    Im finalen Patch werde ich auch eine Buffergröße von 1024 eintragen, dann sollte nur noch sehr selten (wenn überhaupt) der Speicher neu angelegt werden.


    Dass zwei mal auf den Kanal geschaltet wurde, liegt nur daran, dass sich irgendwas am Kanal geändert hat (eine PID oder so?), sieht man am "retuning".


    Und wenn das Tonformat ständig wechselt, kann es zu den beschriebenen Problemen kommen.


    Allgemein kann es sein, dass das Entschlüsseln dieses Kanals den vdr etwas aus dem Tritt bringt oder der Sender sendet einfach komischen Mist. Vielleicht muss da mal ein Encoder resettet werden. :)


    Lars.

  • In Bash würde ich das mir Arrays machen, wo man einfach einen neuen Eintrag dran hängen kann. So was ähnliches muss es doch in C auch geben. Dann braucht man keinen festen Puffer und so was wie mit n-tv HD kann erst gar nicht passieren.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!