Posts by Zabrimus

    Allerdings laufen dann da sechs Prozesse des Browsers und nur einer hat diese Parameter mitbekommen.

    Ist das ok?

    Ja. Ich wusste erst nichts mit dem Parameter "--type=zygote" anzufangen und um ehrlich zu sein, so ganz sicher bin ich mir immer noch nicht. Auf jeden Fall erzeugt Chromium verschiedene Threads, die für bestimmte Aufgaben zuständig sind (Audio, Netzwerk, GPU, Browser,....). Wobei Threads mißverständlich ist, weil es eigentlich forks sind.

    Im Code ist es zum Teil spannend, weil ich nicht immer sicher bin, in welchem Thread (fork) ich mich befinde und verschiedene Funktionalitäten nur in bestimmten Threads erlaubt sind. Das ist mit ein Grund, warum ich es noch nicht geschafft habe, die Proxy-Konfiguration dynamisch per Sender zu gestalten: Mir gelingt es irgendwie nicht, in den richtigen Thread (fork) zu kommen.

    So, auf jeden Fall kommt hier im Anhang ein etwas längliches Log mit diversen Fehlern.

    Ansonsten bekomme ich auch auf de Bildschirm Fehler ala "unknown type error". Die sind aber nicht in einem Log zu finden, die könnte ich höchsten abfotografieren.

    Ich verstehe das nicht ganz. Wenn ich das richtig sehe, dann versuchst Du auf Arte ein Video zu sehen. Aber dann tauchen auf einmal Requests für ZDF auf. Ich muss mir das Log noch einmal in Ruhe zu Gemüte führen.

    Irgendwas ist da seltsam. Bist du auf dem Sender Arte oder ZDF, während die Arte Mediathek bzw. das Video gestartet wurde.


    Du siehst Fehlermeldungen auf dem Bildschirm???

    Könntest Du die die Dateien "content_trace_0*" im Release Folder mal löschen und den Fehler neu provozieren (auf möglichst kurzem Wege) und dann die "content_trace*" hochladen? Irgendwas stimmt mit der Seite bzw. dem Verändern der Seite nicht.


    Oder vielleicht auch den genauen Weg durch die Mediathek angeben, damit ich den nachvollziehen kann um den Fehler nachzustellen.


    Zabrimus

    Ich habe meine kompilierte Developer-Version 1:1 auf mein Produktivsystem kopiert und dabei die libffmpeg.so aus installiertem Chromium in /usr/local/lib kopiert.

    Auf dem System läuft noch Ubuntu Bionic (18.04). Es läuft das softhddevice von https://github.com/ua0lnj/vdr-plugin-softhddevice. (Version ist alt:

    Tue Jun 30 19:48:39 2020 +1000)

    Die CPU ist noch ein

    Code
    1. Intel(R) Celeron(R) CPU J3455 @ 1.50GHz

    Und das Plugin läuft mit vaapi

    Also wirklich aktuell ist das System nicht. Aber der Browser und das Plugin funktionieren und es sind noch genügend CPU Reserven vorhanden. Ein Problem gibt es mit dem Video: Der 0-Punkt ist verschoben. Das Video beginnt nicht in der oberen linken Ecke, sondern mit einem größeren Versatz der x- und y-Achse. Das muss ich nochmal untersuchen.


    Aber generell gibt es erstmal kein Problem mit vaapi - aus meiner Sicht.

    Wie gebe ich dem Plugin die Parameter für den Browser mit? Wenn ich sie einfach in die Plugin-Parameterliste schreibe, bekomme ich "[hbbtv] Error: Unknown command line parameter '?'".

    Ein Fragezeichen? Meine Konfiguration auf dem Produktivsystem sieht so aus (vdr.config):

    Code
    1. [hbbtv]
    2. -s
    3. -p /home/vdr/build/Release/vdrosrbrowser
    4. -c "--debug --user-data-dir=remote-profile --password-store=basic --fullscreen"
    5. -l /home/vdr/build/Release/debug.log
    6. -d :0

    Die Parameter für den Browser sind in " " eingerahmt.


    Zabrimus

    Tja, also sieht wirklich so aus, als wäre die Intel-GPU mit softhdvaapi aktuell zu schwach für hbbtv

    Die GPU muss hier (im VDR) nicht viel machen, außer Bilder darstellen. Vielleicht ist da noch irgendwo ein Haken. Im Browser sieht es anders aus, da wird die GPU intensiver für das Rendering genutzt. Oder beide kommen sich in die Quere. Das kann ich gar nicht sagen.

    vdr[3210]: [3284] [hbbtv] Received Status: PLAY_VIDEO:
    vdr[3210]: [3284] [hbbtv] Received Status: STOP_VIDEO

    Das ist seltsam. Der Browser hat ziemlich schnell aufgehört das Video abzuspielen. Kannst Du mal im Browser den --trace Modus einschalten und im Log des Browser schauen?


    Was für ein Video ist das? Siehst Du das zufällig? MPEG-DASH? mp4? Evt. sogar live?


    Zabrimus

    Das Verzeichnis gab es schon, gehörte aber root. Ich hab jetzt die Gruppe video berechtigt, in der auch der vdr hängt.

    Damit mault vdrosrbrowser nicht mehr und stürzt auch nicht mehr ab, wenn er vom hbbtv-Plugin gestartet wird.

    Eine Konfigurationsmöglichkeit wäre trotzdem das Beste.

    Die Repository-Version hat 2 neue Parameter

    Code
    1. --cachedir=<path> Verzeichnis in dem der Browser seine Cache-Daten ablegen soll (Default: <browserpath>/cache)
    2. --profiledir=<path> Verzeichnis in dem der Browser seine Profile-Daten ablegen soll. (Default: <browserpath>/profile)

    Die Pfade müssen absolut sein und nicht relativ.


    Bild oder sonstwas kommt leider trotzdem nach wie vor nicht. Es bleibt bei Anwahl eines hbbtv-Anbieters ein stotterndes VDR-Bild.

    Kann es sein, dass das softhdvaapi-Plugin, bzw. die GPU da irgendwie überfordert sind?

    Hmm. Du rufst das Plugin auf dann den Eintrag "Red Button" und damit funktioniert es nicht? Bei manchen Privatsendern wird nicht immer der "Red Button" angezeigt, aber mit dem Roten Knopf kommt man meist weiter.

    Das Erste/ZDF und Konsorten sind dabei wesentlich stabiler.


    Stotterndes Bild. Es werden nur Bilder in das OSD übertragen. Ich selbst habe es mit softhdcuvid und softhddevice getestet. softhdvaapi habe ich noch nicht getestet.


    Zabrimus

    Er versucht, den Cache unterhalb des Installationsverzeichnisses anzulegen, was die VDR-Kennung natürlich nicht darf.

    Im Verzeichnisse 'cache' werden die Bewegungsdaten gespeichert (HTML und auch Cookies und dergleichen). Das ist leider im Browser hardcoded als direktes Unterverzeichnis.

    Aber wenn so darüber nachdenke, sollte der Pfad konfigurierbar sein. In /usr/local hat sowas eigentlich nix zu suchen.


    Natürlich kann du das Verzeichnis manuell anlegen und VDR Schreibrechte geben. Aber das wäre nur eine Notlösung.


    Zabrimus

    Der zweite liegt daran, dass er nicht zum X Server connecten kann. Das ist kein schönes Verhalten, dann zu crashen, aber ok.

    Schön ist das gar nicht, aber der check findet entweder in Chromium oder CEF statt. Und da komme ich gar nicht ran. Fail-Fast bzw. Fast-Crash ist da wohl die Philosophie.


    [2021-04-22 23:20:36.569] [vdrosrbrowser] [trace] Send String to VDR, Message SEND_INIT
    [2021-04-22 23:20:36.575] [vdrosrbrowser] [trace] Received command from VDR: CHANNEL {"channelType":25,"ccid":"ccid://1.0","nid":1,"dsd":"","onid":1,"tsid":1010,"sid":11150,"name":"3sat HD","longName":"3sat HD","description":"OIPF (SD&amp;S) - TCServiceData doesn't support yet!","authorised":true,"genre":null,"hidden":false,"idType":15,"channelMaxBitRate":0,"manualBlock":false,"majorChannel":1,"ipBroadcastID":"rtp://1.2.3.4/","locked":false}

    Das sieht doch gut aus? Der Browser sendet SEND_INIT an das Plugin und das Plugin antwortet mit CHANNEL. Die Kommunikation funktioniert. Geht denn jetzt etwas nicht?



    [0423/150354.136224:ERROR:widevine_loader.cc(383)] Widevine CDM registration failed; Missing file ./widevine/libwidevinecdm.so

    Warum kommt die Meldung öfter? Ich habe meine lokale Einstellungen mal gelöscht und ich bekomme sie auch nur einmal.


    Kannst du mal versuchen, ob der Parameter:

    Code
    1. --no-sandbox

    beim Browser etwas bewirkt?


    Ich denke, ich werde einen weiteren Parameter im Browser implementieren, mit dem die Widewine-Initialisierung gar nicht erst versucht wird.


    Zabrimus

    Aber was kann ich tun, damit Bild und Ton halbwegs synchron laufen. Momentan gibt es einen Versatz von mindesten halben Sätzen.

    Halbe Sätze? Soviel? An der Synchronisation arbeite ich noch bzw. mir fehlt noch die zündende Idee.

    Alle Tips zur Synchronisation, die ich bisher gefunden habe, nutzen den Audio-Stream bzw. den Zeitstempel zur Synchronisation. Aber das funktioniert hier gar nicht, denn sobald der Ton abgeschaltet wurde, gibt es keine Audio-Pakete mehr. Die Video-Pakete (bzw. die Bilder) kommen exakt zu dem Zeitpunkt, an sie dargestellt werden sollen.

    Zabrimus

    nach einiger Zeit (ich kann nicht sagen ab wann) läßt sich das Plugin nicht mehr steuern,

    Nutzt du die Pause-Funktion? Oder lässt du das Video weiterlaufen? Das Log umfasst gerade mal 2 Minuten?


    Apr 22 16:25:57 mannitec02 vdr[556770]: [617496] [hbbtv] Start UDP video reader

    Apr 22 16:25:57 mannitec02 vdr[556770]: [617496] [hbbtv] Connect via UDP

    Ei. Das ist noch das alte Plugin (master branch)? Ich weiß. Etwas verwirrend, aber ich wollte noch etwas fixen, bevor ich merge. Und auch schauen, wie ich den Browser wieder paketiere. Das ist durch die Abhängigkeit zu libffmpeg.so etwas schwieriger geworden.


    Hast Du die Möglichkeit den encoding-Branch (mittlerweile ein völlig falscher Name) zu testen?


    Außerdem gibts beim Start des Plugins diesen Fehler im Log:

    Dann stammt das wahrscheinlich auch noch aus der alten Version.


    Zabrimus

    SVDRP Events wie z.B. HITK <taste> wären für mich wichtig, da ich meinen VDR mit einer selbstprogrammierten Kombifernbedienung in Android (AVR/TV/VDR) steuere.

    Ich habe versucht herauszufinden, warum das über SVDRP nicht funktioniert. Es liegt daran, daß ein Wert in VDR nicht gesetzt wird (pluginOsdObject) und das wird auch nur an einer Stelle überhaupt gefüllt.


    Was funktioniert ist die folgende Sequenz:

    Code
    1. svdrpsend plug hbbtv main
    2. svdrpsend hitk ok
    3. svdrpsend plug hbbtv main

    Mit hitk kann ich durch die Menus navigieren, aber genau der "Red Button" geht nicht. Ich vermute, daß liegt daran, daß mit dem "Red Button" von einem cOsdMenu auf ein cOsdObject in demselben Plugin gewechselt wird. Eine echte Lösung fällt mir dazu nicht ein.


    Zabrimus

    Oh cool. Dann scheinen ja Seiten zu funktionieren, die ich nie getestet und gesehen habe.


    Ich habe mir die Seite von npo angeschaut und es ist ein Problem, bei dem man sehr schnell graue Haare bekommt.

    Ob es die Ursache ist oder nur ein Symptom kann ich noch nicht sagen. Auf jeden Fall versucht ein inline Javascript auf HbbTV-Objekte zuzugreifen, die aber genau danach überhaupt erst initialisiert werden. Dies funktioniert natürlich nicht.


    Im Moment fehlt mir noch die zündende Idee, wie man das Problem lösen kann. Um das HbbTV-Init aufzurufen, brauche ich die Seite, bzw. verschiedene Objekte in der Seite. Aber die Senderseite erwartet wohl, daß schon Teile des Inits gelaufen sind und ruft diese fröhlich auf oder versucht es zumindest.


    Darüber muss ich nachdenken und Experimente betreiben....


    Zabrimus

    Beim Plugin habe ich noch eine Fehlermeldung:

    ERROR: plugin 'hbbtv' called cPlugin::ConfigDirectory(), which is not thread safe!

    Ich dachte, daß hätte ich schon bereinigt. Aber wohl nur zur Hälfte. Im Repository ist es jetzt final gefixed.


    Zabrimus

    Muss das ffmpeg, das da verwendet wird, auch das sein, das für den Rest des Systems genutzt wird?

    Nein. Das libffmpeg wird nur für den Browser verwendet. Meines Wissens nutzt nur noch Ubuntu Chromium eine libffmpeg.so. Das entsprechende Ubuntu-Package installiert diese aber woanders. Wobei Ubuntu Chromium nur noch per snap anbietet, aber da bin ich mir nicht sicher.


    Zabrimus

    Die Idee mit der Proxy-Konfiguration pro Sender muss ich hinten anstellen. Es ist mir bisher nicht gelungen, den Proxy zur Laufzeit zu ändern. Natürlich kann man auf der Kommandozeile einen Proxy-Server angeben oder eine proxy.pac per HTTP Server. Allerdings würde das dann global für alle Aufrufe gelten.


    Es ist mir endlich gelungen, die Seite von Servus TV und die Mediathek zu öffnen. Ich weiß nicht, ob die "deutsche" Version schon fertig ist oder ob es noch ein Fehler in den Scripten von Servus TV ist, aber mit einer kleinen Änderung an den URLs und der Seite selbst, funktioniert es.


    Sorgen machen mir noch die Synchronisation Video/Audio. Manchmal denke ich, die Synchronisation passt nicht exakt. Aber dann scheint es wieder gut auszusehen. Vielleicht war mein naiver Ansatz etwas zu naiv oder ich sehe schon weiße Elefanten, weil ich zu intensiv auf die Lippen starre. So ganz sicher bin ich mir da noch nicht.


    Aber abgesehen von der Synchronisation sollte die Version (encoding-Branch) ziemlich stabil sein. Wenn ich die Synchronisation zufriedenstellend gelöst habe und keine weiteren Probleme auftauchen, kann ich endlich den Branch in den Master mergen.


    Zabrimus

    Jetzt kommt beim Bauen des hbbtv-Plugins:

    Mist. Ich habe vergessen den Fix aus dem Master-Branch in den encoding-Branch zu übernehmen. Der Fix ist jetzt im Repository.



    Noch ne Fräche: Wie kriege ich denn die libffmpeg.so gebaut?

    Das avbuild Paket habe ich runter geladen, die Sourcen von ffmpeg ebenfalls, aber avbuild mault rum:

    Ich weiß nicht, warum avbuild so dermaßen pingelig ist. Der stört sich an der Existenz der "config.h".

    Wenn Du also mal ein 'configure' im ffmpeg Source Verzeichnis aufgerufen hast, bekommst du den Fehler.


    Also entweder ein ffmpeg- Source Verzeichnis verwenden, daß komplett unangetastet und noch so richtig sauber ist oder evt. (ungetestet) hilft es auch, das "config.h" im ffmpeg Verzeichnis zu löschen.


    Zabrimus

    Ich war auf einem völlig falschen Trip. Den Build-Fehler habe ich gefunden und beseitigt.


    Achja. Den encoding-Branch gibt es für den Browser und das Plugin. Beides muss zusammen passen.


    Zabrimus

    cp: cannot stat 'thirdparty/cef/Release/*': No such file or directory

    Oh nein....

    Ich suche den Fehler schon länger. Welche Version von cmake hast du installiert? cmake 3.18?


    Lösch mal das Verzeichnis thirdparty/cef und baue nochmal. Wenn es dann klappt, hast Du genau das Problem, was ich nicht verstehe.


    Zabrimus

    Hast Du den Encoding- oder den Master-Branch verwendet? Den Master-Branch habe ich schon lange nicht mehr getestet.

    Im Log sieht man, das der Browser überhaupt nicht startet oder abstürzt.

    1. Was gibt denn "ldd libcef.so" aus? Werden alle libs gefunden?
    2. Versuche mal den Browser standalone zu starten:
      ./vdrosrbrowser --trace
      Startet der Browser oder sieht man direkt Probleme?
    3. Wenn bis hierhin alles klappt, dann den Browser standalone starten
      ./vdrosrbrowser --trace
      In der VDR Config den Parameter "-s" für das hbbtv-Plugin entfernen oder auskommentieren und den VDR starten.
      Im VDR dann auf das Menu gehen und schauen, ob der Browser mehr oder andere Meldungen ausgibt.

    Wenn das auch alles keine hilfreichen Informationen liefert, wird es schwieriger. Dann wäre eine gdb-Session um an den Backtrace zu kommen, an dem der Browser aussteigt.


    Das Display stimmt?

    --display=:0.0


    Der Parameter ist für den encoding-Branch nicht mehr notwendig und kann gelöscht werden. Der Master-Branch braucht den noch.

    --video=UNIX

    1. Das Ausgabeplugin (in meinem Fall ein softhd*, aber es sollte egal sein welches):
      Benutzt werden nur die Methoden aus dem OSD Interface von VDR und keine weiteren Spezialitäten.
      Z.B. osd->CreatePixmap, pixmap->DrawImage, ... Das TV-Bild wird mitunter skaliert, weil dies in der HbbTV-Seite vorgesehen ist.
    2. Das hbbtv-Plugin:
      Das Plugin kommuniziert bidirektional mit dem Browser. Welche Seite soll dargestellt werden, welche Tasten sind gedrückt worden, soll ein Video dargestellt werden, soll das TV-Bild skaliert werden und all dergleichen. Die Kommunikation läuft mittlerweile nur über ein shared memory Segment. Vom Browser kommen auch die Bilddaten (die gerenderte HTML/HbbTV Seite) für das OSD, welches dann über das Plugin in 1. im OSD dargestellt wird.
    3. Der Browser selber ist ein Headless-Browser (also ohne eigene Ausgabe) und verantwortlich dafür die HbbTV Seite zu rendern. Die Bilddaten werden an das HbbTV-Plugin übergeben. Die Seite wird stark durch Javascript angereichert um die HbbTV Objekte und verschiedene Hilfsprozeduren zur Verfügung zu haben. Verschiedene Events im Browser werden abgefangen und an das HbbTV-Plugin gesendet (z.B. Video stopped, Video start, TV-Skalierung,....)
      Der Browser erkennt, wenn ein Video startet und erzeugt dann ein SDL2-Fenster in dem die bereits decodierten Videodaten (vorliegend als rgba-Image) zusammen mit dem Sound (als PCM FLTP) synchronisiert und abgespielt werden.
      Sobald das Video stoppt, wird auch das SDL2 Fenster geschlossen und VDR benachrichtigt, damit das TV-Programm wieder dargestellt wird.

    Browser und HbbTV Plugin liefern sich also permanent Statusinformationen und Kommandos (in beide Richtungen).


    Kommunikation:

    Ausgabe Plugin <-> hbbtv Plugin <-> Browser <-> Internet


    Der Browser ist ein echter Browser (aktuell basierend auf Chromium 89) und kann nicht nur für HbbTV verwendet werden. Ich habe schon beliebige Seiten im OSD des VDR rendern lassen.


    CEF habe ich speziell kompiliert um Lizenzprobleme zu umgehen. In der eigentlichen Version wird ffmpeg statisch gelinkt und damit fallen gerade die wichtigen Video- und Audiocodecs raus (h.264, h.265, aac), weil die nicht mitgeliefert werden dürfen. In meiner Version von CEF wird ffmpeg dynamisch gelinkt und wird nicht mehr automatisch mitgeliefert. Jetzt kann sich jeder selber aussuchen, welche Codecs bzw. welches ffmpeg auf der Maschine installiert/compiliert werden sollen. (Leider werden nicht nicht normalen shared libs verwendet, sondern eine libffmpeg.so in der alle(!) Objekte gelinkt sind, daher die spezielle Anleitung für libffmpeg.so)


    In einer alten Version hatte ich vorgesehen, die Kommunikation Browser <-> hbbtv-Plugin über TCP zu erledigen, aber die Latenz war mir zu groß. Aber im Prinzip wäre es dann möglich gewesen, den Browser auf einer komplett anderen Maschine laufen zu lassen, als den VDR mitsamt Plugins.

    Ich denke, das könnte man wieder durch einen Proxy erreichen, der die Kommunikation shared memory <-> TCP/UDP kapselt, aber es werden unkomprimierte Daten übertragen und die Netzlast dürfte nicht unerheblich sein.


    Wenn du weitere Fragen, immer raus damit.


    Zabrimus