Videotearing in Linux (Manjaro/Arch) und XBMC

What the heck is Videotearing?

Tearing äußert sich auf dem Monitor dadurch, dass horizontale Streifen durch das komplette Bild wahrnehmbar sind. Das ist vorallem bei Videos und Filmen ärgerlich, da das Bild anfängt zu stocken und ziemlich „zerrissen“ ausschaut. Extrem fällt das bei schnellen Kameraschwenks auf. Es vermittelt den Eindruck als würde man mehrere Bilder gleichzeitig sehen, die alle ein bisschen verschoben sind (wobei genau das auch der Grund ist, siehe unten). Es gibt mehr als genug Beispiele wirft man einfach die Google Bildersuche an. Kurzum, ein Spaßkiller möchte man einen entspannten Filmabend verbringen.

Woher kommt’s?

Das Problem liegt hierbei an der Grafikkarte, diese berechnet und schickt die Bilder schneller an den Monitor als der sie darstellen kann. Das fällt extrem auf bei den genannten schnellen Kameraschwenks. Bevor ein Bild komplett auf dem Monitor angezeigt wird, schick die Grafikkarte schon das nächste Bild, welches der Monitor dann sofort anfängt darzustellen. Dadurch wird das typische Muster erzeugt, dass auf dem Monitor untereinander gleichzeitig verschiedene Bilder dargestellt werden, die deutlich mit einem Streifen getrennt sind. Je nach Film kann dies zu extremen Rucklern oder Verzerrungen führen. Gerade bei schnellen Actionfilmen wird dadurch der Film „unschaubar“.

Was tun?

Abhilfe schafft hier die sogenannte Vertical Synchronisation, kurz VSync. Ist sie eingeschaltet wartet die Grafikkarte bis der Monitor fertig ist ein Bild darzustellen und schickt erst dann das nächste Bild an den Monitor. Diese Option kann man so gut wie bei jeder Grafikkarte in den Einstellungen aktivieren.

Wo liegt dann das Problem?

Was tun, wenn VSync aktiviert ist (in XBMC und in XFCE4) das Problem aber trotzdem noch auftritt? Ja das ist die große Frage. Ich habe sämtliche Optionen und Lösungsansätze getestet die ich im Netz gefunden. Dort habe ich die Lösung dann auch gefunden. Es stellte sich heraus, dass die aktuelle Version von XOrg das Problem war. Ab 1.15.0 ist die sogenannte „backing store function“ standardmäßig aktiviert, welche zu genau diesem Problem führt.

Lösung

Ich habe momentan Manjaro Linux (basiert auf Archlinux) mit XFCE auf meinem mini Media PC mit einer integrierten Intel Grafik am laufen.

Also hab ich zuerst versucht VSync zu aktivieren. In Manjaro muss hierzu diese Datei bearbeitet /etc/X11/mhwd.d/intel.conf (bei purem Arch wäre es: /etc/X11/xorg.conf.d/20-intel.conf) und um folgendes ergänzt/abgeändert werden:

Section "Device"
   Identifier "Intel Graphics"
   Option "SwapbuffersWait" "true"
   Option "AccelMethod"  "sna"
   Option "TearFree" "true"
EndSection

Hiermit wird VSync (TearFree) aktiviert.

Siehe Update 1.

Des weiteren habe ich über Probleme des Compositing gelesen und entschlossen dieses in den XFCE optionen komplett zu deaktivieren. Da ich den PC sowieso nur für MPD, XBMC und ähnliches benutzen möchte, brauche ich hier sowieso keine „fancy“ Effekte 😉

Der letzte Schritt in Manjaro/Arch war dann die backingstore Funktion zu deaktivieren. Das ganze ist in Arch super einfach, es muss lediglich das AUR Repository eingerichtet sein – was in Manjaro schon ab Installation vorhanden ist. Dann einfach ein kurzes:

yaourt -S sdl-nobackingstore

Und nach einem Reboot läuft alles wie man sich das wünscht. Besonders schön ist es in XBMC noch die Funktion „Adjust display refresh rate to match video“ zu aktivieren (vorausgesetzt der Fernseher unterstützt alle Videomodi wie z.B. 24p). Dadurch erhält man ein noch flüssigeres und angenehmeres Filme-Erlebnis 😉

Auch für Ubuntu Jünger gibt es hier Abhilfe (siehe Eintrag #12).

Update 1

Nach mehreren Stunden Videos ist mir aufgefallen, dass das Bild nach einer gewissen Zeit anfängt zu stottern und ab und zu kleine Lags auftauchen. Das äußert sich so, dass das Bild ganz kurz stehen bleibt und dann in doppelter Geschwindigkeit läuft bis es wieder synchron ist, danach läuft es ganz normal weiter. Komisch ist, dass es nicht durchgängig auftaucht. Nachdem ich das neuste Systemupgrade von Manjaro installiert hatte, XBMC auf 13.2 RC1 upgegraded und TearFree wieder deaktiviert hatte (nobackinstore + XBMC VSync reicht vollkommen aus um das Tearing zu verhindern), funktionierte alles einwandfrei ohne Ruckler. Was genau das Problem ausgelöst hat weiß ich nicht, aber in der Konfiguration funktioniert alles wunderbar.