VDR OSD im Browser, Navigation zu einer Zeile im OSD durch Anclicken

  • Hi,

    das live plugin stellt das VDR OSD im Browser dar.

    Wenn der Anwender eine Zeile (z.B. einen Kanal in der Liste der Kanäle) im OSD anclickt, "wählt" VDR diesen Kanal aus.

    Das funktioniert so: Das Plugin zählt die Zeilen im OSD zwischen dem derzeit gewählten Kanal und dem angeclickten Kanal. Und schickt dann an den VDR die entsprechende Zahl von KeyUp bzw. KeyDown Tastendrücken.

    Das funktioniert im Prinzip. Aber: Live weiß nicht, welche OSD Zeilen "selectable" sind. Diese Information gibt VDR mit

    Code
    cStatus::MsgOsdItem(item->Text(), ni++);

    nicht weiter, hier wird nur item->Text() übergeben, aber nicht item->Selectable().

    Live schickt also auch für Zeilen, die nicht selectable sind (Namen der Kanalgruppen) die KeyUp bzw. KeyDown Tastendrücke, VDR überspringt aber diese Zeilen.

    Außerdem: Wenn ich sehr viele Zeilen überspringe (z.B. von Kanal 2 auf Kanal 1000), wird nicht weit genug navigiert, z.B. auf Kanal 600. Warum genau, ist mir unklar.


    cStatus::MsgOsdItem(item->Text(), ni++) gibt mir ja die Zeilennummer mit. Ich denke, es wäre optimal, wenn ich VDR sagen könnte: Bitte wähle Zeile 253 (z.B.). Ohne den Umweg über simulierte Tastendrücke. Geht das?

    ~ Markus

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Außerdem: Wenn ich sehr viele Zeilen überspringe (z.B. von Kanal 2 auf Kanal 1000), wird nicht weit genug navigiert, z.B. auf Kanal 600. Warum genau, ist mir unklar.

    Ich vermute, dass hier der Keystroke-Puffer im VDR angesichts der höheren "Eingaberate" an seine Begrenzung stößt. Insofern wäre es wirklich am günstigsten, kls würde das Interface entsprechend um eine zweite Variante ergänzen, bei der alternativ auch das Selectable-Flag mit übergeben wird, sowie eine Funktion, bei der man die Auswahl direkt per Index übergeben kann.

    Die Ansteuerung nach Auswahl aus dem Menü läuft doch per Javascript, richtig? Mit den oben genannten Ergänzungen käme mir spontan die Idee, jeder selektierbaren Tabellenzeile eine "administrative" Klasse wie "index_N" oder "selector_N" (N = 1, …, max) zuzuweisen. Im Javascript-Event kann man die administrative Klasse ermitteln und den Index für die Übergabe der Auswahl extrahieren. Ob man dann entsprechend viele Keystrokes einspielt oder im VDR (künftig) den Selektor-Index direkt angeben kann, ist dann nur ein – wenngleich nicht ganz unwichtiges – Detail.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Vdr schickt dir seine 25(?) Zeilen Osd per

    Code
    cStatus::OsdItem(const char *Text, int Index)

    und schickt dir außerdem die aktuelle Zeile 0..24 (oder wie genau die Anzahl ist) in

    Code
    cStatus::OsdCurrentItem(const char *Text)

    die du dann sichtbar markiert im osd haben kannst.

    Eigentlich brauchst du die Info nicht, ob ein Item selektierbar ist, gar nicht.

    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler
    Display Spoiler


    to spoil
    verderben
    beschädigen
    plündern
    behindern
    berauben
    vereiteln
    rauben
    zerstören [fig.] [verderben, verunstalten]
    vergällen
    verhageln [fig.]

  • Ich vermute mal, das live Plugin setzt MaxItems() auf einen sehr hohen Wert, um alle Kanaleinträge zu erhalten. Das war so natürlich ursprünglich nicht gedacht, ist aber nicht "verboten".

    OsdItem() einen Parameter "Selectable" mitzugeben ist sicher nicht verkehrt um es ggf. anders darzustellen.

    Wie wär's mit beiligendem Patch?

  • Hi kls, die Kompilierung liefert noch folgenden Fehler:

    Compiler: g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

    Edited once, last by SHofmann: Fehlende Zeile in der Fehlermeldung ergänzt. (December 18, 2024 at 2:11 PM).

  • Mit folgender Änderung:

    … ändert sich die Fehlermeldung zu:

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Mit folgender Änderung kompiliert es:

    Ob es damit aber auch funktioniert, kann ich nicht sagen.

    Die Frage wäre allerdings, ob eine Änderung, die Anpassungen an verschiedenen Plugins bedeutet, sinnvoll ist.

    Grüße

    kamel5

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

    Git-Repo: gitlab.com/kamel5

  • Genau mein Gedanke. Ich hatte aber gehofft, dass Klaus eine geschicktere Lösung für das Problem als diese (bzw. alternativ using cStatus::OsdItem;) finden könnte.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Ich wollte es so machen, dass bestehende Plugins nichts ändern müssen. Hatte es aber nicht mit dem 'status'-Plugin getestet (mea culpa), sondern einfach mal so "hingeschrieben". An das Problem, dass man virtuelle Funktionen nicht überladen kann, hatte ich nicht mehr gedacht. Dann lassen wir das wohl besser.

  • Deswegen hatte ich bei meiner Anregung oben auch an eine weitere virtuelle Funktion unterschiedlichen Namens gedacht, etwa OsdItemWithDetails oder so ähnlich:

    Das ist zwar nicht so elegant wie dein Ansatz, weil man in der Schleife zwei virtuelle Funktionen explizit aufrufen muss. Weil das die andere Lösung das aber inhärent ebenfalls macht, dürfte der Laufzeitunterschied minimal sein.

    Damit kompiliert der VDR und (exemplarisch) auch Live. Und nachdem alle Plugins "from Scratch" (make clean, make install) neu gebaut wurden, funktioniert der VDR noch immer wie erwartet.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • > Das ist zwar nicht so elegant wie dein Ansatz, weil man in der Schleife zwei virtuelle Funktionen explizit aufrufen muss

    Eigentlich nicht. Aus meiner Sicht ist der einzige "Nachteil" gegenüber dem Patch von Klaus, dass sich die zwei cStatus::OsdItem Methoden nicht nur durch die Signatur, sondern auch durch den Namen der Methode unterscheiden müssen.

    Anbei mein Vorschlag für den Patch, ich habe die 2. Methode OsdItem2 genannt. Man kann die natürlich auch OsdItemWithDetails nennen.

    ~ Markus

  • Damit eliminiert du aber das alte Interface:

    Code
    +void cStatus::MsgOsdItem(const char *Text, int Index, bool Selectable)
     {
       for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
    -      sm->OsdItem(Text, Index);
    +      sm->OsdItem2(Text, Index, Selectable);
     }

    Sprich: man müsste alle Plugins patchen, richtig?

    Genau das wollten wir aber – siehe kamel5 oben – vermeiden.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • > Damit eliminiert du aber das alte Interface:

    Eigentlich nicht

    Code
     virtual void OsdItem2(const char *Text, int Index, bool Selectable) { OsdItem(Text, Index); }

    Also, wenn OsdItem2 nicht re-implementiert wird, wird OsdItem gerufen ...

    Damit sollten alle "alten" Plugins 100% kompatibel funktionieren

    Client1: ASUS P5QC, Dual Core 3G, Cine S2, Ext. Board von TBE, Xubuntu 20.04, VDR 2.6x

    Client2: RPI3

    Server: RPI4, Sundtek SkyTV Dual 2x

  • Hatte ich glatt übersehen, danke.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Anbei mein Vorschlag für den Patch, ich habe die 2. Methode OsdItem2 genannt. Man kann die natürlich auch OsdItemWithDetails nennen.

    Es gibt auch Plugins, die "cStatus::MsgOsdItem()" direkt aufrufen.

    Wenn Du in "status.h" noch das änderst:

    Code
    -  static void MsgOsdItem(const char *Text, int Index, bool Selectable);
    +  static void MsgOsdItem(const char *Text, int Index, bool Selectable = false);

    kompiliert bei mir alles.

    Grüße

    kamel5

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

    Git-Repo: gitlab.com/kamel5

  • Danke für den Test. Der Default für selectable sollte aber true sein:

    Code
    static void MsgOsdItem(const char *Text, int Index, bool Selectable = true);

    "Normalerweise" sind diese Items auswählbar. Außerdem: Wenn ich sie nicht auswählbar setze, dann kann der Anwender sie halt auch nicht auswählen. Was schlechter ist als umgekehrt (eine eigentlich nicht wählbare Zeile kann gewählt werden).

    Anbei der entsprechend upgedatete Patch.

  • Wo ich mir jetzt nicht so ganz sicher bin: wenn man in einer C++ Klasse mit virtuellen Funktionen eine neue virtuelle Funktion hinzufügt, funktioniert das dann sicher noch mit Files, die mit der alten Deklaration (also ohne die neue Funktion) übersetzt wurden? Oder kann es da Probleme mit der Virtual Method Table geben?

  • Ich würde – wie du auch – Letzteres vermuten. Wikipedia liefert hierzu folgende Hinweise:

    Quote

    The C++ standards do not mandate exactly how dynamic dispatch must be implemented, but compilers generally use minor variations on the same basic model.

    Typically, the compiler creates a separate virtual method table for each class. When an object is created, a pointer to this table, called the virtual table pointer, vpointer or VPTR, is added as a hidden member of this object. As such, the compiler must also generate "hidden" code in the constructors of each class to initialize a new object's virtual table pointer to the address of its class's virtual method table.

    Many compilers place the virtual table pointer as the last member of the object; other compilers place it as the first; portable source code works either way.[3] For example, g++ previously placed the pointer at the end of the object.[4]

    Speziell der erste Absatz scheint darauf hinzudeuten, dass die Art der Adressierung der VMT sowie die Abfolge der virtuellen Funktionszeiger wohl als Compiler-spezifisch anzusehen ist. Auch würde ich vermuten, dass die Compiler für die Population der VMT entweder die Abfolge der virtuellen Funktionen im Code, die alphabetische Abfolge der Funktionssignaturen oder deren Abfolge in einer irgendwie gearteten Hash-Tabelle (Dictionary?) nutzen. Fügt man dabei eine VF hinzu, ändert sich die Abfolge (und somit die Position einer VF in der VMT) zwangsläufig.

    Da diese Änderung aber zum Inkrement der API-Versionsnummer führt und alle Plugins somit eh neu übersetzt werden müssen, könnte sich diese Frage vielleicht gar nicht erst stellen…

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Ich denke nach wie vor, dass man das nicht allgemein annehmen darf. Selbst wenn es bei deinem oder meinem Compiler ginge (was man durch Vergleich der Positionen der VF-Pointer in der VMT checken könnte), hätten wir nach wie vor keine Gewissheit, dass es bei keinem Environments da draußen ein Problem gäbe. Also besser auf Nummer sicher gehen… ;)

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.3 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinenigmang, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

Participate now!

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