Fragen zur MPEG-2 Enkodierung

  • Hi!
    Ich hoffe ich poste hier mein Problem im richtigen Teil des Forums, passt
    jedoch wohl noch am besten:

    Ich bin derzeit im Rahmen meiner Diplomarbeit dabei einen MPEG-2 Enkoder in
    Matlab zu programmieren (Den verlustbehafteten Teil). Eigentlich funzt schon alles relativ gut. Jedoch habe ich noch zwei Probleme. Zunächst einmal wie die Quantisierung bei Interframe Coding genau funktioniert. Hierzu habe ich das Buch Bilddatenkompression - Grundlagen, Codierung, Wavelets, JPEG, MPEG, H.264 von Tilo Strutz. Dort steht eine relativ komplizierte Formel für die Rekonstruktion der quantisierten Werte (Ich erspar mir momtan noch diese hier zu posten vllt lässt sich das Problem auch so beheben). In anderer Literatur oder anderen Webseiten ist meistens jedoch nur die Rede von einer Rekonstruktion durch Multiplikation der quantisierten Werte wieder mit der Quantisierungsmatrix (was auch logisch ist). Die Frage ist nun was wird bei den normalen Encodern/Decodern hier verwendet? Leider gibt es zu diesem Bereich im Internet sehr wenig genaue Information, nur "gefährliches Halbwissen" ;)

    Meine zweite Frage bezieht sich auf die bidirektionale Prädiktion (B-Bilder) und deren Funktionsweise. Hier ähnliche Frage, wie funktioniert diese explizit ? Werden die Bewegungsvektoren zum vorhergehenden Bild und zum nachfolgenden Bild berechnet, die zugehörigen Differenzfehlerbilder und dann ein Mittelwert derer gebildet ? Wie werden die Vektoren komibiniert ? Diese Frage wird ebenfalls in Litertur und Internet nicht tiefgehend geklärt. Ich weiss auch hier das die Vorgehensweise nicht festgelegt wird durch den MPEG Standard, jedoch wäre es trotzdem interessant hier eine gängige Lösung in Standardencodern zu erfahren!

    Danke schonmal im Vorraus, hoffe es kann mir jmd helfen!
    Ciao
    Jojo

  • Suchst du die Encoder oder Decoder Seite?
    Hast du einen MPEG2 Standard vorliegen?

    Der Decoder ist genau spezifiziert, der Encoder kann im Prinzip alles machen, was nachher das gewünschte Ergebnis bringt.

    Quantisierung:

    Die einfachste Möglichkeit ist, einfach das Ergebnis der DCT durch Quantizer_Scale*QMatrix eintrag zu teilen.

    Etwas besser ist es, wenn man eine sogenannte DeadZone einführt, so dass Werte eher abgerundet werden, bzw. sehr kleine werte Null werden. Das sorgt dafür, dass die RLE besser arbeitet.

    Man kann auch andere Rundungstricks anwenden. Die H.264 Referenzsoftware z.B. verwendet eine adaptive Rundungsstrategie, die das Rundugnsverhalten aufgrund von vorher encodierten Bildteilen ändert.

    Optimal ist die Verwendung einer Viterbi-basierten Quantisierung: Die zur Encodierung eines Koeffizienten verbrauchten Bits werden gegen die verursachten Bildfehler abgewogen. So werden z.B. Koeffizienten, die viele Bits brauchen, aber nur wenig Bildfehler verursachen würden, weggelassen, um mit den eingesparten Bits an anderer Stelle zu verbessern. Dieses Verfahren wird auch als Trellis Quantisierung bezeichnet.

    http://www.icsl.ucla.edu/~ipl/Publicati…on_in_h263+.pdf

    Man kann das auf die Spitze treiben, und auch in B oder P-Frames die Koeffizienten zusammen mit denen der Referenzen optimieren, das ist dann aber sehr rechenintensiv (also ich meine sehr rechenintensiv)

    http://www.stanford.edu/~bschumit/Schumitsch_PCS_04.pdf
    (Loren Merritt hat mal angefangen, das für x264 zu implementieren, was dabei rauskam weiß ich aber nicht)

    Für B-Frames kann man auch beliebigen Aufwand treiben. Die Decodierung ist jedoch festgelegt (als arithmetisches Mittel der beiden Predictions):

    Man kann einfach von jedem der beiden Referenzen den Vektor nehmen, der eine Fehlermetrik minimiert (z.B. SAD oder SSD)

    Oder man nimmt den besseren der beiden und sucht den Vektor für die andere Referenz, die den Gesamtfehler minimiert.

    Oder man sucht die kombination von Vektoren, die den Fehler minimiert.

    Oder man wiegt dabei noch die Kosten zur Encodierung der Vektoren gegenüber den Bildfehlern ab.


    Für Beispiele empfehle ich dir Open Source Implementierung von MPEG2 Encodern zu lesen, falls du C lesen kannst. Insbesondere ffmpeg ist zu empfehlen, da sind einige der oben genannten Dinge implementiert. der Code ist zwar zum Teil ziemlich optimiert, und deshalb sehr unleserlich, aber die Autoren haben üblicherweise ziemlich Ahnung.

    Hast du vor, den Quelltext zu veröffentlichen? Ich fände das prinzipiell interessant.

    Es gibt eine Theorie, die besagt, dass das Universum sofort verschwinden und etwas noch Unerklärlicheres und Bizarres an seine Stelle treten wird, sobald jemand herausfindet, wofür es gut ist und warum es existiert.

    Es gibt eine andere Theorie, die besagt, dass das bereits geschehen ist.

  • Hi Kopernikus,

    danke für die schnelle Antwort.
    Bin gerade nicht mehr in der Arbeit, werde morgen mit deinen Tipps mal
    ein wenig rumprobiern. Ich poste auch die Rekonstruktionsformel die ich in dem Buch habe, evtl. kannst du mir sagen was für eine Art der Quantisierung das dann entspricht.

    Ich habe bereits versucht im Standard MPEG2 Encoders (in C) des MPEG Teams die funktionsweise besser zu verstehen, war aber nicht so einfach
    mich da einzulesen. Evtl. finde ich ja noch eine andere Implementierung.

    Bzgl. der Veröffentlichung des Quelltextes weiss ich noch nicht genau. Es liegt weniger an mir als an meiner Diplomarbeitsfirma. Ich plane jedoch das ganze Programm auf dem Matlab File Exchange zu veröffentlichen nach Abschluss meiner Arbeit (Ende September). Die Software ist primär dazu gedacht Qualitätsvergleiche wie Verhalten von z.B. Kanten oder Grauwertdynamik nach Kompression zu untersuchen. Zugrunde liegt eben hier die MPEG2 Kompression. Für Versuchszwecke sehr fein, aber im vergleich zu normalen Enkoder viel viel zu langsam...

    Ciao
    Toby

  • Vermutlich wird da der ISO/IEC-Standard 13818 helfen, wenn man die Chance hat, an diese Dokumente heranzukommen. Draft-Versionen davon müssten eventuell auf neuron2.net liegen; oder hab ich noch welche?! ...

  • Zitat von QuAdJojo

    Hi Kopernikus,

    danke für die schnelle Antwort.
    Bin gerade nicht mehr in der Arbeit, werde morgen mit deinen Tipps mal
    ein wenig rumprobiern. Ich poste auch die Rekonstruktionsformel die ich in dem Buch habe, evtl. kannst du mir sagen was für eine Art der Quantisierung das dann entspricht.

    Die Rekonstruktionsformel ist vermutlich die aus dem Standard, das ist das was ein Decoder machen muss, damit man ihn als standardkonformen MPEG2 Decoder bezeichnen darf.

    Was der Encoder macht, um einen Bitstream zu erzeugen, aus dem der Decoder etwas macht, was der Quelle ähnlich sieht, ist völlig beliebig. Man könnte auch so lange zufällige Werte ausprobieren, bis es so ähnlich aussieht. Und da man ja das Video klein kriegen will macht man dann so Tricks wie die oben genannten, um mit weniger Bits ein ähnlich gut aussehendes decodiertes Bild rauskriegt.

    Die direkte Umkehrung der Rekonstruktionsformel ist das simple dividieren. In nicht Intra-Frames kann man evtl. etwas aggressiver abrunden, da in der Rekonstruktion ein Bias nach oben hinzukommt.

    Zitat


    Ich habe bereits versucht im Standard MPEG2 Encoders (in C) des MPEG Teams die funktionsweise besser zu verstehen, war aber nicht so einfach
    mich da einzulesen. Evtl. finde ich ja noch eine andere Implementierung.

    Eigentlich alle Open Source MPEG2 Implementierungen, die ich kenne sind in C geschrieben. Aber vielleicht schaust du dir libMPEG2 (http://sourceforge.net/projects/libmpeg2/) mal an, die Referenzsoftware ist nicht als verwendbares oder besonders gut lesbares Programm gedacht, sondern im wesentlichen als Forschungsobjekt.

    ffmpeg ist auch gut, aber unter umständen sehr schwer zu lesen.

    Es gibt eine Theorie, die besagt, dass das Universum sofort verschwinden und etwas noch Unerklärlicheres und Bizarres an seine Stelle treten wird, sobald jemand herausfindet, wofür es gut ist und warum es existiert.

    Es gibt eine andere Theorie, die besagt, dass das bereits geschehen ist.

  • Ja, Fortran, aber ist HC Open Source?

    Ausserdem ist Fortran nicht wesentlich besser lesbar als C, eher im Gegenteil...

    Es gibt eine Theorie, die besagt, dass das Universum sofort verschwinden und etwas noch Unerklärlicheres und Bizarres an seine Stelle treten wird, sobald jemand herausfindet, wofür es gut ist und warum es existiert.

    Es gibt eine andere Theorie, die besagt, dass das bereits geschehen ist.

  • Hi!
    Danke für alles Feedback bis jetzt!
    Ich stehe momentan schon mit Hank, dem Autor von HCEnc in Kontakt.
    Er kann mir da bis jetzt sehr detailliert weiterhelfen, ja HC ist in Fortran geschrieben.
    Ich werde mir auch gleich noch libmpeg2 anschaun...
    Ciao
    Toby

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!