Christoph's - MythTV

Mein MythTV-basierter PVR

Ziel des Projektes war eine Linux-basierte PVR/Timeshifting box mit EPG, die aber nicht schon am Rand der Belastbarkeit läuft, also auch noch Hintergrundtätigkeiten übernehmen kann. Die Ausgabe sollte wahlfrei auf TV, CRT oder beidem möglich sein.

morex 2699 with epia M-series motherboard

Ich habe mich für folgende Hardwareausstattung entschieden:

Auf der Softwareseite fällt die Wahl schon schwerer: Während ich das schreibe (2004-04-09) steckt die Linux-Treiberentwicklung für den verbauten VIA Chipsatz nämlich noch ein wenig in den Kinderschuhen. Nach einigem Suchen habe ich mich dann aber doch für folgende Software entschieden:

Das Ergebnis:

Hardware

Das Morex kommt solide verbaut daher, ich habe mich (Premiere) beim Einbau der Komponenten nirgendwo schneiden können; der Platz im Innenraum ist recht knapp bemessen, aber ausreichend. Man muss sich halt überlegen, in welcher Reihenfolge man das Gehäuse bestückt. Auch das Mainboard war recht schnell angeschraubt: Das Gehäuse ist ja genau für Mini-ITX Mainboards designed. In Rekordzeit war auch die Festplatte im Festplattenkäfig und der Speicher auf dem Mainboard fixiert, aber dann ging das Gefrickel los: Es galt, PCI-Karte, PCI-Riser und die Fixierklammer für PCI-Karten gleichzeitig einzubauen, wobei sich immer jeweils 2 der 3 Komponenten gegenseitig im Weg waren. Schlussendlich habe ich einfach die Slotblende von der PCI-Karte geschraubt und nach dem Einbau wieder angebaut. Das war's dann aber auch schon zum Thema Hardware gewesen. Deckel draufschieben und mit 3 Schrauben fixieren - fertig.

Der CPU Lüfter summt jetzt allerdings trotz 7V Lüfter deutlich hörbar - an der Stelle besteht also noch dringender Verbesserungsbedarf.

Software

...der schwierigere Part. Zumindest, wenn man nicht weiss, welche der unzähligen Kernelpatches sich denn vertragen und woran's hängt, wenn die Performance nicht stimmt. Nachdem zum Zeitpunkt, zu dem ich das hier schreibe, noch kein HOWTO für 2.6er Kernels aufzutreiben war, musste ich eben nach "try and error" vorgehen.

:: Hinweise ::

Los geht's also: Die Basis bildet - wie schon gesagt - Debian unstable. Meine sources.list hat deshalb zwei Einträge: Für Debian "sid" und für Codecs. Will man auf Hardware-MPEG-Decoding verzichten funktionierten die Pakete der auskommentierten Source hervorragend. Man spart sich dann das Kompilieren von MythTV, die EPIA-Patches für den Kernel, die libddmpeg und den gepatchten VIA-Treiber für X. Timeshifting mit MPEG2-Streams von mehr als 480x480 2000kbps zeigte in Tests dann allerdings Aussetzer.

/etc/apt/sources.list
deb http://ftp.de.debian.org/debian unstable main contrib non-free
deb http://marillat.free.fr/ unstable main
#deb http://dijkstra.csh.rit.edu/~mdz/debian unstable mythtv
      

Low-Level-Stuff

Zuallererst gilt es, einen Kernel mit LIRC-Support und (für Hardware-MPEG-Decoding) Video4Linux' CLE266 Unterstützung zu compilieren. Ich habe mir dazu zwei Patches geholt: Einen für LIRC und einen für EPIA+LIRC. Die LIRC-Treiber von zweiterem lassen sich nämlich nicht einpatchen, deshalb noch ein extra Patch dafür. Beim zweiten Patch sollte man also alle LIRC-spezifischen Teile nicht mit einpatchen.

cd /usr/src
wget "http://www.de.kernel.org/pub/linux/kernel/v2.6/linux-2.6.5.tar.bz2"
wget "http://www.clarkmania.com/~jclark/lirc-26.patch"
wget "http://epia.kalf.org/epia_kernel/testing/patch-2.6.4-epia1.bz2"
tar -xjf linux-2.6.5.tar.bz2
cd linux-2.6.5
patch -p1 -i ../lirc-26.patch
bzcat ../patch-2.6.4-epia1.bz2 | patch -p1
make menuconfig && make && make install_modules

Die LIRC-Module brauchen natürlich geladene IVTV-Module, also bekommt modprobe (apt-get install module-init-tools) einen neuen Eintrag (danach ein "update-modules" nicht vergessen):

/etc/modprobe.d/lirc
install lirc_i2c /sbin/modprobe ivtv; /sbin/modprobe --ignore-install lirc_i2c
      

Als Bindeglied zwischen X' Anwendungen und Hardware-MPEG-Decoder läuft die libddmpeg.so von Ivor Hewitt:

cd /usr/src
wget "http://www.ivor.it/cle266/libddmpeg-1.6.tar.gz"
tar -xzf libddmpeg-1.6.tar.gz
cd libddmpeg-1.6
make && make install

Schliesslich habe ich mir noch das brandneue XFree86-4.4.0, das mit VIA-Unterstützung kommt, geholt. Der VESA-Treiber aus Debian "sid" lässt nämlich kein schnelles Schreiben zu, was zu Frameraten um die 2fps führen würde. Mein Vorgehen war dabei, zuerst ein laufendes X-System per apt-get aufzusetzen und das dann mit den neuesten Binaries zu überschreiben - danger ahead :-). Es sollte aber auch irgendwie mit einer frischen Installation der Binaries klappen.

cd /usr/src
mkdir xfree86-4.4.0-binaries
cd xfree86-4.4.0-binaries
wget -rL "http://ftp.xfree86.org/pub/XFree86/4.4.0/binaries/Linux-ix86-glibc23/"
cd...
chmod a+x extract
./Xinstall.sh

Dazu eine funktionierende XF86Config-4:

/etc/X11/XF86Config-4
Section "ServerLayout"
        Identifier     "XFree86 Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
        RgbPath      "/usr/X11R6/lib/X11/rgb"
        ModulePath   "/usr/X11R6/lib/modules"
        FontPath     "/usr/X11R6/lib/X11/fonts/misc/"
        FontPath     "/usr/X11R6/lib/X11/fonts/TTF/"
        FontPath     "/usr/X11R6/lib/X11/fonts/Speedo/"
        FontPath     "/usr/X11R6/lib/X11/fonts/Type1/"
        FontPath     "/usr/X11R6/lib/X11/fonts/CID/"
        FontPath     "/usr/X11R6/lib/X11/fonts/75dpi/"
        FontPath     "/usr/X11R6/lib/X11/fonts/100dpi/"
EndSection

Section "Module"
        Load  "extmod"
        Load  "dbe"
        Load  "dri"
        Load  "glx"
        Load  "record"
        Load  "xtrap"
        Load  "speedo"
        Load  "type1"
EndSection

Section "InputDevice"
        Identifier              "Keyboard0"
        Driver                  "keyboard"
        Option "XkbLayout"      "de"
        Option "XkbVariant"     "nodeadkeys"
        Option "XkbRules"       "xfree86"
        Option "XkbModel"       "pc106"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/mouse"
EndSection

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"

        HorizSync   31.5 - 57.0
        VertRefresh 40-150

        Option          "DPMS"
EndSection

Section "Device"
        Option      "ActiveDevice" "CRT"        # or "CRT,TV"
        Option     "PanelSize" "800x600"      
        Option      "TVType" "PAL"
        Option      "TVOutput" "S-Video"
        Identifier  "Card0"
        Driver      "via"
        VendorName  "Unknown Vendor"
        BoardName   "Unknown Board"
        BusID       "PCI:1:0:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultDepth 24
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes   "800x600"
        EndSubSection
EndSection

Damit die libddmpeg läuft, braucht's jetzt aber noch einen gepatchten VIA-Treiber für X, der irgendeine undurchsichtige Initialisierung vornimmt:

cd /usr/X11R6/lib/modules/drivers
mv via_drv.o via_drv.o-original
wget "http://www.courville.org/debian/xfree/nehemiah/via_drv.o"
      

Für die PVR-250 laufen die IvyTV-Treiber erfreulicherweise out-of-the box:

cd /usr/src
wget "http://ivtv.sf.net/CVS-LATEST.tar.gz"
mv CVS-LATEST.tar.gz ivtv-0.1.10pre2.tar.gz
tar -xzf ivtv-0.1.10pre2.tar.gz
mv ivtv ivtv-0.1.10pre2
cd ivtv-0.1.10pre2/driver
make && make install

Der dazu passende Eintrag für modprobe sieht bei mir so aus (danach ein "update-modules" nicht vergessen):

/etc/modprobe.d/ivtv
alias char-major-81 videodev
alias char-major-81-0 ivtv
options ivtv ivtv_debug=1 ivtv_pal=1 tuner=29
options tuner type=29
options msp3400 once=1 simple=1
install ivtv /sbin/modprobe msp3400; /sbin/modprobe saa7115; /sbin/modprobe tuner; /sbin/modprobe --ignore-install ivtv
remove ivtv /sbin/modprobe -r --ignore-remove ivtv; /sbin/modprobe -r msp3400; /sbin/modprobe -r saa7115; /sbin/modprobe -r tuner
install bttv echo disabled

High-Level-Stuff

MythTV will für Unterstützung von Hardware-MPEG-Decoding neu compiliert werden, also passt man die settings.pro an (arch=i586 und Kommentarzeichen vor entsprechenden Teile der Konfiguration für CLE266 entfernen) und compiliert. Die Mitgelieferte HOWTO beschreibt die Einrichtung recht genau, also hier nur die nötigen Schritte zum Compilieren:

apt-get install libqt3-dev libqt3-mt-dev libasound2-dev liblame-dev
joe settings.pro --> arch=586, cle266 enable
qmake mythtv.pro
make && make install

Das automatische Starten von MythTV übernimmt eine modifizierte inittab mit rungetty (apt-get rungetty)

/etc/inittab
...
#6:23:respawn:/sbin/getty 38400 tty6
6:2345:respawn:/sbin/rungetty tty6 -u root -g root /bin/startx-mythtv.sh
...
      

Zusammen mit einem kurzen Startup-Script:

/bin/startx-mythtv.sh
#! /bin/bash

PATH=/bin/bash/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/sbin
HOME=/root
cd

modprobe via
modprobe via_v4l_drv
startx

#/bin/bash

Und einer .xinitrc

/root/.xinitrc
irexec&
xset -dpms
xset s off
/usr/local/mythtv-0.14/bin/mythfrontend -l /var/log/mythtv/frontend.log

Was fehlt an dieser Seite noch? Meines Wissens nach das Aufsetzen von XMLTV (sollte aber einfach sein), und eine lauffähige .config für den Kernel. Auf jeden Fall aber Feedback - also: MUA anfeuern und Kommentar tippen :-)

Edit: Nachdem tvtoday seit kurzem hinter alle Episoden einer Serie "xx. Teil" hängt habe ich tv_grab_de_tvtoday behelfsmäßig gepatcht:

diff von tv_grab_de_tvtoday
***************
*** 494,497 ****
--- 494,501 ----
        if (ref($span) eq "") {
            $span =~ s/\s*\([^\(]+\)\s*$//;
+
+             #Christoph: Remove "xx. Teil"
+             $span =~ s/\s*\d+\.\sTeil//gi;
+
            $show{title} = [[ $span, $lang ]];
        }
***************
*** 504,507 ****
--- 508,515 ----
            my $title = ($tag->content_list())[0];
            $title =~ s/\s*\([^\(]+\)\s*$//;
+
+             #Christoph: Remove "xx. Teil"
+             $title =~ s/\s*\d+\.\sTeil//gi;
+
            $show{title} = [[ $title, $lang ]];
        }

Edit: Stefan Siegl hat den Patch mittlerweile in tv_grab_de_tvtoday übernommen.

Navigation