Video-Transcoding unter der Lupe: APP, CUDA und Quick Sync im Vergleich

Inhaltsverzeichnis

>>

Vor nicht allzu langer Zeit schauten wir uns zwei Mini-ITX-Mainboards auf Brazos-Basis an (Mini-Fusion mit ASRock und MSI: AMDs Brazos ist da). Wer diesen Artikel schon gelesen hat, wird sich erinnern, dass wir bei den Encoding- und Decoding-Fähigkeiten der Plattform zu einigen überraschenden Ergebnissen gelangten. Wenn wir Videos komprimierten, war das Ergebnis was die Bildqualität anbelangte bei AMD und Intel sehr ähnlich. Wurde aber Nvidias CUDA eingesetzt, um das Konvertieren des Videos zu beschleunigen, sah das ganz anders aus – und zwar im wahrsten Sinne. Dann kam es in den Videos bei Szenen mit viel Bewegung zu deutlicher Klötzchenbildung. Darüber hatten wir zwar schon im Vorfeld einiges gehört, doch erst nach einigen Direktvergleichen, in denen wir den gleichen Frame verschiedener Kodierdurchläufe nebeneinander sehen konnte, wurde uns klar, wie gravierend der Unterschied hier tatsächlich war.

Das brachte uns auf die Idee, in einem eigenen Artikel die Bildqualität verschiedener Lösungen zu überprüfen. Immerhin blieben nach dem Brazos-Test genug Fragen offen, die dort nicht unbedingt relevant waren, denen wir aber dennoch auf den Grund gehen wollen.

Die Basics: Codecs und Decoder

Bevor wie aber ins Detail gehen, sollten wir erst einmal mit ein paar Grundlagen beginnen. Zunächst ist es sehr wichtig, zwischen einem Codec und einer Containerdatei zu unterscheiden. Beispielsweise nutzen Blu-ray-Inhalte oft die Dateiendung .m2ts. Das BDAV-Format (Blu-ray Disc Audio/Video) ist aber eigentlich nichts weiter als ein Container. Das enthaltene Video kann aber einen von drei Codecs nutzen, nämlich MPEG-2, H.264 oder VC-1.

Was genau ist nun also der Unterschied zwischen einem Codec und einem Container? Nehmen wir uns mal ein Beispiel, mit dem jeder etwas anfangen kann: Urlaubsgepäck. Der Koffer ist der Container, und die Art von Koffer, die man sich aussucht, gibt auch vor, was (und wie viel) man mitnehmen bzw. hineinstecken kann. Der Codec (zusammengesetzt aus Compression und Decompression) ist die Methode, mit der man seine Siebensachen (bzw. die Daten) in den Koffer packt. Das gilt im Prinzip für jegliche Art von Multimedia-Inhalten. Microsofts AVI-Format (Audio Video Interleave) ist beispielsweise ein Container, der diverse Codecs enthalten kann, von DivX bis MPEG-2.

Wenn man nun eine Datei in einem Video-Wiedergabeprogramm abspielt, durchlaufen die komprimierten Daten einen Decoder und werden als YUV-Daten auf dem Bildschirm ausgegeben. Der Decoder erkennt das Format und entpackt die Daten in nutzbare Informationen, die dann bearbeitet und als Video betrachtet werden können

Es gibt zwei Arten von Decodern: Software und Hardware. Vor UVD, PureVideo und Intels GMA 4500MHD wurde Video grundsätzlich von Software-Decodern dekodiert, die über die CPU liefen und dementsprechend mehr oder weniger Last erzeugten. CyberLink und InterVideo (heute: Corel) waren damals die beiden größten Firmen, die entsprechende Software anboten. Das erklärt auch, warum ATI den PowerDVD-Decoder lizenziert hat, um ihn im eigenen ATI DVD Decoder zu verwenden. Wie gesagt laufen Software-Decoder über die CPU und verursachen je nach Komplexität des Codecs und der Videogröße eine gewisse Last. Bei modernen CPUs fällt das nicht mehr wirklich ins Gewicht, macht sich aber speziell bei Mobilgeräten bei der Akkulaufzeit negativ bemerkbar.

Nach und nach erkannten Grafikchiphersteller diese Problematik und bauten in ihre GPUs dedizierte Decoder-Blöcke ein, die sich nur um Video kümmerten. So entwickelte sich das, was wir heute Hardwarebeschleunigung für Video nennen. Der Vorteil dieses Ansatzes ist, dass die GPU die Arbeit übernahm, wodurch die CPU-Last reduziert wurde und inzwischen praktisch bei 0% liegt.

Das hat aber auch einige andere Auswirkungen. Weil Videodaten immer von einem Decoder verarbeitet werden, ist es schwieriger, einen Referenzpunkt für Qualität und Effizienz festzulegen. Egal ob das Video einen Software- oder Hardware-Decoder durchläuft, der Datenstrom wird in jedem Fall manipuliert, bevor er als Bilderfolge auf dem Bildschirm ankommt. Benutzt man einen Software-Decoder, muss man keinen systemübergreifenden Vergleich durchführen, sofern man auf allen denselben Decoder einsetzt. Umgekehrt können aber verschiedene Decoder auf demselben System leicht abweichende Bilder liefern und so die wahrgenommene Bildqualität beeinflussen. Spielt man auf einem Rechner mit AMD- oder Nvidia-Grafik eine Blu-ray-Disc mit PowerDVD ab, wird das Ergebnis identisch aussehen, solange man die Hardwarebeschleunigung nicht aktiviert. In beiden Fällen wird der Videostrom dann nämlich per Software auf der CPU dekodiert, was das gleiche Ergebnis liefert.

Bringt man einen Hardware-Decoder ins Spiel, kann das Ergebnis wie gesagt ganz anders aussehen? Wie kommt das? Moderne GPUs bringen von Hause aus Funktionseinheiten mit, die sich ausschließlich um das Dekodieren und Bearbeiten von Videoströmen kümmern. Allerdings wird die hardwarebeschleunigte Dekodierung in der GPU eines Sandy-Bridge-Prozessors anders gestaltet und programmiert sein als bei GPUs auf Grafikkarten von AMD oder Nvidia.

Eins möchten wir von vornherein klarstellen: Es gibt keine Decoder, die als reine GPGPU-Lösungen arbeiten. Kein Decoder läuft komplett in DirectCompute, APP oder CUDA. Es ist auch nicht sinnvoll, sich einen solchen Decoder zu wünschen, weil man dadurch nichts gewinnt. GPGPU bringt immer dann Vorteile, wenn stark parallelisierbare Rohdaten bearbeitet werden sollen. Videos bestehen aber nun mal aus mehr als rohen Daten. Es findet auch eine Menge Bildbearbeitung statt, und die muss größtenteils nacheinander geschehen und ist damit seriell, nicht parallel. Die oben beschriebenen dedizierte Funktionseinheiten sind Fachidioten: Sie sind darauf spezialisiert, Video zu dekodieren und zu bearbeiten. Das und genau das können sie hervorragend; zu etwas anderem sind sie aber nicht zu gebrauchen. Die Arbeit auf weniger spezialisierte Hardware wie die Recheneinheiten der GPU zu verlagern ist nicht viel anders, als würde man diese Arbeit gleich wieder der CPU überlassen. In beiden Fällen müsste man einen Software-Decoder einsetzen.

Interessanterweise hat die Firma Elemental Technologies, die vor allem durch ihre Transcoder-Software Badaboom bekannt geworden ist, einen MPEG-2-Decoder auf CUDA-Basis entwickelt. Allerdings handelt es sich auch hier um keinen reinen GPGPU-Decoder. Teile der Video-Pipeline, beispielsweise Entropy Encoding, Syntax Encoding, Syntax Decoding und Entropy Decoding müssen seriell abgearbeitet werden. Andere Teile des Arbeitsablaufes lassen sich hingegen sehr gut parallelisieren. Dazu gehören Motion Estimation, Motion Compensation, Quantisierung, Discrete Cosine Transform, Deblocking Filtering und End Loop Deblocking. Deshalb ist Elementals MPEG-2-Dekoder auch eine Zwitterlösung. Einige Teile laufen auf der CPU, andere auf den CUDA-Cores der GPU.

Seiten:

Tags: , , ,

Schreibe einen Kommentar

Privacy Policy Settings

Google Analytics Wir sammeln anonymisierte Daten darüber, welche Beiträge und News gelesen werden. Wir ermitteln dabei auch die Zeit - ebenfalls anonymisiert - wie lange ein Beitrag gelesen wurde. Dadurch können wir einfacher Themen anbieten, die Sie interessieren.
This website stores some user agent data. These data are used to provide a more personalized experience and to track your whereabouts around our website in compliance with the European General Data Protection Regulation. If you decide to opt-out of any future tracking, a cookie will be set up in your browser to remember this choice for one year. I Agree, Deny
642 Verbiete Google Analytics, mich zu verfolgen