VDPAU
VDPAU (Video Decode and Presentation API for Unix) ist eine von NVIDIA entwickelte API.
Mit Hilfe dieser API kann das Dekodieren, Deinterlacen und Skalieren von HD-Inhalten (bspw. DVB-S2) auf die GPU der Grafikkarte ausgelagert werden, die CPU wird damit entlastet. Damit können auch ältere VDRs durch Nachrüsten einer Grafikarte HD-Inhalte wiedergeben.
Die Ausgabe erfolgt dann über die Grafikkarte mit Hilfe des Xine-Plugins oder des xineliboutput-Plugins.
Inhaltsverzeichnis |
Hardwareanforderungen und Grafikkartenauswahl
Die API wird von GeForce Karten (PCI & PCIe, kein AGP) ab der 8er Serie unterstützt. NVIDIA kennzeichnet Karten die VDPAU fähig sind mit NVIDIA PureVideo HD aus.
Mainboardchipsätze mit PureVideoHD-Grafik onboard, z.b 8200, 8300, 9300
Kompatible Grafikkarten der 8er Serie ab G86-Chipsatz
Kompatible Grafikkarten der 9er Serie
Links zu technischen Dokumentationen:
PDF-Liste der NVIDIA Chipsätze für VDPAU
Liste der kompatiblen GPUs und Version des VP: [1]
Empfohlen wird u.a. die G98 GPU mit 512 MB Grafikspeicher. Die Leistung von Geforce 6 und 7 sowie G80 GPUs ist wohl zur Dekodierung von h.264 nicht ausreichend. Nicht unterstützt sind die Ausführungen 8800GTS 320/640MB und die 8800GTX.
Beispielhafte Systeme
Karte | CPU | CPU-Takt | Last-SD (%) | Last-HD (%) | Verbrauch (idle/SD/HD) | Link (Thread) |
---|---|---|---|---|---|---|
Albatron GF8600GT PCI | S370 Celeron | 1100 Mhz | 3-6 | 5-45 | tbd. | htpc-forum.de |
Asus Pundit-AB + PNY 8400GS PCI | Celeron | 2400 Mhz | 5-12 | 7-20 | n/a | n/a |
Fujitsu-Siemens 9300GE | AMD X2 5600+ | 2900 Mhz | 3-11 | 7-11 | n/a | n/a |
Asus M3N78-EM (onboard GF8300) | AMD LE-1620 | 1 x 2400 MHz | 5-15 | 8-20 | 34 / 44 / 54 | VDR-Portal |
Asus P5N7A-VM (onboard 9300GE) | Core2Duo 6750 | 2 x 2666 MHz | 3-14 | 8-18 | 32 / 48 / 58 | VDR-Portal |
Acer-OEM 9300GE | Intel Celeron 440 | 1 x 2000 Mhz | 5 -15 | 9-19 | 30 / 42 / 50 | n/a |
Sparkle PCI (SF-PC84GS512U2LP) | Via C3 | 1GHz | 30% | n/a | VDR-Portal |
Liste der kompatiblen Grafikkarten (Bitte genaue Herstellerbezeichung, bzw. Produktbeschreibung)
ACHTUNG definitv nicht läuft die Gainward 9500GT 512MB DDR-2 Produktlik
Name | Hersteller | Bestellbezeichnung | Chipsatz | Memory(MB) | Interface | Wo gekauft | Anmerkung | ~ Preis |
---|---|---|---|---|---|---|---|---|
8400GS | Sparkle | SF-PC84GS512U2LP | G98 A2 | 512 | PCI | Alternate | PCI nicht PCIe! => somit für ältere Rechner geeignet. Achtung: Verbraucht mehr als die PCI-Spec (max. 25W) per PCI-Slot vorsieht | 59,- |
9300GE | OEM-Acer | G98 A2 | 256 | PCIe | ebay | Passive Karte, sollte aktiv gekühlt werden | ca. 30 Euro | |
8400GS | EVGA | 256-P2-N729-LR | G86 | PCIe | ebay | Passive Variante, H264-1080i getestet mit 185er NVidia Treiber OK | ||
8500GT | MSI | NX8500GT-TD512 EH | G86 A2 | 512 | PCIe | Passive Karte, sollte aktiv gekühlt werden | ||
8400GS | Gainward | 8400GS 256MB / Barcode: 471846200-9733 | G98 A2 | 256 | PCIe | Conrad Xtreme | Low Profile, Passive Karte (sollte aktiv gekühlt werden), 567 MHz, hat HDMI | ca. 35 Euro |
8400GS | Gainward | (0094) | G86 | 512 | PCIe | Kosatec | Passiv, (459 MHz), hat HDMI | |
9500GT | Gainward | G96b | 512 | PCIe | ARLT | Passiv,hat HDMI | ||
8400GS | Gainward | (9726) | G98 A2 | 512 | PCIe | Passiv, auf 567 MHz achten, hat HDMI (alle Angaben lt. Gainward Support, hab G86 erwischt) | ||
9300GE | Fujitsu-Siemens | G98 A2 | PCIe | ebay | Passive Karte, wird im offenen Gehäuse mehr als hand warm, eventuell aktiv kühlen. | |||
EN8400GS Silent HTP/512M | ASUS | 90-C1CKD0-J0UAY00Z | G98 A2 | 512 | PCIe | www.bauers.com | Karte momentan nicht mehr vorrätig; Passivkühlung;Temperatur max 58 °C | |
NVIDIA Geforce 8400GS 512MB | Palit Passiv | G98 A2 | 512 | PCIe | Low Profile | |||
NVIDA Geforce G100 | Acer | G98 A2 | 512 | PCIe | Low Profile | |||
8600GT | MSI | G84 A2 | 512 | PCIe | Low Profile, Aktive Karte , 540 MHz, hat HDMI/dvi | |||
Hier gibt es noch eine Liste für MythTV, die sollte auch funktionieren: http://www.mythtv.org/wiki/VDPAU
VDR Installation / Konfiguration
Software-SVN mit changelog
SVN-Download:
svn co svn://jusst.de/xine-vdpau
Beispiel einer Installation auf einem Debian-system von xine-vdpau :
1: VDPAU
- NVIDIA Treiber 180.16 installieren (oder neuer) Nvidia-FTP-Server zum Download der aktuellen Treiber
- xine-lib mit VDPAU-Unterstützung auschecken (vom 21.12.2008):
svn co svn://jusst.de/xine-vdpau
- xine-vdpau übersetzen:
./autogen.sh && ./configure --prefix=/usr/local && make && make install
- offizielles xineliboutput-Plugin V1.0.4 (keine CVS-Version) für VDR übersetzen und installieren
- vdr mit vdr-sxfe starten, so dass bei korrekten HDTV-Einträgen in der channels.conf auch etwas zu sehen ist :-)
Links
Tipps und Tricks, wenn es mal nicht so läuft:
1. Tuningtips:
- Bei Klötzchenbildung mit HD-Sendern auf AMD-Systemen (z.B AMD X2-Dualcore und Geforce8200/8300): Cpu-Takt fest auf 2000MHz einstellen, (Befehl: cpufreq-set -f 2000Mhz) und in der config_xineliboutput den Wert für: # vdpau: HD deinterlace method # { bob temporal temporal_spatial }, default: 1 video.output.vdpau_deinterlace_method:bob setzen
- Bei Blockartefakten mit xine: Anzahl der Videopuffer höher setzen: "buffer.video_num_buffers" steht bei mir auf 5000.
- Nur einen ganz schmalen Streifen (ca. 4mm) in der Mitte des Bildschirms (nach Neuinstallation xineliboutput): Im OSD unter den Plugin-Einstellungen für xineliboutput einstellen: Lokale Einstellungen -> Fenster-Seitenverhältnis auf CenterCutOut stellen. Im OSD speichern und VDR neustarten.
- Mit diesen Eisntellungen ist der Ton Synchron auch auf Dolby Sendern: # Wenn !=0, immer auf diese Rate anpassen # numeric, default: 0 audio.synchronization.force_rate:48000 # Resampling benutzen # { auto off on }, default: 0 audio.synchronization.resample_mode:on
2. Dokumentation der Einstellungen mit Ausgabe über xineliboutput-1.0.4:
Vorwort:
Der VDR wird komplett über die Runvdr gestartet, in der Runvdr wird die Pluginlist generiert, aus den Parametern der /etc/vdr/sysconfig. Der X-Server wird ebenfalls über die Runvdr gestartet, dazu wird ein separates Skript aufgerufen.
2.1 Startaufruf des VDR, hier mit Ausgabe über xineliboutput:
PLUGINLIST=" \"-Pxineliboutput -l sxfe --video=vdpau --display=:0.1 -p --post tvtime:method=use_vo_driver --audio=alsa:default -f \" ...."
Kurze Erläuterung zu den wichtigen Parametern:
--video=vdpau => bestimmt den Videoausgabetreiber von xineliboutput --display=0.1 => Ausgabe auf Display 1, bei einer Dualscreenkonfiguration (für z.B. GraphTFT) --post tvtime:method=use_vo_driver => Ausgabeart für Deinterlacing in Verbindung mit vdpau
2.2 Parameter in der setup.conf für xinelibouput, hier bei Videoausgabemode 1920x1080i = interlaced:
xineliboutput.Audio.Compression = 500 xineliboutput.Audio.Delay = 0 xineliboutput.Audio.Driver = alsa xineliboutput.Audio.Equalizer = 0 0 0 0 0 0 0 0 0 0 xineliboutput.Audio.Headphone = 0 xineliboutput.Audio.Port = default xineliboutput.Audio.SoftwareVolumeControl = 0 xineliboutput.Audio.Speakers = Surround 5.1 xineliboutput.Audio.Surround = 0 xineliboutput.Audio.Upmix = 0 xineliboutput.Audio.Visualization = none xineliboutput.Audio.Visualization.GoomOpts = width=1440,height=768,fps=25 xineliboutput.Decoder.PesBuffers = 900 xineliboutput.DisplayAspect = Pan&Scan xineliboutput.Frontend = sxfe xineliboutput.Fullscreen = 1 xineliboutput.Media.BrowseFilesDir = /media xineliboutput.Media.BrowseImagesDir = /media/filme/21 xineliboutput.Media.BrowseMusicDir = /media/filme1 xineliboutput.Media.CacheImplicitPlaylists = 1 xineliboutput.Media.EnableID3Scanner = 1 xineliboutput.Modeline = xineliboutput.OSD.AlphaCorrection = 0 xineliboutput.OSD.AlphaCorrectionAbs = 0 xineliboutput.OSD.Blending = 1 xineliboutput.OSD.BlendingLowRes = 1 xineliboutput.OSD.ExtSubSize = -1 xineliboutput.OSD.HideMainMenu = 0 xineliboutput.OSD.LayersVisible = 4 xineliboutput.OSD.Scaling = 2 xineliboutput.Playlist.Album = 1 xineliboutput.Playlist.Artist = 1 xineliboutput.Playlist.Tracknumber = 1 xineliboutput.Post.denoise3d.chroma = 30 xineliboutput.Post.denoise3d.Enable = 0 xineliboutput.Post.denoise3d.luma = 40 xineliboutput.Post.denoise3d.time = 60 xineliboutput.Post.pp.Enable = 0 xineliboutput.Post.pp.Mode = de xineliboutput.Post.pp.Quality = 3 xineliboutput.Post.unsharp.chroma_amount = 0 xineliboutput.Post.unsharp.chroma_matrix_height = 3 xineliboutput.Post.unsharp.chroma_matrix_width = 3 xineliboutput.Post.unsharp.Enable = 0 xineliboutput.Post.unsharp.luma_amount = 0 xineliboutput.Post.unsharp.luma_matrix_height = 5 xineliboutput.Post.unsharp.luma_matrix_width = 5 xineliboutput.Remote.AllowHttp = 1 xineliboutput.Remote.AllowHttpCtrl = 0 xineliboutput.Remote.AllowRtsp = 1 xineliboutput.Remote.AllowRtspCtrl = 0 xineliboutput.Remote.Iface = xineliboutput.Remote.Keyboard = 1 xineliboutput.Remote.ListenPort = 37890 xineliboutput.Remote.LocalIP = xineliboutput.Remote.Rtp.Address = 224.0.1.9 xineliboutput.Remote.Rtp.AlwaysOn = 0 xineliboutput.Remote.Rtp.Port = 37890 xineliboutput.Remote.Rtp.SapAnnouncements = 1 xineliboutput.Remote.Rtp.TTL = 1 xineliboutput.Remote.UseBroadcast = 1 xineliboutput.Remote.UseHttp = 1 xineliboutput.Remote.UsePipe = 1 xineliboutput.Remote.UseRtp = 1 xineliboutput.Remote.UseTcp = 1 xineliboutput.Remote.UseUdp = 1 xineliboutput.RemoteMode = 0 xineliboutput.Video.AspectRatio = 0 xineliboutput.Video.AutoCrop = 1 xineliboutput.Video.AutoCrop.AutoDetect = 1 xineliboutput.Video.AutoCrop.DetectSubs = 0 xineliboutput.Video.AutoCrop.FixedSize = 0 xineliboutput.Video.AutoCrop.SoftStart = 1 xineliboutput.Video.Brightness = -1 xineliboutput.Video.Contrast = -1 xineliboutput.Video.Deinterlace = none xineliboutput.Video.DeinterlaceOptions = method=use_vo_driver,cheap_mode=1,pulldown=none,framerate_mode=full,judder_correction=1,use_progressive_frame_flag=1,chroma_filter=0,enabled=1 xineliboutput.Video.Driver = auto xineliboutput.Video.FieldOrder = 0 xineliboutput.Video.HUE = -1 xineliboutput.Video.IBPTrickSpeed = 1 xineliboutput.Video.MaxTrickSpeed = 12 xineliboutput.Video.Overscan = 0 xineliboutput.Video.Port = :0.1 xineliboutput.Video.Saturation = -1 xineliboutput.Video.Scale = 1 xineliboutput.Video.SwScale = 0 xineliboutput.Video.SwScale.Aspect = 1 xineliboutput.Video.SwScale.Downscale = 1 xineliboutput.Video.SwScale.Height = 1080 xineliboutput.Video.SwScale.Resize = 1 xineliboutput.Video.SwScale.Width = 1920 xineliboutput.VideoModeSwitching = 1 xineliboutput.X11.UseKeyboard = 1 xineliboutput.X11.WindowHeight = 1080 xineliboutput.X11.WindowWidth = 1920
2.3 wichtige Parameter der config_xineliboutput (Deinterlace-Mode => temporal):
Wie man sieht muss man nicht sehr viel bei gestopptem VDR in der Datei anpassen.
..... # vdpau: HD deinterlace method # { bob temporal temporal_spatial }, default: 1 #video.output.vdpau_deinterlace_method:temporal # vdpau: Try to recreate progressive frames from pulldown material # bool, default: 1 #video.output.vdpau_enable_inverse_telecine:1
# vdpau: disable deinterlacing when progressive_frame flag is set # bool, default: 0 #video.output.vdpau_honor_progressive:0 # vdpau: disable advanced deinterlacers chroma filter # bool, default: 0 #video.output.vdpau_skip_chroma_deinterlace:0 # Vertikale Bildposition im Ausgabefenster # [0..100], default: 50 #video.output.vertical_position:50
video.output.xv_deinterlace_method:bob # Choose speed over specification compliance # bool, default: 0 #video.processing.ffmpeg_choose_speed_over_accuracy:0
# Qualität der MPEG-4 Nachbearbeitungsstufe # [0..6], default: 3 video.processing.ffmpeg_pp_quality:0
# Skip loop filter # { default none nonref bidir nonkey all }, default: 0 video.processing.ffmpeg_skip_loop_filter:all
# FFmpeg video decoding thread count # numeric, default: 1 video.processing.ffmpeg_thread_count:2