web (HbbTV, VDR*ELEC), Milestone 1 erreicht

  • Bei der ARD-Mediathek in der Tagesschau-Übersicht kann ich die Videos nicht wechseln -

    Bei der Tagesschau passiert irgendwas und ich komme nicht dahinter. Die internen Server stellen komplett den Betrieb ein eine Verbindung ist nicht mehr möglich und es hilft nur ein Neustart. Ich vermute irgendwo einen Deadlock, finde den aber im Backtrace nicht.

    Ich habe nun eine Lösung gefunden. Wenn ich den cefbrowser nach dem vdr starte dann funktioniert es. Warum auch immer.

    Das ist seltsam. Vielleicht hat das etwas mit dem Shared Memory zu tun, den ich nutze um die OSD Bildchen zu übertragen. Kannst du mal den Browser mit "-q" starten, dann wird das shm nicht verwendet, sondern die Bildchen werden über das Netz übertragen. "-q" nutzt das Grafikformat qoi, das recht gut ist und rasend schnell.

    Wann nutzt du denn dash2ts zum abspielen von Videos? Bisher sehe ich immer nur den ffmpeg. Ich habe den remotetranscoder mit -a gestartet.

    Wenn ein mpeg dash abgespielt werden soll. In der ARD/ZDF Mediathek kann das z.B. mit der blauen Taste erreicht werden. Außer natürlich ein Film soll neu gestartet werden, dann geht das häufig wieder auf mp4. Woanders ist mir das noch nicht untergekommen, kann aber passieren.

    was mir noch aufgefallen ist: Wenn ein Stream/Video läuft, dann wird im Sekundentakt ein leeres OSD geschickt. Das ist sicher nicht notwendig :)

    Hmm. Ein leeres OSD? Normalerweise werden Updates nur gesendet, wenn der Browser der Meinung ist, in der Seite hätte sich etwas verändert. Das ist schon seltsam.

    Und dann habe ich auch noch einen Segfault:

    Man man man. Wie hast du das denn wieder geschafft? Vielleicht hängt das mit deinen (leeren) OSD Updates zusammen. Passiert das häufiger oder war das Zufall?

    Insgesamt gesehen denke ich, die Verwendung von Rest und der cpphttplib war ein Fehler. Die Socket-Probleme, die Tagesschau und und und. Gespielt habe ich auch zwischendurch mal mit websockets, nanomq und zeromq, aber auch da hatte ich so meine Probleme. Es wird Zeit für etwas neues und hoffentlich stabileres. Ich hatte erst grpc in Betracht gezogen, aber die Abhängigkeiten und die Build-Zeit sind furchtbar. Mein Favorit ist im Moment Apache Thrift. Die ersten Tests waren vielversprechend.
    Dabei ergeben sich auch verschiedene Optimierungspotentiale. Mal schauen.

  • Kannst du mal den Browser mit "-q" starten

    Ok das werde ich mal testen.

    Hmm. Ein leeres OSD? Normalerweise werden Updates nur gesendet, wenn der Browser der Meinung ist, in der Seite hätte sich etwas verändert.

    Das OSD wird nicht aktiviert. Es wird nur immer wieder ein leeres Image mit DrawImage eingestellt. Allerdings hat das leere Image dennoch eine Size von 1920x1080. Da werden viele Daten nutzlos geschauftelt.

    Du kannst ja mal ein Debug im web plugin einbauen wo das DrawImage abgesetzt wird.

    Wie hast du das denn wieder geschafft?

    Ich habe mich nur durch die Mediathek geklickt. Ist aber mehrmals aufgetreten und dann habe ich der VDR im gdb laufen lassen. Die coredumps sind unbrauchbar weil der Stack kaputt ist.

  • Mit -q funktioniert es auch wenn ich den cefbrowser vor dem vdr starte. Da hast du wohl wirklich noch ein Problem mit dem shared Memory.

    Das werde ich mir anschauen müssen, sobald ich die Umstellung auf Apache Thrift fertig habe.

    Die Umstellung scheint sich zu lohnen. Keine Probleme mit den Sockets, die Seiten sind schneller und das Video startet auch schneller. Also insgesamt gesehen viel flüssiger alles. Aber es gibt noch Unschönheiten, die beseitigt werden müssen :(

  • Es gibt für alle 3 Projekte (Plugin, Browser, Transcoder) neue Branches "thrift", die in Kombination die neue Funktionalität bereitstellen. Ich kann diese noch nicht in den master mergen, da ich für VDR*ELEC (auch Branch thrift) Abstürze und andere kleine Merkwürdigkeiten erlebe.

    Insgesamt gesehen ist es aber auch auf den N2+ ziemlich flüssig und macht Spaß, wenn es die Probleme nicht gäbe, die seltsamerweise auf der Entwicklungsmaschine so gar nicht auftreten.

    Also alle Branches sind aktuell nur für furchtlose Tester :)

  • Ich werde furchtlos sein und das mal testen...

    Btw, hast du mal eine force-push auf VDR*ELEC gemacht? Das ist nicht so gut :P

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---

    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.2 mit streamdev, satip/vtuner-ng, vdrmanager, live, epgsearch, markad ---

    (Client 1+2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---

    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Ein rebase auf einem produktiven Branch, den andere ziehen ist nicht gut, da man im schlechtesten Fall neu klonen muss und nichts mehr passt. In deinem Fall war das jetzt nicht so schlimm. Git ist anscheinend so clever, dass es bemerkt, dass sich am Code nichts geändert hat und nur die commit hashes und die Beschreibung unterschiedlich ist.

    Was einmal upstream ist, ist online. Dann lieber einen revert und den Commit neu pushen. Aber ist dein Repo ;)

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---

    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.2 mit streamdev, satip/vtuner-ng, vdrmanager, live, epgsearch, markad ---

    (Client 1+2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---

    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Es ging ja um die commit message. Genauer gesagt um den Unterschied zwischen jrie und @j1rie in einer commit message bei github. Die werden dort nämlich in Links umgewandelt.

    Hier bin ich jrie, bei github j1rie (jrie war bei github schon an jemand anderen vergeben).

  • Mit dem gdb habe ich zumindest einen Hinweis erhalten, wo ich den segfault im Plugin suchen muss:

    Code
    (gdb) bt full
    #0  0xc7e1c802 in ?? ()
    No symbol table info available.
    #1  0xeedf9a2c in WebOSDPage::scaleAndPaint(unsigned char*, int, int, int, int, int, int) () from /usr/local/lib/vdr/libvdr-web.so.6
    No symbol table info available.
    #2  0xeeded144 in VdrPluginWebServer::ProcessOsdUpdate(pluginweb::ProcessOsdUpdateType const&) () from /usr/local/lib/vdr/libvdr-web.so.6
    No symbol table info available.
    #3  0xeee159e4 in pluginweb::VdrPluginWebProcessor::process_ProcessOsdUpdate(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*) ()
       from /usr/local/lib/vdr/libvdr-web.so.6
    No symbol table info available.

    Jetzt gilt es herauszufinden, wo und was da schief gehen kann.

  • Hast du mit DEBUG gebaut? Mit "export DEBUG=_vdr-plugin-web" solltest du auch die symbol tables bekommen...

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---

    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.2 mit streamdev, satip/vtuner-ng, vdrmanager, live, epgsearch, markad ---

    (Client 1+2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---

    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Hast du mit DEBUG gebaut? Mit "export DEBUG=_vdr-plugin-web" solltest du auch die symbol tables bekommen...

    Verdammt. Das habe ich jetzt die ganze Zeit gesucht :wand


    jojo61

    Hast du den Parameter "-f" für das web-Plugin gesetzt? Sobald ich den setze, bekomme ich gar kein OSD mehr. Aber das ist doch genau das Skalieren im OutputDevice? Ich bin verwirrt.

  • Hast du mit DEBUG gebaut? Mit "export DEBUG=_vdr-plugin-web" solltest du auch die symbol tables bekommen...

    Hmmm. Muss ich sonst noch etwas machen? Ich habe immer noch keine symbol tables.

    Mein Vorgehen:
    Build, wobei _vdr-plugin-web das "true" in dev-helper ergänzt wurde. Es werden auch die symbolischen Links auf /storage/... für libvdr-web.so.6 angelegt. Soweit so gut.

    Dann der export DEBUG="_vdr-plugin-web" und ein Neubau nur des Plugins. Copy der neuen shared lib nach /storage/... und Neustart von VDR. Die neu eingefügten Ausgaben z.B. kommen, also wird die neue lib verwendet. Allerdings sehe ich im BT immer noch nur den Prozedurnamen ohne wirklich viel mehr Informationen.

  • Normalerweise reicht das. Das true sorgt nur dafür, dass von /usr/local nach /storage verlinkt wird, damit du da deine neue lib weiter verlinken kannst.

    Und das DEBUG sollte dafür sorgen, dass die lib nicht gestrippt wird. Ich mache es eigentlich auch nicht anders in meinem vorgeschalteten build script:

    https://pastebin.com/raw/kfdESPXs

    Kannst du mit "file libvdr-web.so.6" schauen, ob hier "not stripped" angezeigt wird? Ein einfaches "gdb libvdr-web.so.6" sollte dir "Reading symbols from" anzeigen.

    Meine VDRs

    (SatIP Server) --- Kathrein Exip 418 ---

    (Server) --- HW: RPI5 --- SW: RPiOs, VDR 2.7.2 mit streamdev, satip/vtuner-ng, vdrmanager, live, epgsearch, markad ---

    (Client 1+2) --- HW: Radxa Rock 4 Plus - RK3399 --- SW: VDR*ELEC mit softhddevice-drm-gles ---

    (WIP) --- Tanix TX6, RPi5, RPi4, Odroid N2+, WetekPlay2 --- SW: VDR*ELEC mit softhddevice-drm-gles --

  • Und das DEBUG sollte dafür sorgen, dass die lib nicht gestrippt wird.

    Keine Ahnung, was ich vorher permanent falsch gemacht habe. Ich habe jetzt auch den browser und vdr selbst mit in DEBUG und schwupps... ich bekomme einen schönen Backtrace, der mich aber eher ratlos zurücklässt :( Und das reproduzierbar (zwar mit Mühen, aber es geht).

    Die entsprechende Zeile sieht jetzt bei mir so aus:

    Code
    		if (pixmap != nullptr) {
                LOCK_PIXMAPS;
    ==>         pixmap->DrawImage(cPoint(x * scalex, y * scaley), recImage);
            } else {
                esyslog("[vdrweb] Pixmap is null. OSD not available");
            }

    Ich baue das um und lass immer eine neue Pixmap erzeugen. Vielleicht, wer weiß, ein Mysterium....

  • Ich denke, es sollte jetzt mit der letzten Version des Plugins passen. In der Tagesschau wird das Video noch nicht zuverlässig skaliert.

    Änderungen Browser/Plugin:
    Das Shared Memory habe ich ersetzt durch ein weiteres Element im entsprechenden Thrift IDL. Das Shared Memory habe ich nicht zuverlässig hinbekommen, gerade bei verschiedenen Neustarts von VDR und/oder Browser.

    Die Pixmap im Plugin wird jetzt nur ein Mutex geschützt.

    Mein Testcase sah folgendermaßen aus:
    Im Ersten/Tagesschau die Videos so schnell klicken, bis der Daumen weh tut und dann spontan auf die Menu-Taste springen. Ich denke, daß genau zwischen der Abfrage != nullptr und der folgenden Benutzung, die Pixmap gelöscht wurde. Ein extremes Timing also.

    jojo61 : Läuft die neue Version bei dir jetzt ohne "-q"?

  • Der Umbau sollte fertig sein. Ich habe noch den Code etwas aufgeräumt und ein paar Bugs entfernt.
    Die Tagesschau im Ersten funktioniert wieder so, wie es sein soll. Und auch der Live dash-Stream von 'Tagesschau 24' in der Tagesschau funktioniert.

    Falls keine neuen Probleme auftauchen plane ich den Mega-Merge der ganzen Branches frühestens am Sonntag.

    Ich kann natürlich nicht in allen Sendern jede Funktionalität testen. Falls irgendwas (noch) nicht funktioniert, dann brauche ich eine kurze Meldung.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!