CheapBudget

Aus VDR Wiki
(Unterschied zwischen Versionen)
Wechseln zu: Navigation, Suche
(Referenzsystem (future use))
(Referenzsystem (future use))
Zeile 51: Zeile 51:
 
* drm aus dem GIT-Tree <!-- LINK einfügen -->
 
* drm aus dem GIT-Tree <!-- LINK einfügen -->
  
== Referenzsystem (future use)==
+
== Referenzsystem (Ubuntu intrepid, Basis für die Patche von durchflieger)==
  
 
Ubuntu 8.10 (intrepid ibex)
 
Ubuntu 8.10 (intrepid ibex)

Version vom 7. Januar 2009, 11:55 Uhr

Inhaltsverzeichnis

CheapBudget

Beschreibung

Autor: Markus "Mahlzeit" Küchler (Originaltexte mit Erlaubnis von sparkie)

Aufgabe

Entwicklung eines Budgetkarten basierten VDRs mit VGA-Grafik-Ausgabe und RGB/PAL Ausgang in FF-Qualität. (Patch von sparkie)

Problem

Bislang bekannte Grafikkartensysteme arbeiten mit festem Videotiming welches nicht mit dem Stream synchronisiert ist. Dies führt zwangsläufig zu Frame/Field- verlusten, die sich störend bemerkbar machen (z.B. durch sporadisches Ruckeln). Durch Software-Deinterlacing kann man dieses Problem weitgehend kaschieren, jedoch auf Kosten schlechterer Bildqualität bei Darstellung von Interlaced-Material und bei deutlich höherer Rechenlast.

Loesung

Grafikkarten sind grundsaetzlich nicht fuer variable Frameraten konzipiert. Man kann sich nur mit Hardware- oder Software Tricks behelfen. Wie es jetzt aussieht, reicht bereits eine reine Softwarelösung aus.

Der Radeon-DRM Treiber konnte so modifiziert werden, dass im erforderlichen Rahmen beliebige, von 50Hz leicht abweichende Timings am VGA-Port einer Test-Radeon (IGP9100) ausgegeben werden konnten. Genau so, wie eine FF Karte das auch macht. Durch ein neues Verfahren konnten inzwischen die sichtbaren Störungen am Röhren-TV komplett eliminiert werden.

Dabei wurde versucht, die Zahl der Eingriffe ins System zu minimieren. Letztlich braucht man im Moment nur noch 2 sehr überschaubare Patches in xine-lib und im Radeon DRM-kernel Modul. Der Xserver muss derzeit nicht mehr angefasst werden.

Grundsätzlich funktioniert es so, dass die xine-lib, wenn sie einen PutImage() an den Server absetzt, nebenbei noch kontrolliert, ob die Framerate des Xservers zu erhöhen/erniedrigen ist.

Auf diese Weise kann die xine-lib ihre PutImage() Calls immer wieder genau in die Mitte zwischen zwei Blanking-Intervallen driften lassen. Sollte die Framerate vom Streamschwankungen unterworfen sein, ist das kein Problem, da das Videotiming des Xservers sofort nachgeführt wird. Es gehen so bei gleichzeitig maximaler Störsicherheit überhaupt keine Fields mehr verloren.

Da jetzt erstmalig auch unter Verwendung der xine-lib nicht mehr deinterlaced werden muss, fallen auch alle damit verbundenen Nachteile weg. Insbesondere wird der Prozessor dadurch deutlich entlastet. Ein betagter 2Ghz Celeron (400MHz 128KB Socket 478 CPU) langweilt sich inzwischen mit 80% idle bei SD Wiedergabe.

Lesenswerte Threads im VDR-Portal:

 * RGB/PAL ueber VGA mit variabler Framerate
 * Korrekte interlaced und framesynchrone Ausgabe für SDTV/HDTV auf VGA/DVI/HDMI/RGB/SCART

Vielen Dank an sparkie und durchflieger für die Arbeit, die sie in die jeweiligen Patche stecken. Die Ansätze sind sehr interessant und ermöglichen einen Betrieb mit nur einer Budget Karte und einer sehr guten Ausgabequalität.

Requirements

  1. Mainboard mit CPU ab ca. P3-800MHz
  2. xf86-video-ati kompatible Grafikkarte. Momentan getestet sind folgende Modelle
    • Radeon 7000 AGP
    • Radeon IGP-9100
    • Radeon 9200SE AGP
    • Radeon 9250 AGP
    • Radeon 9600SE AGP
    • Radeon X300SE PCIe
  3. DVB-Budget Karte (optional, auch Streaming Ausgabe möglich)
  4. Ein passendes Kabel (VGA2Scart)

Referenzsystem

Debian 5.0 mit gepatchten

  • linux-image-2.6.26
  • xserver-xorg-video-ati experimental
  • xine-lib (1.1.16) oder neuer (z.B. aus dem HG Repository)
  • xineliboutput (1.0.2) oder neuer (z.B. aus dem CVS )
  • drm aus dem GIT-Tree

Referenzsystem (Ubuntu intrepid, Basis für die Patche von durchflieger)

Ubuntu 8.10 (intrepid ibex)

Für diese Plattform gibt es fertige Pakete für i386 und amd64 für die von durchflieger bereitgestellten Patche. Dazu in der /etc/apt/sources.list folgendes ergänzen:

deb http://deb.vdreceiver.de/ubuntu intrepid main

Installation

/etc/apt/sources.list

? Zusätzliche Einträge? Oder bestehende Einträge auskommentieren?

deb http://ftp.debian.org/debian/ testing main contrib non-free
deb-src http://ftp.debian.org/debian/ testing main contrib non-free

deb http://ftp.debian.org/debian/ unstable main contrib non-free
deb-src http://ftp.debian.org/debian/ unstable main contrib non-free

deb http://ftp.debian.org/debian/ experimental main contrib non-free
deb-src http://ftp.debian.org/debian/ experimental main contrib non-free

/etc/apt/apt.conf

APT::Default-Release testing;
APT::Cache-Limit "125000000";   ## Hatte ohne diesen Eintrag (easyVDR) folgende Fehlermeldung: "E: Dynamic MMap ran out of room"

/etc/apt/preferences

Package: *
Pin: release o=Debian,a=testing
Pin-Priority: 501

Oben haben wir experimental packages enabled - jetzt einmal nachschauen welche existieren oder sich geändert haben

apt-get update

Benötigte Pakete installieren

apt-get install linux-image-2.6-686 linux-headers-2.6-686 fakeroot kernel-package git-core mercurial

Installation xorg V7.4 (xserver V1.5):

apt-get -t experimental install xserver-xorg

Übersetzen und installieren des radeon Xserver-DDX

# before building the DDX patched 'radeon_drm.h' must be 
# copied to /usr/include/drm/radeon_drm.h (see below).
apt-get -t experimental build-dep xserver-xorg-video-ati
apt-get -t experimental source xserver-xorg-video-ati
cd xserver-xorg-video-ati-*
patch -p1 < vga-sync-fields/patches/video-ati.patch           ## Patch vorher von der unten gelinkten WebPage downloaden!
dpkg-buildpackage
cd ..
dpkg -i xserver-xorg-video-radeon_*deb

Übersetzen und installieren von drm für den laufenden Kernel

cd usr/src/
git-clone git://anongit.freedesktop.org/git/mesa/drm
cd drm
patch --dry-run -p1 < ../vga-sync-fields/patches/drm-radeon-intel.patch
patch -p1 < ../vga-sync-fields/patches/drm-radeon-intel.patch
cd linux-core
make DRM_MODULES="drm radeon"
modprobe -r radeon drm
# You should save the original drm before removing it!
rm -r /lib/modules/`uname -r`/kernel/drivers/char/drm
make DRM_MODULES="drm radeon" install
depmod -a

# don't forget to copy the patched header file before building the tools
cp drivers/char/drm/radeon_drm.h /usr/include/drm/radeon_drm.h

# then reload the new modules
rmmod radeon
rmmod drm
modprobe radeon

Patchen, übersetzen und installieren von xine-lib

  • xine-lib aus HG Repository holen
hg clone http://hg.debian.org/hg/xine-lib/xine-lib
  • xine-lib patchen
cd xine-lib
patch -p1 < vga-sync-fields/patches/xine-lib.patch
  • konfigurieren, übersetzen und installieren
apt-get install zlib1g-dev cvs
./autogen.sh --with-external-ffmpeg --disable-dxr3
make
make install

Patchen des radeonfb Kernel Moduls

Das Original radeonfb Modul unterstützt bislang keinen interlaced Modus und auch nicht die für RGB Pal benötigten niedrigen Pixelfrequenzen. Mit diesem Patch ist es jedoch möglich, einen TV als Monitor zu benutzen.

Dazu muss im Linux Sourcetree-Root der Kernel gepatch werden:

patch -p0 < vga-sync-fields/patches/radeonfb.patch

Tools übersetzen

drift_control

cd vga-sync-fields-X.X.X/tools
cc -I/usr/include/drm -lpciaccess -ldrm drift_control.c -o drift_control

drift_control810

cd vga-sync-fields-X.X.X/tools
cc -I/usr/include/drm -lpciaccess -ldrm drift_control810.c -o drift_control810

dumpio

cd vga-sync-fields-X.X.X/tools
cc -lpciaccess dumpio.c -o dumpio

dumpio810

cd vga-sync-fields-X.X.X/tools
cc -lpciaccess dumpio810.c -o dumpio810

trim

cd vga-sync-fields-X.X.X/tools
cc -I/usr/include/drm -ldrm trim.c -o trim

trim810

cd vga-sync-fields-X.X.X/tools
cc -I/usr/include/drm -ldrm trim810.c -o trim810

Credits

Sparkie hat das ganze Thema losgetreten und wichtige Grundlagenforschung betrieben. Ein spezieller Dank geht auch an durchflieger für seine Weiterentwicklung für neuere Radeon Modelle.

Links

  1. Downloadseite für die Patche
  2. xine-lib HG Repository
  3. RGB/PAL ueber VGA mit variabler Framerate
  4. Korrekte interlaced und framesynchrone Ausgabe für SDTV/HDTV auf VGA/DVI/HDMI/RGB/SCART