• Moin,
    nicht daß ich mir anmaßen würde, Euch wirklich zu verstehen, aber das Problem mit der Division durch 0 ließe sich lösen, wenn man im Nenner 1 addiert. Damit würde auch das mit den sehr niedrigen Y_AvgFrame gemildert. Und für größere Framehelligkeiten macht das +1 nicht viel aus, s. etwa:
    x/(10+1) = x/11 gegen x/10, Abweichung unter 1%
    x/(1+1) = x/2 gegen x, Abweichung 50%
    Die niedrigen Blockhelligkeiten könnte man einfach abschneiden ab einem sinnvollen (?) Schwellwert, oder eine Konstruktion mit Wurzel (sprich hoch 1/2), bzw, hoch 2/3 (steiler) oder hoch 1/3 (flacher und damit näher am Abschneiden) angehen. Wenns noch flacher werden soll, könnte man auch geeignget log(...) bilden...

    Sind nur Vorschläge - weil ich diese Diskussion SEHR interessant finde und ansonsten nicht mitreden kann, wollte ich mal zum mathematischen Teil meinen Senf dazu geben...

    Grüße!
    Trekkie2

  • Kopernikus:

    Sieht aus als hättest Du die Division durch drei doch nicht eingebaut? Die Quantizer werden ja vergrößert, sie sollen aber doch verringert werden ...

    Die Variante mit ContrastMasking hab ich mal kurz angetestet. Grundsätzlich funktioniert's, Bitratenersparnis im Bereich um die 2%. Wie die optische Wirkung ist, kann ich noch nicht beurteilen (Alles-Verschmier-Monitor hier...)


    Zitat von Trekkie2

    nicht daß ich mir anmaßen würde, Euch wirklich zu verstehen


    So, so. Du glaubst also, wir würden verstehen, wovon wir hier reden ... :D

    Also schön, ich setz mich heut abend nochmal hin und baue eine wasserdichte Formel zusammen. Aber nur damit das klar ist: hinschreiben werde ich sie in verkehrtem polonesisch, damit ich nicht wieder mit den Klammern durcheinander komme ;)

    Kostprobe mit der bisherigen Formel:

    (2+(((YavgFrame+16)/2-YBlock)/((YavgFrame-16)/2+1))^2)/3

    wird zu

    2 YavgFrame 16 + 2 / YBlock - YavgFrame 16 - 2 / 1 + / 2 ^ + 3 /

    Halte jede Wette, dass ich in der letzten Zeile keine Klammer zuviel oder zuwenig gesetzt habe! :)


    So, keine Zeit mehr jetzt. Und bis morgen ohne Internet. Ich lass' dann hören.

  • Zitat

    (2+(((YavgFrame+16)/2-YBlock)/((YavgFrame-16)/2+1))^2)/3

    wird zu

    2 YavgFrame 16 + 2 / YBlock - YavgFrame 16 - 2 / 1 + / 2 ^ + 3 /

    (ot/ die quotierungen gehen nun leider nicht mehr indem man den kopierten Absatz auswählt und auf das "quote" Icon drückt *grrrrr)

    Didée, hast du eine gute Seite im www auf Lager, wo eben dies gut erklärt wird?
    http://de.wikipedia.org/wiki/Polnische_Notation
    http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation
    ist ja schon mal ein netter Anfang, aber .... "Böhmische Dörfer"

  • Uhh, da muss man ja denken, wenn man das lesen will :)

    Didée:
    Oh, das war jetzt wahrscheinlich missverständlich. mod2 war nur ein Versuch von mir, mit einem alternativen Algorithmus. Den Dunkelheitsverbesserer hab ich mangels Formel noch nicht eingebaut.

    Vielleicht schaff ich es heute abend noch, die Kantenerkennung zu implementieren.

    Vorher hab ich mal in die ffmpeg Sourcen reingeschaut, die haben ja auch ganz schön umfangreiche AQ Features. Das ist aber nochmal eine Portion aufwendiger, da da die Quantizer von Varianz und Luminanz des aktuellen und entsprechenden Blocks des vorhergehenden Frames, dem Encoding Modusabhängt, und eine Art RDO verwendet wird.

    Da wird eine ganz einfache Parabel mit Ursprung 128 verwendet, aber das beeinflusst nicht den Quantizer direkt, sondern nochmal einen anderen Faktor, der dann in den Quantizer umgerechnet wird.

    incredible:

    Man kann sich einen übersichtlichen Baum draus malen:
    Operatoren sind Knoten mit zwei Armen: rechts der 2. Operand, links der 1.
    Wenn aber keine Zahl dransteht, sondern ein Operator, kommt wieder ein Knoten hin. Sieht dann so aus:
    Schnell und häßlich und unvollständig

    Dateien

    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 ^^

    Cruncher hat mir dieses discution gezeigt, und als ich ein bischen anüng über XviD und videocoding habe, kann ich vielleicht helfen.

    Es ist OT aber als sie sehen können, mein deutsch is sehr schlecht (es tut mir lied), so bitte zeigen sie mir meine felher, es wird mich spass machen ^^ (ich mochte deutsch und nicht english schreiben, weil dieses forum eine gutes möglichkeit um mein deutsch zu verbessern ist ... und es gibt viel arbeit >_>)

    Ich denke ich habe nicht zu viel schwirichkeiten um deutsch zu lesen, als ich ungefer alles auf dieses forum verstehe (sie brauchen nicht an mir english zu sprechen ... aber ich muss mich angstrennen, ich habe kein deutsch seit einige jahre gemacht, und ich bin französe ^^)

    Zuruck zu thema :
    Die idee, bessere HVS modellen in XviD zu benutzen, ist eine gute idee, aber ich denke sie mussen an einige punkte aufpassen. zum beispiel, AQ (adaptive quantization) im MPEG4 scheint suboptimal zu mir weil es zu viel bits kostet.

    Eine besserer weg fur HVS modellen könnte das folgende sein :
    1. Ein lambda fur jedes pixel (oder block, macroblock, ...) wählen
    2. Xvid wird diese lambda benutzen fur die R-D (rate distortion) formel : rate+lambda*distortion (dieses formel zu minimisiren ist RDO (RD optimisation))

    ich bin nicht zicher, aber ich denke fur sehr kleine quantizer, lambda can besser (weicher ?) qualität ändern als eine grosses quantizer sprung (q2->q3 zum beispiel)

    Noch besser, man kann contrast masking biss zum pixel level machen (wie SNS / spatial noise shaping) und es ist sehr effizient : es kostest keinen bits :)

    nur mein zwei (euro) cents ^^

  • Moin,
    erstmal bin ich von der Formel erschlagen! Werd mal schauen, ob ich kurz Zeit finde, einen Plot zu machen...

    Aber bis dahin:
    Jungens, kennt eigentlich keiner von Euch LaTeX?:D

    Das in den Formeleditor zu tippen ist doch Folter, oder? Ansonsten würde ich das Papier auf den Scanner legen und gut.

    Grüße!
    Trekkie2

  • Didée: Sobald aber Y_Avg_Frame = 16 ist (zwar vermutlich relativ selten der Fall) haben wir wieder Divisionen durch null drin.

    prunedtree: Zuerst möchte ich dich auf eine sprachliche Sache hinweisen. Hier kannst du die informelle Anrede "du"/"ihr" verwenden, "sie" klingt so unpersönlich. :)

    Zitat von prunedtree


    Die idee, bessere HVS modellen in XviD zu benutzen, ist eine gute idee, aber ich denke sie mussen an einige punkte aufpassen. zum beispiel, AQ (adaptive quantization) im MPEG4 scheint suboptimal zu mir weil es zu viel bits kostet.

    Ich habe die MPEG4 ASP Specs jetzt nicht zur Hand, aber ich vermute, dass adaptive Quantisierung auch mit einem Syntaxelement im Macroblock Layer gemacht wird. Ist das richtig?

    Zitat von prunedtree


    Eine besserer weg fur HVS modellen könnte das folgende sein :
    1. Ein lambda fur jedes pixel (oder block, macroblock, ...) wählen
    2. Xvid wird diese lambda benutzen fur die R-D (rate distortion) formel : rate+lambda*distortion (dieses formel zu minimisiren ist RDO (RD optimisation))

    ich bin nicht zicher, aber ich denke fur sehr kleine quantizer, lambda can besser (weicher ?) qualität ändern als eine grosses quantizer sprung (q2->q3 zum beispiel)

    Noch besser, man kann contrast masking biss zum pixel level machen (wie SNS / spatial noise shaping) und es ist sehr effizient : es kostest keinen bits :)

    Zu 1.+2. Dieses Lambda wird so gewählt, dass Pixel, bei denen der Fehler sichtbarer ist ein größeres Lambda bekommen, und Pixel, bei denen der Fehler nicht so sichtbar ist, ein kleineres Lambda. Hab ich das so richtig verstanden? Dann ist es eher der Fall, dass XviD einen Modus wählt, der mehr Distortion aber weniger Rate hat.

    Da müsste man also quasi ein Lambda Table für jeden Block (oder Macroblock oder Pixel) haben (falls es das nicht schon irgendwo gibt), und dieses dem HVS Modell entsprechend abändern.

    Das Problem ist nur, dass ich nicht genau weiß ob ich das auch programmieren kann. Bei AQ ist das relativ einfach, weil der ganze Code an einer Stelle ist, recht übersichtlich, und ich nur die Formel ändern muss :) Aber ich kann mich mal in den Code stürzen, vielleicht wird es was.

    BTW: "pruned trees" werden doch bei Wavelets verwendet, oder?

    trekkie: Doch, ich kenn LaTeX schon, aber so ein Monster ist auch in LaTeX etwas unübersichtlich

    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.

  • Kopernikus:

    Nein, nein, NEIN. Da wird nicht durch Null dividiert. Da ist ein "Epsilon"-Divisionsschutz drin (Epsilon = SomeVerySmallValue). Nicht gesehen?

    Das Problem ist nicht YavgFrame=16. Wenn schon, dann ist YavgFrame<16 kritisch. Deswegen sollten alle Terme "YavgFrame-16" eigentlich als Betrag "|YavgFrame-16|" geschrieben werden. Wollte ich, konnte ich aber leider nicht machen: der Formeleditor war beleidigt, und hat irgendwas gebrummelt von wegen bei zehn Verschachtelungsebenen hätte er die Schnautze voll, und er würde sich deswegen jetzt mit der Gewerkschaft in Verbindung setzen .. ;)


    Jedenfalls - es sind schon Konferenzen gescheitert, weil man sich nicht einigen konnte, ob der Konferenztisch rund oder viereckig zu sein hat ...


    Nimm doch, bittebitte, einfach mal die ganz simple Methode, die ich zuvor schonmal geschrieben hatte:

    IF (YavgFrame<90 AND YBlock<YavgFrame)
    THEN Qneu = Qalt - 1
    ELSE Qneu = Qalt

    Ich hoffe, das ist nicht zu kompliziert? Zwar ist damit die Bitratenerhöhung zwei- oder dreimal so groß wie mit den smarteren Methoden, sicher. Aber man könnte immerhin schonmal etwas antesten, grobe Abschätzungen vornehmen, und sehen wie der Effekt überhaupt aussehen könnte.


    Was ich _eigentlich_ gerne testen würde, um die wahrscheinlichst-kritischen Bereiche anzuheben UND die Bitratenerhöhung so gering wie möglich zu halten, ist folgendes:

    WENN YavgFrame < ~90 ist, DANN wird die Quantisierung für die Blöcke veringert, die im mittleren Bereich des Intervalles [16,YavgFrame] liegen.
    Wie groß dieser "mittlere Bereich des Intervalles" ist, hängt von der Größe von YavgFrame ab: je kleiner YavgFrame wird, umso größer wird dieser "mittlere Bereich".

    Also:

    - wenn YavgFrame nur sehr wenig unter 90 liegt (oder welchen genauen Grenzwert man auch immer nehmen mag), dann soll das Intervall sehr klein sein (Frame ist noch "hell", es ist noch nicht nötig, Quantisierungen zu veringern).

    - wenn YavgFrame sehr klein wird, z.B. <32, dann soll dieser "mittlere Bereich" praktisch das ganze Intervall [16,YavgFrame] umfassen.

    - zwischen diesen beiden Fällen soll der "mittlere Bereich" in dem Maß größer werden, wie das Intervall [16,YavgFrame] kleiner wird.


    Wie man das genau hinkriegt, da gibt's verschiedene Möglichkeiten. Man kann z.B. eine einfache Parabel nehmen. So wie meine erste Formel. Aber da muss man dann halt in Gottes Namen die unerwünschten Bereiche separat abfragen ... Du hast dich ja über "stark ansteigende Quantizer" beschwert. Tja, statt das Ergebnis der Formal direkt zu verwenden, hättest Du halt Ergebnis = max(Ergebnis,1) nehmen müssen ...

    Jedenfalls, um der ganzen Herumdoktorei mit if-then-else, Spezialfall-Behandlung und Extremwert-Ausnahmen zu entgehen, genau _deswegen_ hab ich ja die kompliziert aussehenden Formeln zusammengabaut. Da muss, von der Idee her, nichts mehr berücksichtigt werden. Gar nichts. Die Formel(n) können auf *alle* Frames und auf *alle* Blöcke direkt angewendet werden, ungeachtet jegweder Helligkeitswerte, und liefern das gewünschte Ergebnis. Wie gesagt: wasserdicht.
    (Allerdings sollten, wahrscheinlich, die Formeln nicht in Echtzeit für jeden Block angewendet werden ... zu komplex, ergo zu langsam. Da müssten idealerweise anfangs LookUp-Tables erstellt werden, aus denen später die entsprechenden Werte für die jeweilige Kombination aus YBlock & YavgFrame herausgefischt werden.)

    Meine grobe Abschätzung für die effektive Bitratenerhöhung, wenn eine smarte midrange-of-Interval Methode verwendet wird:

    - für die betroffenen Szenen: +15% ~ +25% Bitrate
    - Gesamtbitrate in einem durchschnittlichen Film: +5% ~ +15%

    Da die Erhöhung der Bitrate aus einer effektiven Verbesserung der Bildqualität resultiert, sollte sich das ausgehen.

    Ist halt nur geschätzt ... testen kann man's ja leider nicht :|

  • Sorry, was ich meinte ist, dass jeder Term der Form (irgendwas)/(Y_avg_Frame -16) eine Division durch Null enthält, wenn Yavg = 16. Das gibt halt, wenn es auftritt, vermutlich sehr seltsame Ergebnisse.

    Ok, was ich jetzt gemacht habe ist:
    Wenn Y_avg_Frame < 90
    dann
    wenn y_avg_Block<Yavg_Frame
    dann Quant = quant +1
    im anderen Fall
    Normales Lumimasking

    Ich hoffe ich hab das jetzt alles richtig verstanden, wie du es meinst.

    http://web3.gleitz.org/Kopernikus/XviD110beta2mod3.zip

    Viel Spass beim Testen.

    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.

  • Oh, gerade gesehen: die "kleinere" Formel hatte ich versehentlich zu früh abfotografiert - da war das Epsilon ja noch gar nicht drin! Wie's aussehen sollte sieht man in der "großen" Formel. Sorry auch von meiner Seite :redface:


    Aaah, jetzt geht's in die Richtung. Nur eine einzige, klitzekleine Korrektur wäre im Moment noch angebracht:

    Zitat von Kopernikus

    Wenn ...
    dann
    wenn ...
    dann Quant = quant +1


    Minus, minus, M-I-N-U-S !! :)

    (Wegen Minus-Plus-Verwirrungen in Formeln sollen schon ganze Raumschiffe abgestürzt sein ...) :D

  • Nur zur Info...
    prunedtree und andere XviD Devs (und auch andere Leute die man kennt) sind jederzeit auf dem freenode server im xvid channel anzutreffen (IRC)-sollte vielleicht helfen dieses doch sehr interessante Thema tiefgruendiger und schneller voranzutreiben.

  • Weiss ich. Aber mich hat da noch keiner angetroffen. Wenn viele Leute gleichzeitig durcheinanderreden, kriege ich furchtbare Kopfschmerzen. (Das war kein Witz.)

  • Oh, Mist. Ich habs korrigiert, neue Version ist gleich da, unter der selben Addresse.

    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.

  • Tausend Dank! Erster Funktionstest läuft ...

    edit - nö, das war's noch nicht. Die DLLs von 13:08 und von 14:07 produzieren bitidentische Ergebnisse.

  • Mmh, seltsam. Ist AQ aktiviert, und sind auch Frames < 90 dabei.

    Ah, moment, ich hab was gefunden, da wurde nochmal was geschraubt, was ich übersehen hatte. Aktualisierte Version lädt gerade hoch. So in 3 minuten sollte sie oben sein, Link wie gehabt.

    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.

  • Das versteh ich jetzt nicht. Ich schau mal danach.

    Also bei mir macht er schon was mit AQ, aber ich bin mir nocht so ganz sicher was. Auf jeden Fall nicht das was er soll. Kann es sein, dasa AQ nur bei P und I Frames, nicht aber bei B-Frames greift. Ausserdem scheint er irgendwie alte Quantizer zu vergeben, bei meinem sehr kurzen Test hat ein komplett schwarzes Frame (das ja eh nicht adaptiv quantisiert werden sollte) die quantizer von einigen Frames vorher bekommen.

    Oh je, diese Computer, warum machen sie nie das, was sie sollen...:(

    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.

Jetzt mitmachen!

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