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. h264) auf die GPU der Grafikkarte ausgelagert werden, die CPU wird damit entlastet. Damit können auch ältere VDRs durch Nachrüsten einer Grafikkarte HD-Inhalte wiedergeben.
Die Ausgabe erfolgt dann über die Grafikkarte mit Hilfe des Xine-Plugins oder des xineliboutput-Plugins.
Inhaltsverzeichnis |
Grundlagen
Für das Thema Grundlagen wurde ein eigener Artikel erstellt um der Übersichtlichkeit zu dienen. Die Grundlagen sind hier zu finden
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 | 1,1 GHz | 3-6 | 5-45 | tbd. | htpc-forum.de |
Asus Pundit-AB + PNY 8400GS PCI |
Celeron | 2,4 GHz | 5-12 | 7-20 | n/a | n/a |
Fujitsu-Siemens 9300GE | AMD X2 5600+ | 2,9 GHz | 3-11 | 7-11 | n/a | n/a |
Asus M3N78-EM (onboard GF8300) |
AMD LE-1620 | 1 x 2,4 GHz | 5-15 | 8-20 | 34 / 44 / 54 | VDR-Portal |
Asus P5N7A-VM (onboard 9300GE) |
Core2Duo 6750 | 2 x 2,6 GHz | 3-14 | 8-18 | 32 / 48 / 58 | VDR-Portal |
Acer-OEM 9300GE | Intel Celeron 440 | 1 x 2 GHz | 5 -15 | 9-19 | 30 / 42 / 50 | n/a |
Sparkle PCI (SF-PC84GS512U2LP) |
Via C3 | 1 GHz | 30 | n/a | VDR-Portal | |
Acer Revo 3600 VDPAU, OpenSuse 11.1, mplayer |
Intel Atom N230 + nVidia ION |
1,6 GHz | 5-20 | n/a | ||
Zotac ION A, Ubuntu 9.04, XBMC |
Intel Atom N330 + nVidia ION |
2 x 1,6 GHz | <10 | <25 | 23W / 26W / 31W | n/a |
Liste der kompatiblen Grafikkarten (Bitte genaue Herstellerbezeichung, bzw. Produktbeschreibung)
ACHTUNG definitv nicht läuft die Gainward 9500GT 512MB DDR-2 Produktlink
Benchmark Einträge basierend auf dem Nvidia Tool qvdpautest-0.3 http://hftom.free.fr/qvdpautest-0.3.tar.gz von http://www.nvnews.net/vbulletin/showthread.php?t=133465
Name | Hersteller | Bestellbezeichnung | Chipsatz | Memory(MB) | Interface | Wo gekauft | Anmerkung | ~ Preis | Benchmark |
---|---|---|---|---|---|---|---|---|---|
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 | ||
9300GS | Point of View | OEM Karte, kommt in Bulk Verpackung ohne nähere Modell-Bezeichnung | G98 A1 | 512 | PCIe | Alternate | Passiv gekühlt, blockiert 1 weiteren Slot, auf Luftströmung achten | € 28,99 |
AMD Sempron(tm) 140 Processor NVIDIA GPU GeForce 9300 GS (G98) at PCI:4:0:0 (GPU-0) VDPAU API version : 0 VDPAU implementation : Unknown SURFACE GET BITS: 1063.76 M/s SURFACE PUT BITS: 536.209 M/s MPEG DECODING (1920x1080): 75 frames/s MPEG DECODING (1280x720): 169 frames/s H264 DECODING (1920x1080): 63 frames/s H264 DECODING (1280x720): 118 frames/s VC1 DECODING (1440x1080): 77 frames/s MIXER WEAVE (1920x1080): 208 frames/s MIXER BOB (1920x1080): 323 fields/s MIXER TEMPORAL (1920x1080): 64 fields/s MIXER TEMPORAL + SKIP_CHROMA (1920x1080): 89 fields/s MIXER TEMPORAL_SPATIAL (1920x1080): 21 fields/s MIXER TEMPORAL_SPATIAL + SKIP_CHROMA (1920x1080): 23 fields/s MIXER TEMPORAL_SPATIAL (720x576 video to 1920x1080 display): 85 fields/s |
9500GT | Gainward | P/N: NE29500THH51-PM8D96 / EAN: 4260183360353 | G96 | 512 | PCIe | Alternate | Passiv gekühlt, blockiert 1 weiteren Slot | € 42,99 |
AMD Sempron(tm) 140 Processor NVIDIA(0): NVIDIA GPU GeForce 9500 GT (G96) at PCI:4:0:0 (GPU-0) VDPAU API version : 0 VDPAU implementation : NVIDIA VDPAU Driver Shared Library 190.18 Wed Jul 22 19 SURFACE GET BITS: 815.648 M/s SURFACE PUT BITS: 532.24 M/s MPEG DECODING (1920x1080): 74 frames/s MPEG DECODING (1280x720): 151 frames/s H264 DECODING (1920x1080): 44 frames/s H264 DECODING (1280x720): 96 frames/s VC1 DECODING (1440x1080): 105 frames/s MIXER WEAVE (1920x1080): 534 frames/s MIXER BOB (1920x1080): 937 fields/s MIXER TEMPORAL (1920x1080): 202 fields/s MIXER TEMPORAL + SKIP_CHROMA (1920x1080): 266 fields/s MIXER TEMPORAL_SPATIAL (1920x1080): 86 fields/s MIXER TEMPORAL_SPATIAL + SKIP_CHROMA (1920x1080): 96 fields/s MIXER TEMPORAL_SPATIAL (720x576 video to 1920x1080 display): 320 fields/s |
8400GS | EVGA | 256-P2-N729-LR | G86 | 256 | PCIe | ebay | Passive Variante, H264-1080i getestet mit 185er NVidia Treiber OK , sehr heiß , mindestens größerer Kühlkörper | ca 30 Euro |
SURFACE GET BITS: 728.912 M/s SURFACE PUT BITS: 805.187 M/s MPEG DECODING (1920x1080): 78 pic/s VC1 DECODING (1440x1080): 122 pic/s MIXER WEAVE (1920x1080): 217 frames/s MIXER BOB (1920x1080): 368 fields/s MIXER TEMPORAL (1920x1080): 76 fields/s MIXER TEMPORAL_SPATIAL (1920x1080): 26 fields/s |
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 | 32.-€ | |
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 | ||||
9600GT | Palit | Palit NE39600TFHD52 | G94-65nm | 512 | PCIe | www.e-tec.at | Läuft zwar in einer Desktopworkstation, XBMC funktioniert aber (leichte Tearing-Effekte manchmal, sollte aber ein Treiberproblem sein...) | ab ~70€ (29.7.09) | |
9500GT | Zotac | Zotac 1024MB 9500GT PCIe | G96-CL1-65nm | 1024 | PCIe | Link zur Karte | Karte macht Problemlos temporal_spatial Deinterlacer bei HDTV-Content | ca. 46 € (30.7.09) |
GeForce 9500 GT (G96) at PCI:1:0:0 (GPU-0) VDPAU API version : 0 VDPAU implementation : Unknown SURFACE GET BITS: 843.3 M/s SURFACE PUT BITS: 566.468 M/s MPEG DECODING (1920x1080): 74 frames/s MPEG DECODING (1280x720): 155 frames/s H264 DECODING (1920x1080): 45 frames/s H264 DECODING (1280x720): 98 frames/s VC1 DECODING (1440x1080): 118 frames/s MIXER WEAVE (1920x1080): 923 frames/s MIXER BOB (1920x1080): 1512 fields/s MIXER TEMPORAL (1920x1080): 292 fields/s MIXER TEMPORAL + SKIP_CHROMA (1920x1080): 398 fields/s MIXER TEMPORAL_SPATIAL (1920x1080): 88 fields/s MIXER TEMPORAL_SPATIAL + SKIP_CHROMA (1920x1080): 95 fields/s MIXER TEMPORAL_SPATIAL (720x576 video to 1920x1080 display): 349 fields/s |
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. Hilft auch bei Meldung (SDTV) "video_out: throwing away image with pts 5988455 because it's too old .." buffer.video_num_buffers:2500
- 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. Oder einfach in setup.conf folgendes einfügen: xineliboutput.DisplayAspect = CenterCutOut
- Mit diesen Einstellungen 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