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

  • Wieviele OSDs gibt es denn da gleichzeitig?

    "Womit" flackert es denn?

    Wenn ich Zeit hab schau ichs mir auch nal an, aber das muss lösbar sein...


    Der VideoPlayer besteht aus dem Player einem cWebOSDPage als Control, der für das Player-OSD zuständig ist.


    Alte Version:

    Da wurde das Menu-OSD cWebOSDPage nicht richtig geschlossen und existierte weiterhin, auch wenn ein Video abgespielt wurde. Ein Schliessen des Menu-OSD führte zu segfaults, die auch hier im Thread erwähnt wurden.

    Im Prinzip gab es 2 Instanzen von cWebOSDPage (Menu + PlayerControl).


    Neue Version:

    Das Menu-OSD wird tatsächlich und in echt geschlossen, wenn ein VideoPlayer mit einem cWebOSDPage als Control geöffnet wird. Damit gibt es nur eine eine Instanz von cWebOSDPage.


    Jetzt kommt die Lautstärkeregelung ins Spiel. In der alten Version wurde nichts angezeigt, weil schon ein Menu-OSD existierte. In der neuen Version hingegegen gibt es kein Menu-OSD und die Regelung vom VDR wird angezeigt.

    Und damit gibt es eine Kollision, die gerade bei der Tagesschau besonders sichtbar ist, weil der Bereich, der vom Browser permanent aktualisiert wird (Laufschrift) mit der Lautstärke-Anzeige vom VDR uberlappen.

    Die Lautstärke-Anzeige scheint ein Fullscreen-OSD zu sein und damit wechseln sich Lautstärke und Update des Browsers permanent ab. Die Anzeige wechselt von "schwarzer Hintergrund + Lautstärke" mit "Browser-OSD". Und das ergibt das Flackern.


    Deshalb hatte ich es mit den Layern im Plugin probiert, weil ich dachte, Layer 0 ganz unten und darauf dann die Lautstärke, aber das Result war ein nahezu schwarzer Bildschirm mit verkleinertem Video, aber funktionierender Lautstärke-Anzeige.

    Ab Layer 1 entsteht wieder das Flackern.


    Aktuell habe ich shady_kiss von skindesigner als Skin.


    Ich weiß gar nicht, wie ich die Lautstärke "abfangen" und als Image in das Browser-OSD integrieren kann. In einem meiner Prototypen (https://github.com/Zabrimus/vdr-plugin-webout) habe ich ein Device geschrieben um an das OSD als Bild zu kommen, aber das ist hier keine Lösung. Ein temp. Skin klingt auch nicht wirklich überzeugend.

  • So wie ich verstehe, kann jedenfalls nur 1 OSD gleichzeitig aktiv sein. Entweder das von VDR oder das vom Plugin. Und das aktive ist dasjenige mit dem niedrigsten Level, und bei gleichem Level das, das als erstes erstellt wurde.

    Klaus Schmidinger's git trees - vdr.git/blob - osd.h

    Also müsste das vom VDR geschlossen werden, bevor das von web kommt.

    Evtl. tut sich aber auch das Ausgabeplugin mit 2 OSDs schwer.

    Kann man die Lautstärketasten abfangen, damit die gar nicht von VDR interpretiert werden?


    Mein Verständnis wäre, dass es nach dem Start des Webplugins kein OSD vom VDR mehr geben darf, auch nicht, wenn ein Video abgespielt wird. D.h. alle Tastendtücke, die die Anzeige eines OSDs triggern könnten, müssen abgefangen werden. Auch Lautstärke. Wie die dann gesteuert wird, weiß ich nicht. Oder man lässt die Lautstärkekontrolle bei VDR, muss dann aber das eigene OSD schließen und wieder öffnen, wenn der mit seiner Anzeige fertig ist. In den Skins wird der Lautstärkebalken entweder in ein bestehendes OSD gezeichnet (Menu) oder extra ein neues OSD für die Zeit geöffnet, wenn noch nichts angezeigt wurde. Den Fall hätten wir wohl hier. Das Skin-Lautstärke-OSD mit dem webosd-images, die ständig kommen, zu kombinieren, wird evtl. kompliziert. Man müsste beides auf demselben OSD haben.

    Verstehe ich die Theorie richtig?

  • Die Lautstärke-Anzeige scheint ein Fullscreen-OSD zu sein und damit wechseln sich Lautstärke und Update des Browsers permanent ab.

    Das hängt vom Skin ab, ob das ein FullScreen-OSD ist oder nicht. Bei meinem skinlcarsng z.B. ist das kein FullScreen-OSD. Der skindesigner macht da glaube ich immer FullScreen.

    Bei mir ist das Verhalten jetzt so, das bei der Tagesschau und Lautstärke das OSD vom Player weg geht und von meinem Skin der Lautstärkebalken erscheint, und das Video wird zu FullScreen. Es flackert dabei nicht, das OSD vom Player kommt aber auch nicht wieder, wenn der Lautstärkebalken wieder weg geht, erst nach einem Tastendruck und das Video bleibt FullScreen.


    So wie ich verstehe, kann jedenfalls nur 1 OSD gleichzeitig aktiv sein. Entweder das von VDR oder das vom Plugin. Und das aktive ist dasjenige mit dem niedrigsten Level, und bei gleichem Level das, das als erstes erstellt wurde.

    Es gibt auch noch osd->SetActive(). Das habe ich aber auch noch nicht benutzt.

    Ich weiß gar nicht, wie ich die Lautstärke "abfangen" und als Image in das Browser-OSD integrieren kann.

    Das ist relativ einfach über die Status-Schittstelle vom VDR möglich, so habe ich das z.B. auch im Hauptmenü meines Skins gemacht. Dann musst Du allerdings auch einen eigenen Lautstärkebalken im Plugin kreieren.

    Das gleiche gilt übrigens auch für die Meldungen vom VDR.

    Mein Verständnis wäre, dass es nach dem Start des Webplugins kein OSD vom VDR mehr geben darf, auch nicht, wenn ein Video abgespielt wird.

    Das wäre wohl der beste Weg.

    D.h. alle Tastendrücke, die die Anzeige eines OSDs triggern könnten, müssen abgefangen werden. Auch Lautstärke.

    Die Lautstärketasten lassen sich wohl nicht abfangen, die werden in vdr.c in der Hauptschleife abgefragt.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Das ist relativ einfach über die Status-Schittstelle vom VDR möglich, so habe ich das z.B. auch im Hauptmenü meines Skins gemacht. Dann musst Du allerdings auch einen eigenen Lautstärkebalken im Plugin kreieren.

    Das gleiche gilt übrigens auch für die Meldungen vom VDR.

    Das wäre wohl das beste. Dann kann man den Lautstärkebalken oder die Nachricht einfach ins WEB OSD einblenden. Muss dann ja nicht genauso aussehen wie der vom vdr/skin. Ist dann aber syncronisiert mit dem OSD.

  • Ich habs mal kurz angetestet. Es ist so, dass mit dem Start von web auch das OSD vom VDR geschlossen wird.

    Wenn ich nun die Tagesschau abspiele gibts das OSD vom web-plugin, das ständig aktualisiert wird. Beim Drücken der Lautstärketaste wird nun ein neues OSD vom VDR erzeugt, aber das vom web nicht gelöscht. Das Verhalten ist bei mir auch so, wie von kamel5 beschrieben.

    Die beste Lösung wäre es m.E., wenn man es schafft, dass das Drücken der Lautstärketasten nicht an den VDR geht bzw. der zumindest kein OSD dafür erzeugt. Wenn man will, könnte man dem web-plugin dann den Lautstärkebalken zeichnen lassen.


    Insgesamt habe ich mal versucht, mir die Logik beim OSD Handling anzusehen. Ich glaube, die logische Zuordnung stimmt hier (noch) nicht. Vieles wird da miteinander vermischt - so zumindest mein Eindruck ;)

    M.E. müsste zuerst der Konstruktor von page das OSD erzeugen und der Destruktor es wieder zerstören. D.h. zu einer webosdpage gehört ein OSD.

    Mit der Logik kann man sich dann durch die einzelnen Funktionen hangeln und schauen, wann es eine neue webosdpage gibt. Auch dann wird das OSD neu erstellt. Jeder Aufruf holt sich mit Get() die page, falls er sie zum zeichnen braucht und zeichnet darauf bzw. zeigt es an. Wenn man es so lässt, kann man Get() man so gestalten, dass sie das OSD erstellt, falls noch nicht vorhanden. Ansonsten bin ich mir nicht sicher, obs wirklich das page und player OSD parallel braucht. Da sie nicht parallel angezeigt werden können, kann man sie m.E. auch immer wieder neu anlegen. Wann das OSD/page erstellt bzw. zerstört werden müssen, weiß ich nicht. Am besten wohl bei einem Statuswechsel des Players.


    Aber das Wichtigste wäre wohl erstmal, dass sich der VDR nicht mit seinem OSD ins Plugin schleicht...

    Ich glaube, ich kann auch das Tagesschau Video nicht mehr beenden. Mit "Back" komme ich nicht mehr raus und wenn ich mit Menu beende läuft das Video im VDR weiter.


    Ansonsten kann ichs nur immer wieder sagen: Tolles Projekt!

    Einmal editiert, zuletzt von rell ()

  • Die beste Lösung wäre es m.E., wenn man es schafft, dass das Drücken der Lautstärketasten nicht an den VDR geht bzw. der zumindest kein OSD dafür erzeugt.

    Die Lautstärketasten, wie auch noch ein paar andere Tasten, werden nicht an die Plugins weitergereicht: vdr.c


    Ich glaube, ich kann auch das Tagesschau Video nicht mehr beenden. Mit "Back" komme ich nicht mehr raus und wenn ich mit Menu beende läuft das Video im VDR weiter.

    Ja, das ist auch nicht einheitlich, manches kann man mit "Back" beenden und die Tagesschau mit der "0".

    Muss dann ja nicht genauso aussehen wie der vom vdr/skin.

    Genau, man kann ja auch einfach z.B. "Lautstärke: 25" anzeigen.

    Ansonsten kann ichs nur immer wieder sagen: Tolles Projekt!

    :tup


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • M.E. müsste zuerst der Konstruktor von page das OSD erzeugen und der Destruktor es wieder zerstören. D.h. zu einer webosdpage gehört ein OSD.

    Genau das passiert ja. In einer linearen Welt wäre das auch einfach. Das Problem ist das es Momente gibt, in dem sowohl das Osd des Players, als auch das Osd des Menus existieren. Wenn ich z.B. von einem Player zu dem normalen Menu OSD wechsle, passiert genau das:

    Player wird detached

    Menu-Osd wird gestartet

    Destructor vom Player-OSD wird aufgerufen.

    Im genau hier im Destructor muss ich aufpassen, welche der beiden WebOSD gerade gelöscht wird und mir das gerade aktuell weiter existierende merken und umgekehrt eben auch, damit Get() das wirklich aktive zurückgibt.


    Das Problem ist herauszufinden, wann ich das WebOSD tatsächlich brauche. Dazu müsste ich im Browser herausfinden, wann das OSD vollständig transparent ist und wann nicht. Und das bei jeder Aktualisierung. Ich fürchte, das wird dann wirklich zu einer Bremse. Deshalb bleibt das OSD (ob Player oder Menu) immer offen und wird erst geschlossen, wenn das Plugin wirklich zu ist.

    Die Lautstärketasten lassen sich wohl nicht abfangen, die werden in vdr.c in der Hauptschleife abgefragt.

    Ich habe versucht, ob es nicht doch zum Plugin gelangt, ohne Erfolg. Das finde ich auch in der Doku zu VDR:

    Zitat

    cMyControl will receive the user's key presses through the ProcessKey() function. It will get all button presses, except for the volume control buttons (kVolUp, kVolDn, kMute), the power button (kPower) and the menu button (kMenu).


    Aber das Wichtigste wäre wohl erstmal, dass sich der VDR nicht mit seinem OSD ins Plugin schleicht...

    Das ist das, was ich nicht verstehe. Nutze ich Layer 0 für das WebOSD, wird finde ich im syslog das hier

    Code
    vdr: [3935768] ERROR: attempt to open OSD while it is already open - using dummy OSD!

    Und bei der Meldung wird ein Dummy OSD in cOsd *cOsdProvider::NewOsd mit Layer 999 erzeugt. Das OSD vom Player ist nicht sichtbar, aber das Lautstärke-OSD ist da und funktioniert.

  • Ich habe das gerade mal mit einem echten Video probiert. Solange das OSD sichtbar ist, ist die Lautstärke-Regelung ungünstig. Aber mit der Zeit wird das OSD des Videos ausgeblendet und dann funktioniert die Lautstärke-Regelung perfekt und wie gewünscht.

    Bei der Tagesschau geht es richtig schief durch die Laufschrift und weil das OSD nicht wirklich ausgeblendet wird.

    Sobald man das Tagesschau-Video auf Vollbild schaltet (zum Videofenster navigieren und ok drücken) und das WebOSD weg ist, dann sieht es auch wieder perfekt aus.


    Das Problem entsteht also, wenn im WebOSD etwas dargestellt wird und dann die Lautstärke-Regelung benutzt wird. Die Kombination beider OSD (Web + Lautstärke) ist exakt das Problem.


    Edit:

    Es entsteht eine Konkurrenzsituation, in der beide OSD jeweils etwas anzeigen wollen und sich dabei aber gegenseitig in die Quere kommen.

  • Wie machen denn die skins das ? Wenn ich in einem Menü bin und die Lautstärke verändere ?

    Da gibt es keine vom VDR bereitgestellte Funktion. Im Menü muss man das selber implementieren über den StatusMonitor vom VDR, sonst wird nichts angezeigt. Das gilt übrigens auch für "display channel" und "display replay". Nur wenn kein OSD offen ist, wird für die Lautstärke vom VDR ein eigenes OSD erzeugt.

    Für Meldungen gibt es da schon eine Funktion, die man nutzen kann.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Aber das Web hat doch ein OSD offen (z.b. bei der Taggesschau) und doch macht der vdr das Lautstärkemenü auf das sich dann ja beisst. Warum ??

    Die Bedingung ist im VDR hinterlegt. Es wird nicht aufgemacht, wenn es ein Menu ist und der Layer des OSD 0. Oder so ähnlich. Deshalb kam ich auf die Idee, den Layer auf 0 zu setzen, aber das hat andere Konsequenzen.

    Wer es ausprobieren will, kann das in der Klasse (webosdpage.cpp) ändern:

    Code
    void WebOSDPage::Display() {
        dsyslog("[vdrweb] WebOSDPage Display\n");
        if (osd) {
            delete osd;
        }
    
        osd = cOsdProvider::NewOsd(0, 0, 5); <== Aktuell ist Layer 5
  • Ok. Wenn du Layer 5 nutzt und vdr den Layer 0 dann sollte das vdr OSD über deins gerendert werden. Im Prinzip ja durchaus ok, aber das ganze nutzt dann nix wenn der vdr ein FullScreen OSD für die Lautstärke auf macht. Oder gibt es evtl. ein Problem mit der transparenz im vdr fullscreen OSD. Da sollte ja kein schwarz kommen um den Balken.

    Oder ist das Problem weil du das OSD laufend aktualisierst und damit das vdr OSD immer wieder überschreibst?

  • Ich habe gerade mal in openglsod.c nachgeschaut und da werden die Layer in aufsteigender Reihenfolge gerendert. Und das ist wohl falsch !!

    Damit wird der web Layer immer über den vdr Layer gerendert. Aber Layer 0 sollte ja die höchste Priorität haben. Man müsste also von oben nach unten rendern. Zum testen könnte man in openglosd.cpp mal folgendes ändern.

    Code
     for (int layer = 0; layer < MAXPIXMAPLAYERS; layer++) {
    
    ändern in
    
     for (int layer = MAXPIXMAPLAYERS-1; layer >= 0; layer--) {
  • Ich habe gerade mal in openglsod.c nachgeschaut und da werden die Layer in aufsteigender Reihenfolge gerendert. Und das ist wohl falsch !!

    Damit wird der web Layer immer über den vdr Layer gerendert. Aber Layer 0 sollte ja die höchste Priorität haben. Man müsste also von oben nach unten rendern. Zum testen könnte man in openglosd.cpp mal folgendes ändern.

    Code
     for (int layer = 0; layer < MAXPIXMAPLAYERS; layer++) {
    
    ändern in
    
     for (int layer = MAXPIXMAPLAYERS-1; layer >= 0; layer--) {

    Man müsste dann nur noch den Fall bei zwei level 0 OSDs lösen. Oder macht das VDR schon?

  • Aber Layer 0 sollte ja die höchste Priorität haben.

    Das stimmt nicht. Ein Pixmap mit Layer 0 liegt immer ganz unten. Im Softwarerendering vom VDR ist das auch so.

    Wenn das falsch wäre, würden ja auch jetzt schon die Skins komisch aussehen.


    Apropos Layer 0:

    Du könntest mal den Fix von rell zum Pimap Layer 0 übernehmen.


    Grüße

    kamel5

    VDR 2.6.6: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 39 Kernel 6.8 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Das stimmt nicht. Ein Pixmap mit Layer 0 liegt immer ganz unten. Im Softwarerendering vom VDR ist das auch so.

    Im Prinzip hast du da recht. Und es ist ein Denkfehler von mir. Die OSD Layer werden von 0 aufwärts gerendert. Nur hier ist das Problem das der Lautstärkebalken nicht überschrieben werden sollte und dafür müsste er dann über dem layer 5 vom web osd liegen. Letztlich konkurrieren hier 2 OSDs und da gibt es keine endgültige Lösung.

  • Es gibt den Unterschied zwischen OSD Level und pixmap layer.

    Die eindeutige Lösung wäre, dass der niedrigere Level Priorität hat. Bei 2 Level 0 OSDs gewinnt dasjenige, das früher da war.

    Erst da kommen die pixmap layer ins Spiel, die die pixmaps auf dem OSD eines Levels ordnen.

    Einmal editiert, zuletzt von rell ()

Jetzt mitmachen!

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