[PATCH] OpenGL und XShape für das xineliboutput Pluign

  • Hallo zusammen,


    ich bin seit Jahren begeisterter VDR Nutzer. Da ich meine FF-Karte bei einem versuchten Speichermod zerstört habe, bin ich auf das xineliboutput Plugin umgestiegen. Ich benutze die --hud Option von vdr-sxfe, um ein transparentes OSD zu bekommen. Leider führt das dazu, dass es zusammen mit VDPAU zu Rucklern kommt. Ausserdem muss ein Fenstermanager mit Composing laufen.


    Das hat mir alles nicht gefallen und ich habe mit ein paar Programmierexperimenten angefangen. Herausgekommen ist ein Patch, der vdr-sxfe um folgende Funktionen erweitert:


    - XShape Unterstützung: Falls kein Fenstermanager mit Composing läuft, kann die Option --hud trotzdem benutzt werden. Das OSD wird dann ohne Transparenz angezeigt. Es ist unabhängig von der Videogröße. Der Vorteil gegenüber der herkömmlichen Methode (Einbetten des OSD in den Videostrom bzw. Nutzen der OSD Funktion der xinelib) ist eine besser Qualität und höhere Geschwindigkeit.
    - OpenGL Unterstützung für Video- und OSD-Darstellung: Falls zusätzlich zur --hud die --opengl-always Option angegeben wird, dann wird OpenGL zur Darstellung des Videos und des OSDs benutzt. Damit gibt es dann ein transparentes OSD, ohne das ein Fenstermanager laufen muss. Das funktioniert bei mir allerdings nur mit vdpau, nicht mit xv. Aus irgendeinem Grund kann bei dem xv Videotreiber xine das Video nicht in eine Pixmap ausgeben, die dann als Textur benutzt wird. Leider führt das bei mir aber auch zu Rucklern. Deshalb gibt es noch eine zweite Option.
    - OpenGL Unterstützung für reine OSD-Darstellung: Falls anstelle --opengl-always --opengl-hud angegeben wird, dann wird das Video bei unsichtbaren OSD wie gewohnt ausgegeben. Nur falls das OSD sichtbar ist, wird OpenGL benutzt. So kann es nur beim Arbeiten mit dem OSD zu Rucklern kommen. Das kann ich aber verschmerzen, da man sich ja normalerweise mehr auf das Menü konzentriert.
    - Weiches Ein- und Ausblenden des OSDs: Bei Verwendung einer der beiden OpenGL Option wird das OSD weich ein- und ausgeblendet.
    - Video Fenster Unterstützung für das yapeghd Plugin: Damit wird das Video verkleinert, wenn das yaepghd Plugin aufgerufen wird. Je nach Skin hat man dann z.B. oben rechts das komplette Video. Den Rest des Bildschirms wird dann mit der Programmtabelle ausgefüllt. Funktioniert nur mit einer der beiden --opengl Optionen.


    Ich hoffe, das für jeden etwas dabei ist. Ich habe Patches für verschiedene Versionen des xineliboutput Plugins angehängt. Das erste Datum im Namen des Patches gibt das verwendete CVS Datum des Plugins an. Das zweite Datum gibt an, wann ich das letzte Mal den Patch bearbeitet habe. Mit der neusten Version des Plugins habe ich momentan noch das Problem, dass die Wiedergabe über das Netzwerk nicht funktioniert. Ich habe schon ein Fehlerbericht an die xineliboutput Entwickler geschickt.


    Hier die Kommandos zum Anwenden des Patches:


    cvs -d:pserver:anonymous@xineliboutput.cvs.sourceforge.net:/cvsroot/xineliboutput login
    cvs -z3 -d:pserver:anonymous@xineliboutput.cvs.sourceforge.net:/cvsroot/xineliboutput co -P vdr-xineliboutput
    cd vdr-xineliboutput
    patch < xineliboutput.hud_extension.patch.txt


    Falls es durch Weiterentwicklungen des Plugins Probleme beim Patchen gibt, kann man das Arbeitsverzeichnis auch auf das Datum stellen:


    cvs update -d -D 2010-03-28


    Falls es beim Compilieren zu einem Fehler mit der jpeg Bibliothek kommt (struct jpeg_compress_struct has no element do_fancy_downsampling), einfach die betreffende Zeile auskommentieren. Die neuste Version des xinelibouput scheint eine neuere Version der jpeg Bibliothek zu benutzen.


    Und hier noch eine kleine Liste von bekannten Problemen:


    - Ab und zu bleibt beim Schliessen oder Öffnen des OSD das Video stehen. Einfach das OSD nochmal aufrufen, um das Video wieder zum Laufen zu bringen. Dieses Problem tritt nur mit den beiden --opengl Optionen auf.
    - Die "TrickSpeed" des xineliboutput Plugins muss auf 4 gestellt weden (Menü Video). Ansonsten kann es beim Stoppen des Vorspulen dazu kommen, dass das Video noch ein paar Sekunden weiter gespult wird. Dieses Problem tritt auch nur mit den --opengl Optionen auf.
    - Bei meiner Grafikkarte kann das Bild nach einem Neustart des X-Servers ruckeln. Zum Beheben muss ich entweder den Rechner neustarten oder den X-Server so lange neustarten, bis das Ruckeln weg ist. Dieses Problem wird aber nicht durch meinen Patch verursacht. Ich vermute eher ein Problem des NVIDIA Treiber.


    Und meine verwendete Konfiguration:


    - OpenSUSE 11.2
    - xine-lib-1.2 CVS Version vom 20. Februar 2010, gepatcht mit xine-lib-1.2-vdpau-extensions-v11-20100127.diff
    - vdr-1.7.13
    - NVIDIA Grafikkarte (Gainward GT210)
    - Fernsehempfang über DVB-T (HD-Wiedergabe konnte ich also nicht testen)
    - 1920x1080p@50Hz
    - Vermeiden von Video Tearing: SyncToVBlank muss eingeschaltet sein (nvidia-settings -a GPUScaling=1,1 -a SyncToVBlank=1)


    Falls Ihr mir danken möchtet, dann bedankt Euch bitte bei meiner Ehefrau. Sie musste einige Wochen lang meine Experimente ertragen...


    Ich habe mittlerweile noch ein paar Fehler behoben. Hier die Änderungsliste:


    20100328:
    - Initiale Version
    20100404:
    - Darstellungsfehler behoben falls das OSD im Fenstermodus benutzt wird
    - Darstellungsartefakte entfernt falls das yaepg Plugin im Fenstermodus benutzt wird

  • Danke für den Patch, hört sich sehr gut an.
    Leider verabschiedet sich vdr-sxfe damit bei mir beim starten mit einem Segfault.




    Backtrace:

    Code
    Core was generated by `/usr/bin/vdr-sxfe --video=vdpau --fullscreen --hud --opengl-hud --reconnect'.
    Program terminated with signal 11, Segmentation fault.
    #0  0x0804fe08 in opengl_init (arg=0x8080d48) at xine_sxfe_frontend.c:1429
    1429      glxpixmap = glXCreatePixmap (this->display, fbcroot, this->surf_back_img->draw, pixmapAttribs);
    (gdb) bt
    #0  0x0804fe08 in opengl_init (arg=0x8080d48) at xine_sxfe_frontend.c:1429
    #1  opengl_draw_frame (arg=0x8080d48) at xine_sxfe_frontend.c:1479
    #2  0xb73fbba6 in start_thread () from /lib/libpthread.so.0
    #3  0xb74f755e in clone () from /lib/libc.so.6

  • Wie sieht den der Inhalt der Variablen aus, die an glXCreatePixmap übergeben werden? Und wie sieht die Ausgabe von ./configure aus? Wichtig ist auch, das Plugin und vdr komplett neu zu übersetzen (make clean im xineliboutput Verzeichnis, make clean && make && make plugins im vdr Verzeichnis, danach dann vdr-sxfe mit make install im xineliboutput Verzeichnis installieren)

  • configure sagt


    Kann ich mir mit gdb den Inhalt der Variablen anzeigen lassen? Ansonsten schreib ich das nachher mal fix in den Code um die auszugeben.


    Das xinelibout-Plugin und vdr-sxfe hab ich neu gebaut. VDR selbts nicht, da ja an ihm nichts verändert wurde.

  • Zitat

    Original von Maniac

    Code
    Disabled features:
      libextractor
      dbus_glib_1
      videowin


    Kann ich mir mit gdb den Inhalt der Variablen anzeigen lassen? Ansonsten schreib ich das nachher mal fix in den Code um die auszugeben.


    Das xinelibout-Plugin und vdr-sxfe hab ich neu gebaut. VDR selbts nicht, da ja an ihm nichts verändert wurde.


    Der einzige Unterschied zu meiner Konfiguration ist, dass bei mir das dbus_glib_1 feature aktiviert ist. Das sollte aber eigentlich keinen Einfluss haben. Aber man weiss ja nie... Und ich wüde vdr trotzdem komplett neu übersetzen. Ich hatte auch diverse Situationen, in denen ich Abstürze hatte, die mit einem Neubau des vdrs behoben waren.


    Die Variableninhalte kann man sich mit "p <name>" anschauen lassen.

  • Ich hab es gerade nochmal probiert, der Segfault bleibt leider.


    VDR 1.7.14
    xine-lib und xineliboutput von heute
    NVidia-Treiber 256.25


    Hier nochmal die Ausgaben von gdb mit Variablen-Inhalten. Stutzig machen mich dabei die beiden "Cannot access memory" Meldungen.



    Edit: Ich hab gerade nochmal ein bischen weiter geforscht. Ein paar Zeilen weiter oben gibt es

    Code
    glxpixmap = glXCreatePixmap (this->display, fbcroot, this->video_frame_pixmap, pixmapAttribs);


    das läuft ohne Segfault.
    Diese Zeile macht die Probleme:

    Code
    glxpixmap = glXCreatePixmap (this->display, fbcroot, this->surf_back_img->draw, pixmapAttribs);


    Das Problem wird also irgendwo bei "this->surf_back_img->draw" liegen.


    Edit2: Hier wird Xrender_Surf erstellt. draw ist dabei allerdings vom Typ "Drawable". Ich denke mal das wird der Segfault sein.


    Code
    typedef struct _xrender_surf
    {
      Visual   *vis;
      Drawable  draw;
      Picture   pic;
      uint16_t  w, h;
      uint8_t   depth;
      uint8_t   allocated : 1;
    } Xrender_Surf;
  • Ich vermute mal, dass das Anlegen des "surf_back_img" nicht klappt. Ich benutze da eine Funktion, die das xineliboutput Plugin mitbringt ("xrender_surf_new"). Sie wird in der Funktion "hud_osd_open" aufgerufen (ziemlich am Ende). Könntest Du da mal einen Breakpoint setzen (b <Zeilennummer>) und schauen, ob die Funktion überhaupt aufgerufen wird? Funktioniert den das transparente HUD des unmodifizierten xineliboutput mit einem OpenGL Fenstermanager, z.B. kwin von KDE 4 oder compiz? Falls die HUD Erweiterung nicht funktioniert, dann wird auch mein Patch nicht funktionieren, da er auf der HUD Erweiterung aufbaut.

  • Ich komme zwar gerade nicht an den VDR zum testen. Aber es erscheint bei mir ja immer die Meldung "find_argb_visual() failed. HUD OSD disabled."


    Wenn ich mir nun die Funktion "hud_osd_open" ansehe, springt er dort ja mit einem return wieder raus. "xrender_surf_new" wird also nicht aufgerufen.

  • Sollte doch auch mit allen Karten mit Open gl Treibern laufen oder ?


    Gruß
    Jörg

    debian 6.0.7 64-bit, kernel 3.10.0, 2xBudget-CI,Cine S2 V6.5,vdr (2.0.2/2.0.0), vdr-sxfe,remote-plugin + EPSON EH-TW4400 HD Beamer :)

  • Maniac:


    Da haben wir das Problem. Dein X Server unterstützt kein Composing. Stehen folgende Zeilen in Deiner xorg.conf?


    Section "Extensions"
    Option "Composite" "on"
    EndSection


    Falls nicht, bitte mal hinzufügen und nochmal versuchen.


    jackfritt:


    Normalerweise schon, so lange der X Server Composing unterstützt. Nur dann können transparente Bitmaps erzeugt werden. Allerdings habe ich leider nur PCs mit NVIDIA Grafikkarten, so dass ich andere Hersteller nicht testen konnte.

  • Ok, damit ist jetzt der Segfault weg und ich hab auch ein TV-Bild, allerdings wird mir nun kein OSD mehr angezeigt.


    Edit: Nach erneutem lesen des Startposts hat es sich gerade erledigt ;)
    Ich starte nur X, keinen Fenstermanager. Daher ist bei mir die Option --opengl-always nötig.

  • Hallo, ich habe den Patch ausprobiert und bin echt begeistert von der Möglichkeit ein transparentes OSD auf einem nackten X darzustellen.


    Auf einem meiner Clients (Suse 11.1 32bit) lässt sich xineliboutput mit dem patch astrein kompilieren.
    Auf einem anderen (Suse 11.1 64bit) findet er opengl nicht.
    Ich weiß nicht ob es etwas mit der 64bit Version zu tun hat, aber das ist der einzige Unterschied der mir an den beiden Systemen momentan bewusst ist.
    Die mesa-devel Pakete sind auf beiden installiert und auch mesa-32bit habe ich inkl devel noch nachgeschoben.



    Ich kann sowohl ohne als auch mit patch opengl als videotreiber nutzen:

    Code
    # vdr-sxfe --help | grep "Available video"
    Available video drivers: dxr3 aadxr3 xv SyncFB opengl raw xshm xxmc none sdl fb xvmc


    Nur die Optionen --opengl-always und --opengl-hud die der patch einbaut sind nicht verfügbar.
    Ich habe die xineliboutput Version vom 04.04. benutzt, und den entsprechenden patch dazu.

    vdr (1.7.15/1.7.15) streamdev-server (0.5.1) skincurses (0.1.9) infosatepg (0.0.11) extrecmenu (1.2) epgsearch (0.9.25.beta17) femon (1.7.8) text2skin (1.3.1) streamdev-client (0.5.1) xineliboutput (1.0.90-cvs) live (0.2.0) noad (0.7.2)
    Suse (11.3) linux (2.6.34.8-0.2)

    Einmal editiert, zuletzt von G-SezZ ()

  • Ich bekome das Plugin mit Patch (CVS-Stand 2010-04-04) nicht compiliert (Ubuntu 10.04):


    Kann da der Programmierer helfen?


    Danke...


    ...Hagen

  • Hallo,


    also irgendwie klappt es nicht oder ich raff es einfach nicht:


    Ich dachte, ich könnte OHNE composite-manager und OHNE Fenstermanager via OPENGL ein OSD bekommen.


    Ist das falsch?
    Mein Setup:
    vdr 1.7.15
    xineliboutput cvs-Version von heute (13.6.2010)
    Alles neu kompiliert und vorher schön "make clean" und danach "sudo make install" im xinelibout-Verzeichnis


    Was ich probiert habe:
    Nacktes X, composite in xorg disabled, start mit --opengl-always und --hud gibt mir nur die Fehlermeldung:


    Code
    Jun 13 08:00:42 vdr vdr: [6419] [vdr-sxfe]  opening HUD OSD window...
    Jun 13 08:00:42 vdr vdr: [6419] [vdr-sxfe]  find_argb_visual: XGetVisualInfo failed (no xvi)
    Jun 13 08:00:42 vdr vdr: [6419] [vdr-sxfe]     (ERROR (xine_sxfe_frontend.c,597): Die Ressource ist zur Zeit nicht verfügbar)
    Jun 13 08:00:42 vdr vdr: [6419] [vdr-sxfe]  find_argb_visual() failed. HUD OSD disabled.


    Oder dann mal mit composite in xorg enabled: kein OSD!


    Kann mir mal jemand genau sagen, wie der Aufruf von xineliboutput aussehen muss?
    Oder ob ich jetzt in der xorg.conf composite an oder ausschalten muss?


    Muss --hud zusätzlich zu --opengl-hud/--opengl-always angegeben werden? Oder Optional?


    Frank, etwas am verzweifeln...

    AMD E4050, Debian testing/unstable, TT S-1401 + TT S2-3200 (ein Kabel LNB-Shared), VDR1.7.xx+Extensions-patch und so ziemlich jedem Plugin, das es auf der Welt gibt...

  • Mir scheint die komplette OpenGL Funktionalität im Patch vom 4.4.2010 nicht so wirklich zu funktionieren.
    Fehlermeldung s.o. configure findet bei mir einfach kein opengl, ich bin jetzt seit einer Woche am herumprobieren. Mittlerweile habe ich schon verschiedene Distris (Suse 11.0 bis 11.2 und Debian ausprobiert). Ich weiß nicht ob ich total auf dem Schlauch stehe und mir doch ncoh ein Paket fehlt. Aber Xine oder Mplayer compilieren tadellos mit Opengl und die Ausgabe funktioniert dort auch. Die reine videoausgabe über opengl (--video=opengl) funktioniert auch mit vdr-sxfe, aber die Opengl-Hud Funktionen werden von configure alle deaktiviert.



    Taros666
    Ich kann auf einem nackten X, ohne composite, WM oder sonstetwas, vdr-sxfe mit --video=xv starten (ohne --hud), dann bekomme ich ein transparentes OSD. Allerdings auf Videostream Auflösung herunter skaliert und deshalb nicht wirklich schön. Ich glaube ich muss in den Plugineinstellungen von Xinelib das OSD auch auf Software blending stellen, sonst gabs keine Transparenz, bin mir jetzt nicht sicher.

    vdr (1.7.15/1.7.15) streamdev-server (0.5.1) skincurses (0.1.9) infosatepg (0.0.11) extrecmenu (1.2) epgsearch (0.9.25.beta17) femon (1.7.8) text2skin (1.3.1) streamdev-client (0.5.1) xineliboutput (1.0.90-cvs) live (0.2.0) noad (0.7.2)
    Suse (11.3) linux (2.6.34.8-0.2)

  • Zitat

    configure findet bei mir einfach kein opengl


    freeglut3-dev hat mir in Xubuntu Lucid gefehlt;


    G-SezZ: hilft das?

    Server: Asus M4N78-VM, Athlon 5200, Tevii S470, 2xHauppauge Nova-HD, Xubuntu 9.10, nvidia 195.30, VDR 1.7.14 + ExtP + xine-plugin 0.9.3
    Client: Gigabyte MA785GMT-UD2H, Athlon II 250, Arctic Cooling Alpine 64 PWM, ASUS EN210 SILENT, Tevii S470, SuperTalent UltraDrive GX 32GB, Antec Fusion, Atric-Einschalter, One4All 7960, Xubuntu 10.04, nvidia 270.29, VDR 1.7.19 + ExtP + xineliboutput

  • Hat denn niemand beim Compilieren diesen Fehler:


    Code
    osd.c: In member function ‘void cXinelibOsd::CmdRle(int, int, int, int, int, unsigned char*, int, unsigned int*, osd_rect_t*)’:
    osd.c:314: error: ‘vidWin’ was not declared in this scope

    ??


    Oder vielleicht die Lösung dafür?


    Gruss...


    ...Hagen

  • BallListiker, tausend Dank, genau das war es!

    vdr (1.7.15/1.7.15) streamdev-server (0.5.1) skincurses (0.1.9) infosatepg (0.0.11) extrecmenu (1.2) epgsearch (0.9.25.beta17) femon (1.7.8) text2skin (1.3.1) streamdev-client (0.5.1) xineliboutput (1.0.90-cvs) live (0.2.0) noad (0.7.2)
    Suse (11.3) linux (2.6.34.8-0.2)

Jetzt mitmachen!

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