Bitte um Hilfe beim Debuggen: Absturz beim Umschalten der Audio-Spur in PES

  • Es läßt mir keine Ruhe, warum es beim Umschalten der Audio-Spur in PES-Aufnahmen immer wieder zu Abstürzen kommt. Eventuell schlummert da noch ein Bug, der sich auch bei TS-Aufnahmen auswirken könnte, halt eben nur mit niedrigerer Wahrscheinlichkeit. Bevor das nicht geklärt ist, habe ich kein gutes Gefühl mit der Version 2.0.0...


    Zur Vorgehensweise: entferne die Zeilen

    Code
    if (isPesRecording)
         return; // for some unknown reason this doesn't work with PES recordings - causes a segfault


    in der Funktion cDvbPlayer::SetAudioTrack() (dvbplayer.c) und starte die Wiedergabe einer PES-Aufnahme, die mehrere Audio-Spuren enthält. Nun schalte mehrfach zwischen den Audio-Spuren hin und her. Irgendwann bleibt die Wiedergabe hängen und nach einiger Zeit schlägt der Watchdog zu und/oder er stürzt ab.


    Es wäre nett, wenn einige von euch mal versuchen könnten, das erstens nachzuvollziehen und zweitens vielleicht sogar die Ursache zu finden. Mehr Augen sehen einfach mehr...


    Klaus

  • Ich hab das ganze mal mit zwei PES Aufnahmen probiert und die Audiospuren mehrfach gewechselt. Konnte es leider nicht nachvollziehen. Das einizge was mit aufgefallen ist: Beim Wechseln der Audiospuren sprang die Wiedergabe einige Sekunden zurück. Könnte natürlich auch am Ausgabedevice liegen (sothddevice). Werd aber nochmal probieren.


    EDIT: Ich meine mich aber zu erinnern, dass ich das Problem früher mal mit xineliboutput oder xine hatte. Welche Ausgabe verwendest Du? dvbhddevice? Dann liegt der Fehler vielleicht dort.

    - Client1: Thermaltake DH 102 mit 7" TouchTFT * Debian Stretch/vdr-2.4.0/graphtft/MainMenuHooks-Patch * Zotac H55-ITX WiFi * Core i3 540 * 4GB RAM ** Zotac GT630 * 1 TB System HDD * 4 GB RAM * Harmony 900 * satip-Plugin

    - Client2: Alfawise H96 Pro Plus * KODI
    - Server: Intel Pentium G3220 * DH87RL * 16GB RAM * 4x4TB 3.5" WD RED + 1x500GB 2.5" * satip-Plugin
    - SAT>IP: Inverto iLNB

  • Ich hab das ganze mal mit zwei PES Aufnahmen probiert und die Audiospuren mehrfach gewechselt. Konnte es leider nicht nachvollziehen. Das einizge was mit aufgefallen ist: Beim Wechseln der Audiospuren sprang die Wiedergabe einige Sekunden zurück. Könnte natürlich auch am Ausgabedevice liegen (sothddevice). Werd aber nochmal probieren.


    Es tritt auch bei mir nicht immer auf. Manchmal dauert es 10, 20 mal bis es auftritt, manchmal sogar gar nicht und ich muß VDR neu starten, um es provozieren zu können. Sieht irgendwie nach Race-Condition aus...


    Zitat


    EDIT: Ich meine mich aber zu erinnern, dass ich das Problem früher mal mit xineliboutput oder xine hatte. Welche Ausgabe verwendest Du? dvbhddevice? Dann liegt der Fehler vielleicht dort.


    Ja, ich benutze dvbhddevice. Aber bisher habe ich keinen Hinweis darauf gesehen, daß es daran liegen würde. Auszuschließen ist es natürlich auch nicht, darum wäre es sehr hilfreich, wenn jemand mit einem anderen Ausgabedevice es auch nachvollziehen könnte.
    Wie gesagt, es tritt nur sporadisch auf.


    Klaus

  • Bei mir bleibt er reproduzierbar in LOCK_THREAD in Goto() hängen.
    Wenn ich dies herausnehme, bleibt er in LOCK_THREAD in Empty() hängen.
    Nehme ich dies auch heraus, funktioniert die Umschaltung meistens. Manchmal gibt es einen Segfault.


    Was auffällt:
    Bei der PES-Aufzeichnung startet die Wiedergabe immer am Anfang.
    Stimmt da etwas mit index oder resume nicht?


    CU
    Oliver

  • Bei mir bleibt er reproduzierbar in LOCK_THREAD in Goto() hängen.
    Wenn ich dies herausnehme, bleibt er in LOCK_THREAD in Empty() hängen.
    Nehme ich dies auch heraus, funktioniert die Umschaltung meistens. Manchmal gibt es einen Segfault.


    Das ist ja schon mal interessant...


    Zitat


    Was auffällt: Bei PES-Aufzeichnungen startet die Wiedergabe immer am Anfang.
    Stimmt da etwas mit index oder resume nicht?


    Bei mir startet er PES-Wiedergaben immer da, wo ich aufgehört habe. Es sei denn, er ist abgestürzt und konnt die resume.vdr nicht mehr schreiben. Könnte das dein Problem sein? Oder sind deine PES-Aufnahmen vielleicht in einem read-only Verzeichnis?


    Klaus


  • Das ist ja schon mal interessant...


    Klassischer Deadlock?


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470


  • Das ist ja schon mal interessant...



    Bei mir startet er PES-Wiedergaben immer da, wo ich aufgehört habe. Es sei denn, er ist abgestürzt und konnt die resume.vdr nicht mehr schreiben. Könnte das dein Problem sein? Oder sind deine PES-Aufnahmen vielleicht in einem read-only Verzeichnis?


    Liegt nicht an den Zugriffsrechten. resume.vdr wird geschrieben, aber offenbar beim Starten der Wiedergabe nicht beachtet. Es gab auch keinen Absturz.


    Ich starte die PES-Wiedergabe, springe mit "rot" 30min nach vorne, stoppe mit "blau".
    Drücke ich wieder "blau", geht es am Anfang wieder los.


    <edit>
    Packt man das return in SetAudioTrack() wieder rein, funktioniert das Resume. ?(
    </edit>


    Ich vermute, es zeigt irgendwo ein Ptr in den Wald und es gibt einen Überschreiber "mit wechselndem Effekt".


    Am Beginn von Goto() lasse ich mir den "index"-Ptr ausgeben. In einem Fall hatte dieser einen merkwürdigen Wert. Dann gab es einen Segfault. Läßt sich momentan aber nicht mehr reproduzieren...


    CU
    Oliver


  • Liegt nicht an den Zugriffsrechten. resume.vdr wird geschrieben, aber offenbar beim Starten der Wiedergabe nicht beachtet. Es gab auch keinen Absturz.


    Ich starte die PES-Wiedergabe, springe mit "rot" 30min nach vorne, stoppe mit "blau".
    Drücke ich wieder "blau", geht es am Anfang wieder los.


    Ich hab das jetzt mal versucht, nachzustellen, aber es verhält sich immer wie erwartet.
    Dabei habe ich beim Springen um 30 Minuten nach vorne sowohl mit Play als auch mit Pause getestet.
    Schon seltsam das...


    Zitat


    Ich vermute, es zeigt irgendwo ein Ptr in den Wald und es gibt einen Überschreiber "mit wechselndem Effekt".


    Sehr wahrscheinlich - nur leider recht schwer zu finden...


    Zitat


    Am Beginn von Goto() lasse ich mir den "index"-Ptr ausgeben. In einem Fall hatte dieser einen merkwürdigen Wert. Dann gab es einen Segfault. Läßt sich momentan aber nicht mehr reproduzieren...


    Hmm, das würde ja fast heißen, daß er sich den index-Pointer zerschießt.
    Aber warum tritt das nur in dieser konkreten Konstellation auf? Goto() wird ja auch ansonsten immer wieder gemacht...


    Klaus

  • Wilde pointer sollte man mit dem address-sanitizer finden. Ist im gcc 4.8 und in neuen clangs enthalten.
    Mit valgrind wird vdr wahrscheinlich zu langsam obwohl ich damit auch schon Bugs in Plugins gefunden habe.



    Gesendet von meinem iPad mit Tapatalk HD

    VDR: Thermaltake DH102, Asus M3N78-PRO AMD 4850e, GT 220 passiv, 1x Mystique SaTiX-S2 Dual

  • Moin,


    habe gestern auch relativ lange getestet und konnten von Klaus beschriebene Verhalten nicht nachvollziehen. Meine Konfiguration: 1x DD 6.5 Sat + 1x 2.3er FF-SD im outputonly Modus.


    Gruß Ralph

  • Noch ein paar Erkenntnisse (SD-FF auf 32-Bit System):


    Der LOCK_THREAD-Deadlock tritt immer auf - auch bei der Audio-Umschaltung von TS.
    Hatte ich bisher nicht getestet.


    Mit VDR 1.7.38 gibt es dieses Problem nicht, weder mit TS noch mit PES!


    CU
    Oliver

  • Noch ein paar Erkenntnisse (SD-FF auf 32-Bit System):


    Gut zu wissen, daß es schon mal nicht vom Ausgabedevice abhängt.


    Zitat


    Der LOCK_THREAD-Deadlock tritt immer auf - auch bei der Audio-Umschaltung von TS.
    Hatte ich bisher nicht getestet.


    Danke, das ist ein ganz wichtiger Hinweis. Bei mir war es bei TS nie und bei PES gleich beim ersten Versuch aufgetreten. Daher glaubte ich, daß es an PES liegt.
    Also ist das jetzt momentan der "Show Stopper" für Version 2.0.0 ;-).


    Zitat


    Mit VDR 1.7.38 gibt es dieses Problem nicht, weder mit TS noch mit PES!


    Der Goto()-Aufruf kam auch erst in der 1.7.39 rein, um das Stottern nach dem Umschalten des Audio-Tracks zu beheben.


    Danke für deine Hinweise, Ich werde weiter forschen...


    Klaus


  • Danke, das ist ein ganz wichtiger Hinweis. Bei mir war es bei TS nie und bei PES gleich beim ersten Versuch aufgetreten. Daher glaubte ich, daß es an PES liegt.


    Nachdem ich jetzt immer weitere Debug-Ausgaben eingebaut habe, habe ich bemerkt, daß die Aufnahme, mit der ich zuletzt immer getestet hatte, doch eine TS-Aufnahme ist. Also ist das "... in PES" im Thread-Titel auf jeden Fall hinfällig. Die erste Aufnahme, bei der das Problem hier aufgetreten ist, war eine PES-Aufnahme, aber irgendwann muß ich wohl auf eine andere Aufnahme gewechselt sein, von der ich irrtümlich annahm, daß es auch eine PES-Aufnahme sei.


    Inzwischen habe ich es auch mit einer ganz aktuellen TS-Aufnahme von gestern nachvollziehen können. Es ist also unabhängig von PES/TS und auch vom Alter der Aufnahme.
    Am schnellsten kann man es provozieren, wenn man die "Audio"-Taste gedrückt hält und dadurch schnell durch die Tracks schaltet. Ein weiteres Indiz für ein Timing-Problem.


    Das nur der Vollständigkeit halber. Ich verfolge jetzt die Lock-Problematik weiter...


    Klaus

  • So, jetzt habe ich die Beteiligten an dem Deadlock ausgemacht.


    cDvbPlayer::Action() macht LOCK_THREAD und lockt dann über cDevice::PlayTs() den mutexCurrentAudioTrack.


    cDevice::SetCurrentAudioTrack() lockt den mutexCurrentAudioTrack und macht dann über cDvbPlayer::SetAudioTrack() und cDvbPlayer::Goto() ein LOCK_THREAD.


    Also der "Klassiker", wie von Gerald schon so treffend bemerkt.


    Mal sehen, wie ich das auflösen kann. Auf jeden Fall Danke an alle, die mitgemacht haben.


    Klaus


  • Ich hab das jetzt mal versucht, nachzustellen, aber es verhält sich immer wie erwartet.
    Dabei habe ich beim Springen um 30 Minuten nach vorne sowohl mit Play als auch mit Pause getestet.
    Schon seltsam das...


    War mein Fehler, da ich versehentlich mit einer TS-Aufnahme getestet hatte.
    Nachdem ich es jetzt definitiv mit einer PES-Aufnahme probiert habe, kann ich das Problem doch nachvollziehen.
    Sorry wegen der Falschmeldung.


    Klaus

  • So, der erste Teil des Problems sollte mit beiliegendem Patch gelöst sein.
    Nachdem in cDevice::PlayPesPacket() und cDevice::PlayTs() nur lesend auf availableTracks[current(Audio|Subtitle)Track].id zugegriffen wird und dieses Array immer an der gleichen Adresse liegt, sollte es hier auch ohne einen Lock auf mutexCurrentAudioTrack gehen. Bei intensiven Tests konnte ich zumindest keine Probleme mehr beobachten.


    Klaus

Jetzt mitmachen!

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