OSD wird nur genau einmal angezeigt

  • Das Ganze ist mir wieder ein Rätsel und ich komme nicht weiter.


    Ich habe ein OSD, welches ich cOsdProvider::NewOsd erstelle, mir eine Pixmap erzeuge, diese fülle und dann das OSD darstelle.

    Das funktioniert auch soweit ganz gut, aber wenn ich das OSD schliesse, dann bekomme ich es kein zweites Mal auf. Mit einer Flut von Debug-Ausgaben kann ich sehen, daß dieselben Methoden durchlaufen werden. NewOsd, Pixmap füllen und so weiter. Aber es wird einfach nichts mehr dargestellt. Navigiere ich blind durch das nicht-dargestellte OSD, dann werden auch die entsprechenden Aktionen durchgeführt, aber es ist eben nicht sichtbar.


    Ich habe mir in verschiedenen Plugins (u.a. dem osddemo) soweit alles mal angeschaut, was ich evt. vergessen haben könnte, aber ich finde nichts oder ich übersehe das Offensichtliche.


    Der Code sieht (alles rausgeworfen, was intern gebraucht wird und erstmal nichts mit dem OSD zu tun hat) so aus:

    Ob mit oder OpenGLOSD macht keinen Unterschied. Die "normalen" VDR Menus funktionieren auch problemlos, aber mein OSD eben nur genau einmal.

    Schliesse ich das nicht-sichbare OSD mit Back/Exit, dann wird auch der Destruktor aufgerufen. Also eigentlich scheint das Objekt da zu sein.


    edit: Die Quelltextformatierung korrigiert.


    Füge ich in Show() folgendes ein:

    Code
    1. osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrGray50);

    dann sehe ich sowohl beim ersten Aufruf, als auch bei allen nächsten genau die Grauschattierung. Also wird das OSD dargestellt, nur die Pixmap nicht.

    Ich muss mal weiter experimentieren. Laut Doku muss man die Pixmap nicht löschen, aber ich meine, das hätte ich auch schon versucht.

  • Hi,

    also ich kann schon Unterschiede im verhalten von softhddevice und softhdcuvid feststellen, aber scheinbar sind fast alle plugins betroffen.

    Was mir aufgefallen ist femon scheint sich besser zu verhalten mit softhddevice (resize).

    CU

    9000h

    Es ist eagl in wlehcer Reiehnfogle die Bchustebaen in Woeretrn vokrmomen. Huapstache der estre und leztte Bchustbae sitmmen.

  • Zabrimus ,


    Du nutzt ja hier

    Code
    1. pixmap = osd->CreatePixmap(0, rect, rect);

    Layer 0 für die Pixmap, der wird ja in der osd.h explizit als Sonderfall dargestellt. Möglicherweise liegt es ja daran.


    Und das osd->Flush() in der readOsdUpdate() wird auch immer aufgerufen? Das ist hier so nicht erkennbar.


    Grüsse

    kamel5

    VDR 2.5.6: ASUS Prime X470-PRO, Ryzen 7 2700, 64GB, 6TB HD, GT1030, Fedora 34 Kernel 5.14 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • Genau um das resize-Problem wollte ich mich kümmern und dabei gibt es ein anderes grundsätzliches Problem.


    Das readOsdUpdate wird ohne Probleme immer bis zum Ende durchlaufen und damit auch das flush. Ich finde/erkenne nirgendwo Anomalien. Es gibt keine Fehlermeldung, die mir weiterhelfen kann, keine Abstürze oder eingefügte Ausgaben, die nicht erscheinen.

    pixmap->DrawImage(recPoint, recImage); wird auch aufgerufen, aber eben nicht dargestellt.


    Mit dem Layer habe ich auch schon rumgespielt. Von fixen Werten > 0 und sehr brachial den immer um 1 bei jedem OSD inkrementiert öffnen um überhaupt einen Effekt zu erzeugen, aber das ohne Erfolg.

  • Ich denke es ist ein Error 40 (40 cm vor dem Bildschirm) und ich habe es nicht erkannt :(

    CEF scheint mich wieder einmal ausgetrickst zu haben. Ich weiß nicht, welche Optimierungen da im Hintergrund laufen, aber wenn ich dieselbe Seite nochmal lade (2. OSD Aufruf), dann bekomme ich nicht wirkliche die komplette Seite geliefert, sondern nur etwas transparentes. Im Chrome Debugger sah immer alles genau so aus, wie ich es im OSD erwartet hatte.


    Bisher habe ich ein Browser Reload per Code und ein location.reload per Javascript versucht. Ohne Erfolg.

    Zumindest weiß ich jetzt, wo ich weiter suchen und probieren muss.

  • Viell. wirds peinlich für mich (kein C++ Experte), aber ich schreibs trotzdem:

    Dass du im Destruktor die Variable eliminierst und ihr DANACH einen Nullpointer zuweist, kann nicht zu Problemen führen, oder?

    MyVDR: yaVDR-Ansible (Ubuntu 18) - softhddevice-openglosd (ffmpeg 2.8) - epgd/epg2vdr - skindesigner estuary4vdr (adaptiert) - 1920x1080@50 Hz | kodi 18 - inputstream + amazon vod
    Aerocube M40 | 300W | ASRock H61M-GE | Intel G530 | Asus ENGT520 | 2 x TT-budget S2-3200 | ASRock Smart Remote (CIR) | 4 GB RAM | 120 GB SSD | 3 TB HDD

  • Die Zuweisung ist Paranoia. Ich will nur sicher gehen, daß nicht ein anderer Thread einen Pointer nutzt, der schon gar nicht mehr gültig ist oder um einen eindeutigen Marker zu haben, daß evt. etwas neu initialisiert werden muss.


    Das Problem mit dem mehrfachen Aufruf des OSD ist gelöst. Dazu musste ich den Browser dazu bringen, die Seite wirklich als 'dirty' zu betrachten. Soweit so gut, aber schon kommt das nächste Problem. Wenn die Fenstergröße verändert wird (mit offenem OSD), dann habe ich mir so gedacht, ich rufe einfach mal osd->SetAreas auf und hole mir eine neue passende Pixmap mit der richtigen Größe, skaliere ein wenig und male das OSD neu.


    Aber dann gelange ich in einen bösen Deadlock im Softhddevice

    Bei initiated.Wait() bleibt er so hängen, daß ich den VDR von einer anderen Shell hart abschiessen muss. Nachdem ich erfolglos versucht habe die Ursache zu bestimmen, muss ich mir eine andere Lösung überlegen. Meiner Ansicht nach müsste es eigentlich funktionieren. Es ist zu seltsam.

    bool cOglCmdInitFb::Execute(void); wird anscheinend nicht aufgerufen. In der Methode sollte das Signal gesendet werden.


    Ich muss also wahrscheinlich das OSD schliessen, eine neue Pixmap besorgen und das OSD wieder öffnen. Aber so oft ändert man die Größe des Fensters auch nicht, oder?