Intraframe-Kompression

Wie der Name schon sagt, beschäftigt sich die Intraframe-Kompression damit, das Schrumpfungspotenzial innerhalb eines einzelnen Bildes auszuschöpfen. Der Codec tut hier das, was JPEG mit einem einzelnen digitalen Foto macht. Und tatsächlich zeigen sich zwischen den Kompressionsverfahren der MPEG-Codecs und der JPEG-Methode deutliche Parallelen. Die verwendeten Verfahren wollen wir uns jetzt näher ansehen.

Farbräume

Ein Computermonitor kombiniert sämtlich Farbtöne aus den drei Grundfarben Rot, Grün und Blau, wobei ein Pixel 3 Byte = 24 Bit Speicherplatz benötigt. An dieser Stelle setzt die erste Komprimierung an, die eine Besonderheit des menschlichen Auges ausnutzt. Für Farben sind wir nämlich weit unempfindlicher als für Kontraste (Helligkeitsunterschiede). Deshalb wird eine Farbe in einen Helligkeitsanteil (Luma) und einen Farbanteil (Chroma) zerlegt. Der weniger wichtige Chroma-Anteil wird mit geringerer Genauigkeit gespeichert und dadurch Platz gespart. Das zeigt die folgende Abbildung.

Links sehen wir den Farbraum YCbCr, der nahezu verlustlos (bis auf Rundungsfehler) konvertierbar zu RGB ist und genauso viel Speicherplatz (24 Bit pro Pixel) benötigt. Luma und Chroma werden mit der gleichen Genauigkeit gespeichert, was man als 4:4:4-Sampling bezeichnet.

Rechts daneben ist der Farbraum YV12 dargestellt, der sowohl auf der DVD als auch in MPEG-4 verwendet wird. Der Helligkeitsanteil hat hier weiterhin volle Genauigkeit. Farbinformation wird aber nur noch einmal für jeden 2×2-Pixel-Block gespeichert (4:2:0-Sampling), was auf durchschnittliche 12 Bit Speicherplatz pro Pixel hinausläuft – das ist die Hälfte von RGB bzw. YCbCr.

Natürlich handelt es sich um eine verlustbehaftete Kompression, die sich allerdings nur manchmal bei Rot-Tönen bemerkbar macht. Die Farbunempfindlichkeit gilt offenbar für Rot weniger als für Grün und Blau. Deshalb neigen alle MPEG-Codecs bei Szenen mit hohem Rotanteil schon früh zur Bildung von Artefakten.

Makroblocks und Transformation

Nach dem Wechsel des Farbraums können wir uns nun mit dem Inhalt des Bildes beschäftigen. Alle gängigen Codecs zerlegen ein Bild nicht in einzelne Pixel, sondern in so genannte Makroblocks, die an dieser Stelle typischerweise 8×8 oder 4×4 Pixel groß sind. Je mehr Bitrate (Speicherplatz) wir unserem Film gönnen, desto mehr bleibt pro Makroblock übrig und desto mehr Details können im Block erhalten bleiben. Sinkt die Bitrate zu weit, besteht ein Block im Extremfall nur noch aus einer einzelnen Farbe. Spätestens dann werden im Bild die »Riesenpixel« sichtbar, die man von schlechten Encodings kennt.

Unglücklicherweise enthält ein Makroblock Daten in der räumliche Dimension, d.h. er gibt Auskunft über die Helligkeits- und Farbverteilung innerhalb einer rechteckigen Fläche. Daraus lässt sich kaum eine brauchbare Aussage über wichtige und unwichtige Bilddetails ableiten. Genau das benötigen wir aber, um nur die Details zu entfernen, die nicht wahrnehmbar sind. Deshalb müssen wir den Makroblock in eine andere, passende, Dimension transformieren. Wie genau das geschieht, muss uns im Detail nicht interessieren. Zum einen handelt es sich dabei um höhere Mathematik, zum anderen sind die Verfahren nicht bei allen Videoformaten gleich. Wir betrachten die Kompression hier am Beispiel von MPEG-4 ASP (Xvid, DivX), das die diskrete Kosinustransformation (DCT) verwendet.

Wer tiefer in die Materie einsteigen will, sollte einen Blick auf den Artikel von Ethanolix und Videostation werfen, der sich im Anhang von Selurs »Wissenswertes rund um Xvid« findet.

Die DCT rechnet den Makroblock in die Frequenzdimension um. Er behält dabei seine 8×8-Matrixstruktur, nur dass die 64 Einträge nach der Transformation keine räumlichen Informationen mehr beinhalten, sondern Frequenzen. Links oben stehen die niedrigsten und rechts unten die höchsten Frequenzen. Damit sind wir am Ziel, denn jetzt können wir Aussagen über die Wichtigkeit einzelner Einträge treffen.

Quantisierung

Die niedrigsten Frequenzen repräsentieren grobe Bilddetails (z.B. die rechteckige Form einer Tischplatte), die für die Bildqualität extrem wichtig sind und möglichst unverfälscht bleiben müssen. Die höchsten Frequenzen stehen für feine Strukturen (z.B. die Holzmaserung der Platte), die entweder nur wenig zur Bildqualität beitragen oder vollständig unwichtig sind. An dieser Stelle kommen die berühmt-berüchtigten Quantisierungsmatrizen und der Quantizer ins Spiel. Die Matrix ist der zentrale Baustein zur Durchführung der Quantisierung. Sie besteht, dem Makroblock entsprechend, aus 64 Werten, angeordnet in 8 Zeilen zu je 8 Spalten. Je höher die enthaltenen Werte, desto mehr Details werden an dieser Stelle des Blocks vernichtet. Der Quantizer dient zusätzlich als Multiplikator. Man könnte ihn als eine Art Kompressionsfaktor bezeichnen. Genau wie bei der Matrix gilt: höhere Werte bedeuten mehr Informationsverlust und anschließend eine höhere Kompression.

Unser Einzelbild besteht nun also aus einer Menge an DCT-transformierten und quantisierten Makroblocks, aus denen mal mehr, mal weniger Details entfernt wurden. Um das Bild später wieder anzeigen zu können, müssen sowohl die Transformation als auch die Quantisierung rückgängig gemacht werden, wofür die inverse diskrete Kosinustransformation (iDCT) zuständig ist. Da wir verlustbehaftet arbeiten, entspricht der wiederhergestellte Makroblock nicht exakt dem Original. Ob der Unterschied sichtbar ist – d.h. wie gut sich das Ergebnis ans Original annähert – hängt im Wesentlichen von der Höhe des Quantizers und vom Design der Quantisierungsmatrix ab.

Betrachten wir zum Schluss das Ergebnis einer DCT-Codierung.

Ganz links sehen wir stark vergrößert den ursprünglichen 8×8 Pixel großen Block, rechts daneben die per Xvid komprimierte Version. Besonders in der linken unteren Ecke sind deutlich die Unterschiede zum Original zu erkennen, allerdings nur in der Vergrößerung. Die Blocks in Originalgröße (rechts) sehen sich schon zum Verwechseln ähnlich.

Entropiecodierung

Soviel wir bisher auch verändert und umgerechnet haben, der Makroblock besteht trotzdem noch aus 64 Werten, d.h. wir haben noch nicht ein einziges Byte an Größe gespart. Die eigentliche Kompression geschieht erst jetzt bei der Entropiecodierung. Das ist das, was Rar, Zip und alle anderen Dateipacker tun; das, was wir weiter vorne als verlustlose Kompression kennen gelernt haben. So bedeutend der Unterschied zwischen verlustlos und verlustbehaftet also ist, so bedienen sich doch beide Verfahren derselben Werkzeuge. Die Arbeitsschritte der reinen verlustlosen Kompression sehen so aus:

Originaldaten ⇒ Kompression.

Die verlustbehaftete Kompression tut im Prinzip genau das gleiche, nur füttert sie den Kompressor nicht mit den Originaldaten, sondern mit einer vor-verarbeiteten Version davon, deren Informationsdichte deutlich geringer ist:

Originaldaten ⇒ Informationsentfernung ⇒ Kompression.

Je geringer die Informationsdichte, desto kleiner werden die komprimierten Daten. Kommen wir zurück zu unserem Makroblock. In seinem Ursprungszustand besteht der aus 64 recht verschiedenen, vergleichsweise schlecht komprimierbaren Werten. Nach Transformation und Quantisierung enthält der Block lange Ketten von Nullen, und die lassen sich hervorragend schrumpfen.

Wir können jetzt also einzelne Bilder komprimieren und wiederherstellen, was für ein Video prinzipiell schon ausreicht. Nichts hindert uns daran, die JPEG-artigen Bilder in einer rasanten Diashow hintereinander zu hängen. Tatsächlich gibt es einen Codec namens Motion-JPEG, der genau das tut. Allerdings lässt sich die Dateigröße mit zusätzlichen Methoden noch immer deutlich schrumpfen.

Kommentare