[patch] framesynchrone Ausgabe mit der Xv-Extension am VGA/DVI Anschluss

  • Dieser Bastel-Thread:) soll sich um die exakte Synchronisation des Bildrefresh auf dem
    Display mit der Framerate des decodierten MPEG Datenstromes drehen. Diese Synchronisation ist u.a.
    fuer den optimalen Betrieb eines Displays (z.B.LCD-TV Roehren-TV, Computermonitor) ueber
    den VGA/DVI Anschluss einer Grafikkarte im VDR wichtig.



    Problem 1: exaktes Videotiming


    Im Forum wurde schon einiges darueber philosophiert, warum Filmwiedergabe ueber Grafikkarten
    und deren VGA/DVI Anschluss oft nicht absolut fluessig (d.h. ruckelfrei) ablaeuft.


    Als Hauptgrund wird meist angefuehrt, dass die Grafikkarte mit starrem Videotiming laeuft,
    das sich nicht einfach mit der Framerate des decodierten Bildmaterials synchronisieren laesst.


    Das ist zwar grundsaetzlich richtig, aber bei entsprechender Konfiguration des Videotimings
    der GraKa ist dieser Effekt IMHO eigentlich vernachlaessigbar. Dies soll im weiteren
    erklaert werden.


    Der MPEG Videostream von Sender liefert die PAL-Halbbilder mit exakt 50Hz, deswegen wird im
    weiteren ein 50Hz-faehiges Display vorausgesetzt. Diese Eigenschaft haben roehrenbasierte
    Geraete immer, LCD- und Plasmageraete offenbar nur in Ausnahmefaellen.


    Jetzt kommt es also drauf an, dass die Grafikkarte moeglichst genau auf diese 50Hz
    programmiert ist, da es sonst in gewissen Zeitabstaenden zu verdoppelten/weggelassenen
    Halbbildern kommt.


    Folgender Zusammenhang besteht zwischen tatsaechlicher Refreshrate der Grafikkarte (F)
    und der Zeit zwischen den unerwuenschten Halbbild-Spruengen (T_SKIP). Es ist nichts anderes
    als die Formel fuer die Periodendauer einer Schwebung zwischen zwei Frequenzen:


    T_SKIP = 1 / (50 - F)


    Beispiel:
    Eine Grafikkarte laeuft mit 49.99Hz Refreshrate. Dann bekommen wir


    T_SKIP = 1 / (50Hz - 49.99Hz) = 100s


    Das heisst bei 49.99Hz Refreshrate muessen 100 Sekunden vergehen, bis ein einziges Halbbild
    zum Zweck der Resynchronisierung uebersprungen/hinzugefuegt werden muss. Das ist vielleicht
    nicht perfekt, aber dieses 'Problem' wird man unter normalen Umstaenden mit blossem Auge
    kaum wahrnehmen.


    Der nVidia CS X-Server scheint in diesem Punkt die Nase vorne zu haben. Der
    Vertikalrefresh laesst sich hier tatsaechlich in 0.01Hz Schritten konfigurieren.


    Im Anhang ein kleines Programm, das die Refreshrate fuer Radeon Karten bei laufendem
    X-Server anzeigt. Es benutzt hierzu das DRM Kernelmodul ueber die zugehoerige
    DRM Library (Direct Rendering Manager). Tests vorsichtshalber aber nicht auf Produktivsystem
    machen.



    Problem 2: Bildrefresh exakt in den VBLANK Phasen


    Ein weiteres Problem entsteht, wenn der Inhalt der Framebuffer waehrend der Uebertragung
    zum Display veraendert wird. Um dies zu vermeiden, wird der Framebuffer-Update am besten
    nur in den VBLANK Phasen des Videosignales vorgenommen.


    Loesung:


    Beim nVidia X-Server gibt es hierfuer bekanntlich die 'XVideoTextureSyncToVBlank' Option. Diese
    Funktion wird hier in Hardware ausgefuehrt - natuerlich die beste Variante.


    Im ATI Radeon DDX habe ich nichts Vergleichbares gefunden. Auch im Inet scheint sich niemand
    dafuer zu interessieren. Deswegen habe ich einen kleinen Patch mit genau dieser Funktion
    geschrieben. Er ist urspruenglich fuer das ATI Radeon DDX in X.Org 7.[12] gedacht, kann aber
    sinngemaess leicht auf andere Grafikhardware angepasst werden. Das DRM Modul (optional)
    gibt es fuer einige GraKas und die Putimage Routinen in den verschiedenen X-Servern sind sich
    meist recht aehnlich.
    Der Patch ist im Anhang.


    Ich habe ueber '#defines' steuerbar verschiedene Optionen eingebaut. Wahlweise kann die
    Synchronisation ueber BusyWait, das direkt auf die Hardwareregister der Radeon geht, laufen.
    Alternativ ueber einen blockierenden ioctl() des DRM Treibers. Dieser bekommt seine Interrupts
    genau in den VBLANK Phasen und eignet sich gut fuer unsere Zwecke.


    Uebrigens liegt die Systemlast bei der BusyWait Version erstaunlicherweise nicht wesentlich
    hoeher, als bei der ioctl() Version.


    Weitere Optionen sind diverse Debugmoeglichkeiten, z.B. Timestamps wenn Frames wegen ungenauer
    Refresh-Einstellung uebersprungen werden muessen. Optional wird die Rate, mit der die Frames vom
    MPEG-Decoder/Deinterlacer geliefert werden, ausgegeben.



    ===
    Mit dem Patch habe ich nun fluessige PAL-RGB Wiedergabe (interlaced) ueber eine IGP 9100 (Radeon)
    und dem VGA to RGB Adapter an einem Roehren-TV.


    Es funktioniert aber genauso gut mit progressiven 50Hz ueber VGA/DVI an einem Computermonitor.


    Nur ein geeignetes LCD-TV, das z.B. native 1366x768@50Hz versteht, konnte ich fuer den Test
    noch nicht finden.


    Gibt's sowas ueberhaupt?? :schiel

  • Hi Martin.


    Zitat

    Originally posted by nordlicht
    wäre evtl. jemand bereit, diese Geschichte für Debian Etch paketmäßig zusammenzustellen. Ich habe mehr Ahnung vom Programmieren als von solchen Sachen.


    da die ATI Karten im Gegensatz zu nVidia keinen Hardwaresupport fuer den VSYNC bieten, ist die Loesung noch nicht 'perfekt'. Ich hatte es erst mal als Grundlage fuer eigene Experimente verstanden. Man muesste die Sync-Funktion besser im Treiber statt im Userprozess implementieren. Deswegen ist ein offizielles 'Debian' Paket noch zu frueh. Am schnellsten muesste es fuer dich mit 'apt-get source' und 'dpkg-buildpackage' gehen.


    Mich wuerde mal interessieren, wie ich an die Hardware Specs fuer die verschiedenen GraKas (soweit ueberhaupt oeffentlich zugaenglich) dran komme. Aber fuer diese Frage ist es das falsche Forum hier.


    sparkie

  • Hallo sparkie,


    Respekt vor Deinem Einsatz!


    1)
    Ich habe zuerst mal das refreshrate-Tool ausprobiert. Es zeigte etwa 50,4 Hz an.
    Nachdem ich das Paket xf86-video-ati mit Deinem Patch neu gebaut hatte, komme ich ich auf etwa 50,2 Hz.
    Im Moment weiß ich aber nicht so recht, ob der Patch überhaupt funktioniert oder ob ich das noch über die DEFINES hätte tun sollen.
    Welche Werte hast Du denn an dieser Stelle?


    2)
    Wieso hat die Modeline aus dem Patch (50_WaitForVerticalSync.patch) eigentlich eine "vertical field length" mit dem Wert 629?


    Wenn ich diese Modeline verwende, sieht das mein Fernsehgerät scheinbar nicht als gültigen Modus an, da es weiterhin das OSD anzeigt.


    Normalerweise habe ich da einen Wert von 625, was auch nach der Formel auf der Site
    <http://en.wikipedia.org/wiki/XFree86_Modeline> genau 25 (Halbbilder) ergibt.


    13500000/(864*625) = 25
    13500000/(864*629) = 24,841

    Mein VDR
    vdr4arch mit softhddevice, VDR-2.2.0; KODI Mainboard: MSI 785GM-E51, CPU: iAMD Athlon II, GPU: GeForce GTX 550 Ti; nvidia:364.19, DVB1-2: DD Cine S2; DVB3-4: DD DuoFlex S2;, RAM: 1*2G DDR3, AV-Receiver Pioneer VSX-923K

  • Hi Hitman47,


    Zitat

    Ich habe zuerst mal das refreshrate-Tool ausprobiert. Es zeigte etwa 50,4 Hz an.
    Nachdem ich das Paket xf86-video-ati mit Deinem Patch neu gebaut hatte, komme ich ich auf etwa 50,2 Hz.


    Zitat

    Wieso hat die Modeline aus dem Patch (50_WaitForVerticalSync.patch) eigentlich eine "vertical field length" mit dem Wert 629?


    mit dem Wert 625, den ich auch urspruenglich hatte, waren es bei mir ebenfalls ca. 50,2 Hz. Deswegen habe ich die Zahl der
    Gesamtzeilen vergroessert auf 629. Jetzt zeigt er bei mir 49.95 Hz an, was natuerlich naeher an 50Hz liegt. Rechnerisch
    waere aber, wie du sagt, der Wert 625 korrekt. Vielleicht ist aber die Dotclock schon nicht exakt 13.5Mhz. Ein tatsaechlicher Wert
    von 13.586Mhz wuerde die Abweichung erklaeren.
    Eigentlich muesste man es mit einem Frequenzzaehler analysieren.


    Zitat

    oder ob ich das noch über die DEFINES hätte tun sollen. Welche Werte hast Du denn an dieser Stelle?


    die besten Ergebnisse erhalte ich mit dieser '#define'-Kombination:

    Code
    #define USE_S2VBLANK
    //#define USE_DRM
    //#define DEBUG_S2VBLANK
    //#define MEASURE_XINE_FPS


    Das Ergebnis ist aber auch hier noch nicht ganz perfekt. Jedoch schon eine erhebliche Verbesserung gegenueber der
    voellig unsynchronisierten Standardvariante, wie sie X.org ausliefert.
    Vermutlich muesste man die Synchronisation, also Warten + Ausfuehren des Bufferswitch komplett in den Kernel (Treiber)
    verlagern. Sonst ist der Bufferswitch genau in den VBLANK Phasen nicht garantiert.


    Mein Problem momentan ist, dass ich keine Hardwarespec fuer die Radeons habe. Ich muss mal versuchen rauszufinden, was die Basis fuer die
    Maedels von X.org war, als sie das DDX dafuer geschrieben haben :)


    sparkie

  • Ich habe auf der Site <http://www.gossamer-threads.co…/mythtv/users/95648#95648> eine Modeline gefunden, die laut refreshtool eine Frequenz von 49.992501 Hz ergibt.
    Mein Fernsehgerät ist damit nun auch zufrieden, da es das OSD nicht mehr anzeigt, was es bei einer "vertical field length" von 629 getan hat


    Modeline "720x576i" 13.875 720 744 808 888 576 580 585 625 Composite interlace

    Mein VDR
    vdr4arch mit softhddevice, VDR-2.2.0; KODI Mainboard: MSI 785GM-E51, CPU: iAMD Athlon II, GPU: GeForce GTX 550 Ti; nvidia:364.19, DVB1-2: DD Cine S2; DVB3-4: DD DuoFlex S2;, RAM: 1*2G DDR3, AV-Receiver Pioneer VSX-923K

    3 Mal editiert, zuletzt von Hitman47 ()

  • Zitat

    Originally posted by Hitman47
    Ich habe auf der Site <http://www.gossamer-threads.co…/mythtv/users/95648#95648> eine Modeline gefunden,


    der Post ist auch sonst recht interessant, danke fuer den Tipp!


    Zitat

    die laut refreshtool eine Frequenz von 49.992501 Hz ergibt.
    Mein Fernsehgerät ist damit nun auch zufrieden, da es das OSD nicht mehr anzeigt, was es bei einer "vertical field length" von 629 getan hat


    das ist erstaunlich, da sowohl die alte und auch die neue Modeline genau die vorgeschriebenen 15.625kHz Zeilenfrequenz haben. Die Gesamtzahl der Zeilen ist ja in beiden Faellen gleich: 625. Wieso das dann unterschiedliche VSYNC Zeiten gibt, verstehe ich im Moment nicht. Ich muss das bei mir mal versuchen zu reproduzieren. Und die Modeline-Vorgaben mit dem Oszilloskop vergleichen. Vielleicht setzt die Radeon die Timingwerte nicht immer 1:1 um :)


    In der Zwischenzeit konnte ich den Patch auch auf einem baugleichen System mit 2.0GHz Celeron testen (hatte vorher 3.06GHz). Dabei faellt auf, dass es nur funktioniert, wenn ich dem X-Server mit 'renice -2' eine hoehere 'scheduling priority' gebe. Das ist natuerlich keine Loesung.


    Ich versuche den X-Server Patch, wie oben schon angedeutet, mal in einen Treiber zu verlagern. Sonst erhaelt man keine garantierten Ausfuehrungszeiten fuer den Bufferswitch. Da komm ich aber leider fruehestens am Wochenende dazu...

  • so, inzwischen habe ich mal meine Entwicklungsumgebung von Debian Sarge auf Etch umgestellt:D, um mich um den Treiber zu kuemmern.


    als naechstes habe ich erst mal einen VDR mit xineliboutput zusammengebaut. Mich hat's schier umgehauen. Selbst mit meinem 2GHz Pundit habe ich mit dem VGA-to-SCART-Adapter mit/für ATI-Radeon-Grafikkarten ein ruckelfreies Bild (getestet mit n-tv Laufschriften oder Fussballspielen und den dort typischen Kameraschwenks) Es sieht so aus, als waere mein Treiber gar nicht mehr noetig:)


    Hier sind mal meine Randbedingungen (ich hoffe ich habe nix vergessen):

  • Hallo sparkie,


    ich habe nun auch einmal xineliboutput installiert.
    Das Bild wirkt agiler, aber anstelle von längeren Rucklern beginnt das Bild bei Kameraschwenks nun zu zittern (also kurzes Ruckeln).


    Die CPU-Last ist von ca. 30 Prozent auf 50 Prozent gestiegen. Ich verwende für softdevice lavc als Deinterlacer und für xineliboutput deine Einstellungen.


    Im Grunde würde ich so Xineliboutput ganz gerne benutzen, aber es hat für mich auch noch den Nachteil, dass ich damit nicht Musik hören und gleichzeitig LiveTV schauen kann.


    Mir fällt es schwer, dabei die Vergleiche zwischen softdevice und xineliboutput herauszusehen.
    Kennst du für diese Tests Referenzmaterial, so dass wir auch gegenseitig unsere Erfahrungen besser vergleichen könnten? Vielleicht sogar eine VDR-Aufnahme?

    Mein VDR
    vdr4arch mit softhddevice, VDR-2.2.0; KODI Mainboard: MSI 785GM-E51, CPU: iAMD Athlon II, GPU: GeForce GTX 550 Ti; nvidia:364.19, DVB1-2: DD Cine S2; DVB3-4: DD DuoFlex S2;, RAM: 1*2G DDR3, AV-Receiver Pioneer VSX-923K

  • Zitat

    Originally posted by Hitman47
    Das Bild wirkt agiler, aber anstelle von längeren Rucklern beginnt das Bild bei Kameraschwenks nun zu zittern (also kurzes Ruckeln).


    auf dem VGA->RGB VDR sind diese Effekte bei mir jetzt verschwunden.


    Zitat

    Die CPU-Last ist von ca. 30 Prozent auf 50 Prozent gestiegen. Ich verwende für softdevice lavc als Deinterlacer und für xineliboutput deine Einstellungen.


    ich habe typischerweise diese Werte (waehrend der Fussballtest laeuft)

    Code
    top - 19:40:16 up 3 min,  5 users,  load average: 2.33, 0.89, 0.33
    Tasks:  75 total,   2 running,  73 sleeping,   0 stopped,   0 zombie
    Cpu(s):  9.9%us, 11.2%sy, 21.5%ni, 54.8%id,  0.3%wa,  1.3%hi,  1.0%si,  0.0%st
    Mem:    450784k total,   137200k used,   313584k free,        0k buffers
    Swap:        0k total,        0k used,        0k free,    85640k cached


    aber das ganze hat vermutlich weniger mit Last als mit Scheduling und Latency zu tun. Ich habe die .config des aktuellen Backport Kernels '2.6.22-2-686' bis auf den Radeontreiber unveraendert gelassen. Dort wird z.B.

    Code
    CONFIG_HZ_250=y
    # CONFIG_HZ_300 is not set
    # CONFIG_HZ_1000 is not set
    CONFIG_HZ=250

    verwendet.


    Zitat

    Kennst du für diese Tests Referenzmaterial, so dass wir auch gegenseitig unsere Erfahrungen besser vergleichen könnten? Vielleicht sogar eine VDR-Aufnahme?


    ja ich schneide mal 2 x 5 Minuten meiner Tests zusammen. Ich schick dir dann 'ne PM wo du es holen kannst.


    ein paar Fragen noch:
    - welche CPU/Takt hast du im Einsatz?
    - welchen Kernel?
    - alle Einstellungen wie im obigen Post vorgenommen?


    [EDIT] habe dir gerade eine eMail geschickt[/EDIT]


    [EDIT2] leider bin ich erst Montag wieder Online (Verwandtenbesuch ohne Inet :tdw)[/EDIT2]

  • mitterweile habe ich noch weitere Tests gemacht mit:


    xine-0.8.0
    xine-lib-cvs-20070829224000.tar.bz2
    xine-ui-cvs-20070829224000.tar.bz2


    und auch mit dem remote-frontend von xineliboutput:
    /usr/bin/vdr-sxfe


    Ich erreiche mit keiner dieser Varianten die Qualitaet wie mit dem lokalen xineliboutput-Frontend '--local=sxfe --video=xv'.


    Hier ist in der Fluessigkeit der Darstellung kein Unterschied zu einer FF Karte mehr zu sehen. Zum Vergleichstest schalte ich dabei kurz auf den eingebauten Tuner des Roehren-TV um.
    Ich bin absolut beeindruckt. Jetzt muss ich nur noch rausfinden, warum speziell das lokale sxfe Frontend so ein Super-Ergebnis liefert:-)

  • Hallo,


    ich möchte meinen LCD auch über DVI an einer Radeon 9200 benutzen. Die Native Auflösung ist 1920x1080. Er versteht 'p' und 'i'.


    Hilft mir dein Patch da auch?


    Momentan verwende ich vdr-->tvtime-->X und freevo-->X.


    Gruß,
    Hendrik

  • Zitat

    Originally posted by henfri
    ich möchte meinen LCD auch über DVI an einer Radeon 9200 benutzen. Die Native Auflösung ist 1920x1080. Er versteht 'p' und 'i'.


    Hilft mir dein Patch da auch?


    nein.


    ist zwar OT hier:
    Aber was funktioniert bei dir eigentlich nicht? Oder wie aeussert sich es?

  • Hallo Sparkie,


    jetzt verwende ich XineLibOutput. Brauche ich jetzt deinen Patch ? ( :) )


    Wenn ich es richtig verstehe, umgehe ich mit deinem Patch die Notwendigkeit zu deinterlacen, oder?



    Gruß,
    Hendrik

  • Zitat

    Originally posted by henfri
    jetzt verwende ich XineLibOutput. Brauche ich jetzt deinen Patch ? ( :) )


    der hier beschriebene Patch umgeht ein Problem, das ich mit einer aelteren Version der xine-lib und xineliboutput hatte.


    Insofern ist dieser Patch heute nicht mehr relevant. Ich sollte diesen Thread eigentlich schliessen.


    Zitat

    Wenn ich es richtig verstehe, umgehe ich mit deinem Patch die Notwendigkeit zu deinterlacen, oder?


    du meinst wohl den Patch, der in diesem Thread beschrieben wird:


    [patch] RGB/PAL ueber VGA mit variabler Framerate


    Bevor du dich da heranwagst, wuerde ich an deiner Stelle erst einmal alles in Standardkonfiguration testen.

  • Hallo,


    na, momentan läuft es über xineliboutput ohne Probleme. Aber ich muss deinterlacen. Wenn ich mit deinem Patch nicht deinterlacen muss, wäre es ein echter Vorteil.


    Gruß,
    Hendrik

  • Zitat

    Wenn ich mit deinem Patch nicht deinterlacen muss, wäre es ein echter Vorteil.


    ja klar. ABer funktioniert derzeit nur fuer RGB/SCART, wenn das angeschlossene Geraet (z.B. TV-Roehre) das Deinterlacen uebernimmt. BTW: gerade habe ich eine neue Version hochgeladen.


    Alles weitere bitte im genannten Thread.


    Diesen Thread schliesse ich jetzt, da er heute nicht mehr relevant ist.

Jetzt mitmachen!

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