Softdevice-plugin
Inhaltsverzeichnis |
Beschreibung
Autor: Torgeir Veimo, Martin Wache, Stefan Lucke, Harald Milz
Das Plugin dient der MPEG-2-Decodierung in Software, wie auch das xine-plugin. Es wird vom VDR als Ausgabegerät erkannt und ersetzt den Hardwaredecoder der DVB-Karte. Die Ausgabe erfolgt dann auf dem Monitor bzw. über den TV-Out-Anschluss der Grafikkarte. Dabei wird der VDR direkt auf der Textkonsole (Framebuffer) dargestellt. In Verbindung mit dem streamdev-plugin lässt sich damit ein Client ohne Fullfeatured DVB-Karte aufbauen. Außerdem dürfte es bis auf weiteres neben ähnlichen Projekten die einzige Chance auf HDTV sein.
Das Grundprinzip des Plugins besteht darin, den MPEG-2 codierten Videostrom von VDR zu übernehmen, zu dekodieren, zu skalieren, in das RGB-Format zu bringen und auf dem Framebuffer-Device (spezielle Art, die Graka anzusprechen) auszugeben. Dafür gibt es verschiedene Verfahrensweisen:
- Quasi-Hardwaredekodierung über XvMC ("XVideo Motion Compensation"), recht geringe CPU-Last (~30%, prozessorunabhängig), bisher leider nur in Planung.
Unter anderem unterstützt von NVidia Grafikkarten (GF4MX400 sowie >= GF5), S3 Unichrome (u.a. auf VIA Epia Boards) und vielleicht anderen, laden über option "XvMC" in XF86config, falls installiert (Distribution checken!)
- Dekodierung in Software, Ausgabe auf Overlay via Xv ("XVideo"), unterstützt von wohl allen AGP-Karten, laden über option "v4l" in XF86config.
- Dekodierung, Skalierung, YUV2RGB in Software, Ausgabe auf (VESA)-Framebuffer (sehr CPU-lastig)
- Dekodierung in Software, Skalierung und YUV2RGB über Vidix-Treiber oder DirectFB mit kartenabhängiger Hardwarebeschleunigung
- Alles komplett über Treiber mit Hardwarebeschleunigung über DirectFB und Libsoftmpeg leider noch nicht unterstützt, da die libsoftmpeg noch entwickelt wird)
Ausblick
So wie die meisten Plugins ist auch dieses noch in Entwicklung, wengleich der XV-Modus (im Gegensatz zum FB-Modus) schon sehr gut funktioniert. Am meisten erhoffe ich mir von der Einbindung der libsoftmpeg, da die Entwickler die maximal verfügbare Hardwareunterstützung einbauen wollen.
Bilder
Hardwareanforderungen
Hier sind einige Beispielkonfigurationen (bitte ergänzen):
CPU@MHz / RAM | Grafikkarte | CPU-Last | Ausgabe | Sonstiges |
---|---|---|---|---|
K6/2@450 / 128 | Matrox G200 | ~100% | ruckelt mächtig | |
Athlon@500 / 640 | Nvidia GF2MX400 | ~50-70% | Xv | flüssige Darstellung |
G4@1000 / 512 | ATI Radeon 9200 | ~50-70% | Xv | flüssige Darstellung, Ton gestört |
P3@600 / 128 | Matrox G450 | ~50% | flüssige Darstellung | |
Athlon@800 / 512 | ATI Radeon VE | Xv | ruckelt | |
AthlonXP@1533 / 512 | ATI Radeon VE | ~35 % | Xv | flüssige Darstellung |
Athlon@1100 / 512 | Nvidia GF2MX200 | ~ 50% | flüssige Darstellung | |
Athlon@1333 / 512 | Nvidia GF FX5900 | ~30-40% | Xv | flüssige Darstellung |
AthlonXP@1900 / 512 | Nvidia FX5200 | ~23 % | flüssige Darstellung | |
AthlonXP@2000 / 512 | Nvidia FX5900XT | ~14-18% | Xv | flüssige Darstellung |
AthlonXP@2200 / 512 | ATI Radeon 9500 | ~8% | Vidix | flüssige Darstellung |
Athlon64@3800 / 1024 | Nvidia GF FX5600 | ~11-16% | Xv | flüssige Darstellung |
PentiumM770@800 / 2048 | ATI FireGL V5000 | ~30% | Xv | flüssige Darstellung, leider absturz bei Fullscreen (1920x1200) |
Optimal wären natürlich Grafikkarten, welche einen Teil der Videoverarbeitung übernehmen können. So gibt es Karten, welche IDCT, MC sowie BES in Hardware beherrschen. Leider rücken die Hersteller nur spärliche Informationen zur Open Source Treiberentwicklung heraus.
Für das Plugin sind Matrox-Karten sehr gut geeignet, speziell G200, G400 und G450, da hier der Hersteller unter anderem die Informationen zur Programmierung des BES zur Verfügung gestellt hat. Bei der G450 ist jedoch die hardwarebeschleunigte Ausgabe nicht über den TV-Out, sondern nur über den ersten Monitoranschluss möglich.
Desweiteren sind nvidia-Karten ab GF4 aufgrund von XvMC, das ein Teil der Videoverarbeitung übernimmt gut geeignet.
Eine Übersicht zu den Grafikkarten findet sich hier: Grafikkarte
Softwareanforderungen
Installation
Optionen
XV_SUPPORT=1 | XV support von Stefan Lucke |
DFB_SUPPORT=1 | DFB ist sehr experimentel (funktioniert nur mit meiner matrox G200, kommentare erwünscht) |
FB_SUPPORT=1 | FB ist nicht beschleunigt und sollte mit jedem FB mit 16bit Farbtiefe funtionieren |
VIDIX_SUPPORT=1 | Vidix support von Vadim Catana |
LIBXDPMS_SUPPORT=1 | Set this if you want to use DPMS |
PP_LIBAVCODEC=1 | Enable the usage from some deinterlacing pp-filters of libavcodec |
SUSPEND_BY_KEY=1 | Set this if you want to be able to toggle suspend mode by keyboard XV only |
USE_SUBPLUGINS=1 | if you want output methods build as a single lib |
Source
Ist ein wenig unterteilt, je nach dem was man möchte. Die ALSA Installation ist bereits hier beschrieben: LFS ALSA.
Basis (beinhaltet FB/XV Support)
- FFMPEG
cd $SOURCEDIR tar xvzf ffmpeg-<VERSION>.tar.gz ln -s ffmpeg-<VERSION> ffmpeg cd ffmpeg ./configure --prefix=/usr/local \ --enable-shared make make install ldconfig
Falls Plugin softdevice-0.0.7pre2 oder höher zum Einsatz kommt. Siehe Makefile für die "deinterlacing pp-filters", ist ffmpeg mit zusätzlichen Optionen zu übersetzen:
- FFMPEG
ln -s ffmpeg-<VERSION> ffmpeg cd ffmpeg ./configure --prefix=/usr/local \ --enable-shared \ --enable-pp \ --enable-gpl cd libavcodec/libpostproc make mkdir -p /usr/local/include/postproc install -m 644 postprocess.h /usr/local/include/postproc/postprocess.h cp libpostproc.a /usr/local/lib cd - make make install make installlib ldconfig
Bei neueren cvs-Versionen von ffmpeg muss anstelle von
make installlib
folgendes eingegeben werden:
make install-libs
AC3 Dekodierungs Support
Ab softdevice-0.1.1 kann das Softdevice auch mit Hilfe von libavcodec ac3 dekodieren. Dazu muss ffmpeg mit AC3 Unterstützung kompiliert werden, also anstatt der entsprechenden Zeile oben configure mit den folgenden Optionen aufrufen:
./configure --prefix=/usr/local \ --enable-shared \ --enable-pp \ --enable-gpl \ --enable-a52
DirectFB Support
cd $SOURCEDIR tar xvzf DirectFB-<VERSION>.tar.gz cd DirectFB-<VERSION> ./configure --help (für den passenden driver ???) ./configure --prefix=/usr/local \ --with-gfxdrivers=??? make make install cd - tar xvzf DFB++-<VERSION>.tar.gz cd DFB++-<VERSION> ./configure --prefix=/usr/local make make install
Vidix Support
cd $SOURCEDIR tar xvzf vidix-cvs.tar.gz cd vidix ./configure --prefix=/usr/local make make install ldconfig
Arch-Linux
pacman -S ffmpeg alsa-lib <BITTE ERGÄNZEN>
Crux
prt-get depinst alsa-lib ffmpeg directfb <BITTE ERGÄNZEN>
Debian
Quelle: http://www.vdrwiki.com/index.php/M%C3%B3dulo_osdpip
apt-get install ffmpeg libavcodeccvs libavcodeccvs-dev liblame-dev libfaad2-dev libxv-dev alsa-base libasound2-dev libdirectfb-dev libdfb++-dev
Gentoo
emerge alsa-lib DirectFB DFB++ ffmpeg faad2 faac <BITTE ERGÄNZEN>
SuSE
yast -i alsa-devel DirectFB <BITTE ERGÄNZEN>
Für XV_SUPPORT: XFree86-devel oder xorg-x11-devel
Konfiguration
Im Makefile muss eingestellt werden, welche Treiber-Variante man benutzen will und wo sich die benötigten Bibliotheken / Headerfiles befinden.
Dieses hat über das configure Skript des Plugins zu erfolgen.
shell> cd $SOURCEDIR/VDR/PLUGINS/src/softdevice shell> sh configure (--help)
Das Framebufferdevice muss existieren und ansprechbar sein. Dazu muss entweder beim Systemstart der VESA-Framebuffer aktiviert werden oder bei unterstützten Grafikkarten das entsprechende Framebuffer Modul geladen sein. Beim Kernel 2.4 und einer Matrox-Karte ist das z.B. das Modul matroxfb-base (modprobe matroxfb-base) Mit fbset wird dann eine passende Auflösung eingestellt, z.B. 768x576 bei 100Hz und 32bit Farbtiefe. Ein entsprechender Eintrag muss in der Datei /etc/fb.modes existieren.
Matrox G550 mit DVI-Ausgang und DirectFB
Folgende Konfiguration funktioniert bei mir sehr schön mit einer Matrox G550 Dual Head (DVI = Head1, VGA = Head2), derzeit nur einer Budget-Karte vom Typ Fujitsu Activy DVB-s, softdevice-0.2.0-CVS von letzter Woche mit dem Timing-Patch (softdevice.syncTimerMode = 2), directfb-0.9.22, ffmpeg-0.4.9, einem normalen DVI-D-Kabel und einem TV-Gerät BenQ DV3250 mit DVI/HDCP-Eingang:
mode "1280x720-60" # D: 74.25 MHz, H: 45.00 kHz, V: 60.00 Hz geometry 1280 720 1280 720 32 timings 13468 220 110 20 5 40 5 endmode
mode=1280x720 depth=32 pixelformat=ARGB disable-module=keyboard disable-module=joystick disable-module=keyboard disable-module=mutouch disable-module=ps2mouse disable-module=sdlinput disable-module=serialmouse disable-module=sonypi
Man beachte: es ist alles deselektiert außer LIRC (siehe Abschnitt zu LIRC weiter unten).
AC3 über ALSA geht mit meinem Board (Asus A7V8X mit VT8235 und dem Asus-SPDIF-Blech) ganz prima. Dazu der Startaufruf in runvdr:
VDRCMD="$VDRCMD -P 'softdevice -ao alsa:pcm=plug:spdif#ac3=plug:spdif# -vo dfb:'"
Damit schickt das Softdevice-Modul alle Audio-Daten über plug:spdif.
Diese Mimik mit einem Athlon XP-M 2400+ (Barton Core) getaktet auf FSB333 und 2167 MHz (entsprechend einem Athlon XP 3000+) läuft damit auf 50-60% CPU-Last. Das Osdpip-plugin läuft damit nicht mehr flüssig! Bisweilen läuft AV-Sync etwas aus dem Ruder; dann hilft nur ein Neustart des VDR (Menu -> Einstellungen -> Neustart). Die Übertaktung steckt der XP-M locker weg, er läuft im Normalbetrieb mit ca. 47°C Kerntemperatur (Kühler: Arctic Copper Silent 2). Das Board selbst läuft damit innerhalb seiner Spezifikation.
(Anmerkung zu dem syncTimerMode-Patch: Ohne den spielt Softdevice nicht mit NVRAM_WakeUp zusammen, weil beide versuchen, über /dev/rtc an die Echtzeituhr zu kommen...)
Viel Spaß! (hmilz, 13.11.2005)
IR Fernbedienung mit LIRC
Wenn man LIRC nutzen will, um softdevice-dfb zu bedienen, muss man einige Tipps beachten. Zwingend nötig ist diese Vorgehensweise für die Cropping-Funktion mit einer Taste.
Zunächst ist das Remote-plugin im Startskript runvdr zu deaktivieren. Als nächstes erzeugt man sich mit irrecord eine Datei lircd.conf. Entscheidend ist hierbei die richtige Wahl der Tastennamen. Damit Directfb diese richtig an Softdevice weitergeben kann, ist es nötig, die DIKS_-Namen aus include/directfb_keyboard.h zu verwenden und zwar ohne den vorangestellten String DIKS_. Meine lircd.conf sieht beispielsweise so aus
begin codes POWER 0x4190 CHANNEL_UP 0x4350 CHANNEL_DOWN 0x4340 F3 0x3E00 RED 0x3DB0 GREEN 0x40B0 YELLOW 0x41B0 BLUE 0x3DA0 1 0x4140 2 0x4170 3 0x4160 4 0x4110 5 0x4100 6 0x4130 7 0x4120 8 0x41D0 9 0x41C0 0 0x4150 CURSOR_UP 0x3FA0 CURSOR_DOWN 0x3FB0 CURSOR_RIGHT 0x3FC0 OK 0x3FD0 CURSOR_LEFT 0x3FF0 MENU 0x3F80 EXIT 0x4240 REWIND 0x4300 PLAY 0x4200 FASTFORWARD 0x4330 RECORD 0x4220 STOP 0x4230 PAUSE 0x43C0 end codes
"F3" ist hierbei die Taste "User3"; im Softdevice-Menu -> Cropping ist nach dem Lernen der Tasten entsprechend "User3" als Taste für "Bildausschnitt-Taste" zu konfigurieren. Vorsicht: dieses Beispiel könnt Ihr nicht einfach so nehmen, da die Hexcodes je nach Fernbedienung unterschiedlich sind. Das dient nur als Beispiel für die Namen der Einträge.
Um die Tasten zu lernen, alle Einträge mit softdevice-dfb.* aus $VDRCONFIG/remote.conf löschen und VDR starten. Ist alles richtig konfiguriert, kann man mit der als "User3" definierten Taste zyklisch durch die Cropping-Modi wechseln (Aus -> 4:3 -> 16:9 -> 14:9 -> Aus -> ...). Spaß macht das insbesondere, wenn man einen "echten" 16:9-Fernseher benutzt. :-)
Viel Spaß! (hmilz, 13.11.2005)
Parameter
Parameter | Beschreibung |
---|---|
-ao alsa:pcm=dev_name# | Alsa ausgabe Gerät für analog und PCM out |
-ao alsa:ac3=dev_name# | Alsa ausgabe Gerät für AC3 passthrough |
-ao dummy: | Dummy ausgabe Gerät |
-vo xv: | Ausgabe über X11-Xv |
-vo xv:aspect=wide | 16:9 Format (1024x576) |
-vo xv:aspect=normal | 4:3 Format (768x576) |
-vo xv:max-area | Nutze maximal verfügbare Fläche |
-vo xv:full | Start in Vollbild |
-vo fb: | Ausgabe über Framebuffer Gerät |
-vo dfb: | Ausgabe über directFB |
-vo dfb:mgatv | Ausgabe über directFB (Matrox-Karten) |
-vo dfb:viatv | output via Unichrome TV-out |
-vo dfb:triple | enables triple buffering on back end scaler |
-vo vidix: | Ausgabe über Vidix-Treiber |
-vo dummy | Ausgabe über Dummy-Gerät |
-L <plugin_path_name> | Suchpfad für das Laden der Subplugins (siehe Optionen: USE_SUBPLUGINS=1) |
Sonstiges
Probleme
Übersetzung
Übersetzen klappt nicht. Nicht gleich aufgeben, es liegt meistens an den Einstellungen im Makefile. Bei eingeschaltetem VIDIX werden die Dateien vidix.h, vidixlib.h und forcc.h zum übersetzen benötigt. Nach Änderungen am Makefile sollte man make distclean aufrufen (clean lässt das .depfile liegen)
G450 Karte waren die Farben vertauscht
Bei der G450 Karte waren die Farben vertauscht (obwohl z.b. der MPlayer die Farben richtig dargestellt hatte). Das habe ich so gelöst, in der Datei video-vidix.c nach YUV suchen und die Argumente Pu und Pv vertauschen.
2.6er Kernel
Wer einen 2.6er Kernel hat und ihm VDR immer abstürzt, sollte eine Version >= 0.0.8 verwenden. (ob man das nicht löschen kann?)
Distributionsspezifisch Debian
Ich hatte unter Debian das Problem, dass keine /etc/ld.so.conf existierte, da ich weder X11 noch sonstigen Kram installiert hatte (was eigentlich die Datei anlegt). Es äußerte sich in der Fehlermeldung, dass libavcodec.h nicht gefunden wurde. (Nachzulesen unter: http://www.vdr-portal.de/board/thread.php?sid=&postid=189219) Lösung: Einfach die Datei /etc/ld.so.conf anlegen, /usr/local/lib/ reinschreiben, "ldconfig" ausführen => feddich!
bei Debian/Ubuntu kann es zu dem Fehler "libvdr-softdevice.so.1.3.44: undefined symbol: dts_init" beim starten kommen, in diesem Fall einfach bei den FFMPEGLIBS noch -ldts anhängen.
Tipps
Device erzwingen
VDR stellt das OSD auf der ersten Karte mit Decoder dar.
Mit dem Plugin gibt es ein weiteres Device (inc. Decoder), es ist immer das letzte.
Deshalb ist bei dem Betrieb mit einer (oder mehreren) FF Karten, ein höheres Device zu wählen. (das letzte verfügbare im Menü)
Einstellungen / Setup DVB Primäres DVB Interface / Primary DVB interface
Oder via "sed", VDR ist vorher zu beenden, einfach schauen welches wir haben (+1).
#~ grep ^PrimaryDVB $VDRCONFIG/setup.conf PrimaryDVB = 3 #~ sed -i "s/^PrimaryDVB.*/PrimaryDVB = 4/" $VDRCONFIG/setup.conf
LIRC-Lernmodus
So kann man daß remote-plugin sparen und LIRC-Lernmodus und Steuerung direkt im Softdevice-Plugin (hier nur xv) implementieren. (video-xv.c / vdr-1.3.41)
0) #include <vdr/lirc.h> 1) cLircRemote *xvLircRemote =NULL; nach static cXvRemote *xvRemote = NULL; 2) const char *LircDevice = NULL; und LircDevice = "/dev/lircd"; // hier ist es besser wenn man eine Option übergibt nach const char cursor_data[] = { 0x0 }; 3) xvLircRemote = new cLircRemote(LircDevice); nach xvRemote = new cXvRemote ("softdevice-xv", this);
Snapshot
cvs -z3 -d:pserver:anonymous@cvs.softdevice.berlios.de:/cvsroot/softdevice co softdevice