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

  • Der Absturz hat eigentlich nichts mit der Ausgabe zu tun, sondern, ob er entschlüsselt werden kann oder nicht.
    Beim Setzen der CA-IDs aus den DVB-Daten geht irgendwas schief.


    Lars.

  • Hallo zusammen,


    jetzt muss ich mich doch mal zu Wort melden. Lese hier normalerweise nur mit ;)...
    Ich hab mal etwas gedebugged:
    die "Length" die da "AddCaDescriptors" übergeben wird kommt in dem Fall immer von


    int GetCaDescriptors(int Source, int Transponder, int ServiceId, const int *CaSystemIds, int BufSize, uchar *Data, int EsPid)


    aus "pat.h". Laut Kommentar gibt die Funktion nur dann -1 zurück, wenn der Buffer "Data" zu klein ist, um alle CA Descriptors zu speichern. Die cCiCaPmt Konstrukturen übergeben hier immer einen 512B großen Buffer. Hab die testweise mal auf 1K vergrößert und jetzt scheints wieder zu laufen.


    Den entsprechenden Patch findet Ihr im Anhang. Allerdings verstehe ich von der Materie zu wenig, um zu beurteilen, ob das wirklich eine gute Lösung ist. Die 512B scheinen mir genauso willkürlich wie 1K. Oder gibt`s da irgendeinen Standard, laut dem 512B normalerweise die Obergrenze sind.


    Gruß,
    Stefan

  • Ich habe auch inzwischen auch noch etwas getestet und feststellen müssen, dass es eigentlich am VDR liegen muss und nicht an einem der "unaussprechlichen" Plugins.


    Ich habe verschiedene vdr-plugins getestet und bei allen ist der VDR abgeschmiert, sobald ich auf n-tv HD geschaltet habe..
    Im Gegensatz dazu macht mein DVB-Viewer keinerlei Probleme, welcher vom Windows-PC ebenfalls auf den VDR-PC zugreift, in dem die HD+Karte steckt.
    Damit ist m. M. n. die eigentliche Ursache beim VDR selber zu suchen!


    Paulaner

  • Das mit dem zu kleinen Buffer und zu vielen IDs klingt plausibel.
    In Kombination mit meinem Patch sollte es dann häufiger klappen, bis die Anzahl wieder vom Sender erhöht wird.


    Alternativ kann der vdr den Buffer auch dynamisch erhöhen, bis es passt oder GetCaDescriptors liefert die nötige Größe zurück.


    Lars

  • Wenn die

    GetCaDescriptors

    -1 zurückgeben kann, dann muss der VDR auch das verarbeiten ohne segfault.

  • stefan.r
    Vielen Dank für den Patch! Damit habe ich wieder Bild bei n-tv HD


    Warum sind denn eigentlich die CAIDs (aus der Channels.conf)

    Code
    1830,1843,1860,98C,9C4,648,650,186A,500


    zu groß für den 512 Byte Puffer?
    Selbst wenn ich die 9x4 (z. B. 1843) rechne sind das "nur" 36 Byte (Zeichen)

  • Der Absturz hat eigentlich nichts mit der Ausgabe zu tun, sondern, ob er entschlüsselt werden kann oder nicht.
    Beim Setzen der CA-IDs aus den DVB-Daten geht irgendwas schief.


    Da kennst Du dich 1000x besser aus als ich, ich wollte nur berichten wie der Status bei einem rpi2 ist. Weil der Sender könnte entschlüsselt werden, wenn requestet, war aber nicht der fall (nur das was ich im log gepostet habe), ich habe da alles von VDR (vdpau) übernommen, wo es zu einem segfault kommt, bspw. anderer Privater HD Sender waren aber hell.



    Was mir noch aufgefallen ist, ist die Höhe der CPU Auslastung bei verschlüsselten Sender. Auf der VDR (vdpau) Box habe ich einen Patch von manio benutzt (siehe unten) welche als ein Workaround für hohe CPU Auslastung bei ihm gedient hat. Kann es sein, dass hier das Problem auch eine zu hohe CPU Auslastung ist (also das mit Setzen der CA-IDs aus den DVB-Daten)? Bspw. bei Servus HD ist die CPU Auslastung auf RPI 2 max 18% (RPI2 hat einen direkt angebundenen Tuner), und beim OxF ist es max 78%. Es sind nur rpihddevice, cecremote und dvbXpi von PlugIns geladen.


    2 Mal editiert, zuletzt von crow ()

  • Der sleep entschärft die Schleife ein wenig und gibt anderen Threads Gelegenheit, etwas zu tun. Bei poll-Schleifen ist sowas manchmal sinnvoll. Mal sehen, ob ich heute Abend in den Source gucken kann...


    Lars

  • stefan.r
    Vielen Dank für den Patch! Damit habe ich wieder Bild bei n-tv HD


    Warum sind denn eigentlich die CAIDs (aus der Channels.conf)

    Code
    1830,1843,1860,98C,9C4,648,650,186A,500


    zu groß für den 512 Byte Puffer?
    Selbst wenn ich die 9x4 (z. B. 1843) rechne sind das "nur" 36 Byte (Zeichen)

    In so einem Descriptor steht schon noch mehr drin als nur die CAID. Erst mal kommen 6 Byte Header (davon sind Byte 3+4 die CAID) und danach bis zu 256 Byte Nutzdaten. Und die Methode GetCaDescriptors gibt ja eine Liste zurück. In den Buffer passt im Worst Case also nur einer.

  • stefan.r
    Vielen Dank für den Patch! Damit habe ich wieder Bild bei n-tv HD


    Da ja also mit diesem Patch das Problem mit n-tv HD behoben ist, ergibt sich die Frage: "Soll jetzt jeder selbst den VDR patchen oder gibt es dazu in nächster Zeit einen gepatchten VDR für yaVDR-0.5? "


    Paulaner

  • Jeder darf seinen vdr patchen, aber ich schau mal, was ich für yavdr machen kann. :)
    Vermutlich aber nur testing, d.h. vdr 2.2.0 (aber natürlich auch für yavdr 0.6).


    Lars.

  • Moin!


    Ich hab hier mal einen etwas umfangreicheren Patch fertig gemacht, der zum einen die benötigte Größe beim ersten Aufruf zurückgibt, falls der Buffer zu klein ist, und diesen dann dynamisch erweitert und noch mal versucht, die CA-IDs zu bekommen. Wenn's dann immer noch nicht klappt, ist's halt Pech.


    Da ich keine verschlüsselten Sender habe, mag das mal jemand testen?
    Ich hab die Buffergröße bewusst bei 512 gelassen, damit man im Log sieht, wie groß der Buffer für n-tv wirklich sein muss. Es müssten dann Zeilen wie "DEBUG: buffer for ca-descriptors too small (x, needed y)" erscheinen.


    EDIT: In AddCaDescriptors die Prüfung "Length <= 0" durch "Length < 0" ersetzen, neuer Patch kommt irgendwann...
    EDIT2: Neue Patchversion gibt es hier: VDR startet auf genau einem Sender (NTV HD) einfach neu


    Lars.

  • In so einem Descriptor steht schon noch mehr drin als nur die CAID. Erst mal kommen 6 Byte Header (davon sind Byte 3+4 die CAID) und danach bis zu 256 Byte Nutzdaten. Und die Methode GetCaDescriptors gibt ja eine Liste zurück. In den Buffer passt im Worst Case also nur einer.


    Wenn das so ist, dann war das nur Zufall, das bis jetzt alles geklappt hat. Der Buffer müsste eher 512k groß sein. Am besten wäre natürlich, dass der Puffer einfach mit der Anzahl der Einträge wächst.

  • Ich sehe gerade, dass "uint8_t capmt[2048];" in cCiCaPmt überlaufen kann. Da ist zwar ein Kommentar wegen overflow-check, aber es ist keiner drin.
    Ein böser Sender kann also den vdr auch weiterhin zum Abstürzen bringen. Mal gucken, ob ich das auch noch korrigiert bekomme.
    Zumindest einen check kann ich da noch einbauen.


    Lars.

  • So der Patch läuft. Log wird bei n-tv HD wie folgt ausgegeben:

  • Ja, habe Bild auf n-tv-HD


    Aber die 0er müssen nicht protokolliert werden:

    Code
    Dec 03 13:04:15 [vdr] [15836] DEBUG: calling AddCaDescriptors with Length 0 
    - Last output repeated twice -

    Die kommen auch auf anderen Kanälen, wo das Problem gar nicht existiert

Jetzt mitmachen!

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