NLS - "Non-Linear Stretch" für MPC-HC/BE



  • zozi hat mich vor kurzem gefragt ob ich ev. eine Shader erstellen könnte um in MPC-Playern NLS zu ermöglichen.

    Also habe mich also ran gemacht, die HomeAssistant-Anleitung pausiert und diesen NLS-Shader programmiert.


    Mdann hatte hier schon mal begonnen. MPV Shader: Non Linear Stretch


    Wobei sich mein NLS-Shader automatisch an das Seiterverhältnis der Medianquelle anpasst. Und als Nutzer kann man im Shader drei Parameter festlegen und diese für sich optimieren.

    • Seitenverhältnis des Screens (Leinwand)
    • Bis auf welche Größe das Bild gezoomt werden soll, bevor die Seiten gestreckt werden
    • Größe des zentralen Bildbereichs ohne Verzerrung

    Zusätztlich liegt dem Shader noch ein Simulator (Excel) bei, damit könnt ihr die Auswirkugnen der Parameter gut visualisieren:



    Zuerst zum Simulator:


    Hier könnt ihr links oben die 4 Parameter einstellen die das NLS konfigurieren.

    Anm: Da ich kein Mathematiker bin, konnte ich keine universell gültig Formel herleiten, aber setzt man für die Parameter aus einem für unsere Anwendung sinnvollen Wertebereich ein, ergibt das auch ein korrektes Ergebnis. (Nur arsource sollte kleiner-gleich arscreen sein, das werde ich ev. noch ergänzen.)


    Die Parameter:

    • arsource: Seitenverhältnis des Quellmaterials (Wird vom Shader automatisch ermittelt)
    • arscreen: Seitenverhältnis eurer Leinwand)
    • zoom2width: Das Bild kann vor dem Strecken das Bild noch gezoomt werden. Trägt man hier zB. 2.0 ein, wird jedes Bild mit einem Seitenverhältnis unter 2:1 zunächst auf die Breite 2:1 gezoomt (Dadurch wird oben und unten etwas abgeschnitten)
    • centerwidth: Breite des zentralen Bildbereichs (ohne Verzerrung). Der Wert ist im Verhältnis zu Bildhöhe anzugeben!

    Im Diagramm darunter sieht man dann, was der Shader mit dem Bild machen wird:

    • Die blaue Kurve zeigt den Faktor der Verzerrung. Diese ist hier im Zentralbereich 1. Also keine Verzerrung. Und am Rand maximal, 2,6 also 2,6x breiter als hoch. Also praktisch nicht brauchbar ;-)
    • Die rote Kurve zeigt um wieviel eine Bildspalte nach außen geschoben wird. Im Randbreich also um 0,31*Höhe. Anm.: Seitlich wird nie abgeschnitten.




    Für unterscheidliche Parameter beispielhaft folgende Darstellungen:




    Jetzt zum Shader


    In der Zip-Datei findet ihr eine Datei names NLS_NN_20240423.hlsl. Das ist ein Shader-Programm in der Direct3D-Sprache "High-Level Shader Language".

    Hier könnt ihr in den Zeilen 8 bis 10 die für euch passenden Parameter eintragen oder experimentieren.


    Zur Installation einfach MPC-HC/BE öffnen, die Datei als Shader imporiteren und als "Post-Resize-Shader" entragen.


    Wichtig ist noch, dass ihr in MADVR, das Erkennen des Seitenverhältnisses und das Bescheiden der Letterboxen aktiviert, und dass das auch funktioniert!



    Dann also nur noch einen Film starten und über das MPC-Context-Menü oder den Short-Cut <Ctrl-Alt-P> den Post-Resize-Shader ein und ausschalten.


    Praktisch ist, man kann die Parameter in der HLSL-Datei zu Laufzeit ändern und die Datei speichern, dann werden die Änderungen unmittelbar aktiviert und sichtbar.

    Gibt es einen Fehler in der HLSL-Datei (z.B. Strichpunkt am Zeilenende vergessen) läuft der Shader nicht und im Shader-Debugger wird eine Fehlermeldung angezeigt!


    Fazit:

    Mir gefällt das Bild mit NLS eigentlich nicht. Die Bildverzerrungen am Rand stören mich bei Kameraschwenks doch sehr. Daher werde ich wohl bei der seitlichen Maskierung bleiben.

  • Namor Noditz

    Hat den Titel des Themas von „NLS - "Non Liniear Stretch" für MPC-HC/BE“ zu „NLS - "Non-Linear Stretch" für MPC-HC/BE“ geändert.

  • Fazit:

    Mir gefällt das Bild mit NLS eigentlich nicht. Die Bildverzerrungen am Rand stören mich bei Kameraschwenks doch sehr. Daher werde ich wohl bei der seitlichen Maskierung bleiben.

    Vielen Dank für die tolle Arbeit. Allerdings ist genau das auch mein Fazit.

    Die Verzerrungen finde ich viel schlimmer, als die schwarzen Balken. Ich zoome ab 2.2 aber einfach auf.

  • Vielen Dank für die tolle Arbeit. Allerdings ist genau das auch mein Fazit.

    Die Verzerrungen finde ich viel schlimmer, als die schwarzen Balken. Ich zoome ab 2.2 aber einfach auf.

    Ich dachte mit der Parametrierung von NLS finde ich eine brauchbare Konfiguration.

    Zoom auf 2:1 und 0,2 Center ist mein Favorit, aber die Verzerrungen sehe ich dennoch deutlich.

  • Lässt sich denn nicht einfach eine Mischung aus beidem realisieren oder wirkt das auch noch zu unangenehm. Sprich etwas stretchen und etwas aufzoomen?


    Aktuell zoome ich alles auf aber 16:9 nicht komplett auf 21:9, sondern eher 1,79 so auf grob 2,0. 2,0 auf 2,2 und 2,2 auf 2,4. So ließe sich das alles evtl. noch kombinieren?!

    auch gewerblich als User "Speaker Base" unterwegs

  • Lässt sich denn nicht einfach eine Mischung aus beidem realisieren oder wirkt das auch noch zu unangenehm. Sprich etwas stretchen und etwas aufzoomen?


    Aktuell zoome ich alles auf aber 16:9 nicht komplett auf 21:9, sondern eher 1,79 so auf grob 2,0. 2,0 auf 2,2 und 2,2 auf 2,4. So ließe sich das alles evtl. noch kombinieren?!

    Kann man hiermit machen. Zuerst wird auf die Wunschgröße gezommt. z.B. 1,77 auf 2,0 und dann der Rest (außerhalb des Center-Bereichs) gestreckt.


  • Weißt du zufällig, ob das Ganze in Kombination mit dem MovieStarter funktioniert?

    Prinzipiell sehe ich dabei kein Problem. Es wäre aber noch festzulegen, wie die Info zum Seitenverhältnis in den Shader kommt.

    In der aktuellen Version schneidet MadVR das Bild zu und das Seitenverhältnis passt somit.

    Das geht mit dem MovieStarter soweit ich weiss nicht. Denn dieser nutzt die in den MetaDaten der Datei hintelegte Info zum Seitenverhältnis und schneidet das Bild nicht zu.


    Spontan würde mir einfallen, den MPC-Player mit dem zum Seitenverhältnis passende Shader-Profil mittels CommandLine-Parameter zu starten.

    Wäre mit Nils abzustimmen.

  • In der aktuellen Version schneidet MadVR das Bild zu und das Seitenverhältnis passt somit.

    Das geht mit dem MovieStarter soweit ich weiss nicht. Denn dieser nutzt die in den MetaDaten der Datei hintelegte Info zum Seitenverhältnis und schneidet das Bild nicht zu.

    Der MovieStarter zoomt das Bild, was einem Zuschneiden entspricht. Mit dem Shader weiß er natürlich nicht, welches Zielseitenverhältnis in dem Fall gewünscht ist. Das kann man aber am Film hinterlegen. Wenn der Shader das wissen muss, müsste man es beim Filmstart per Aktor (Script) in den Shader reinschreiben. Wäre bestimmt auch möglich.


  • Imho ist der Unterschied von 16:9 zu 21:9 zu groß. Entweder fehlt das halbe Bild oder es ist zu stark verzerrt.


    Aber, da meine Leinwand mit 2.1:1 (19:9) ein Zwischenformat hat ist es einfacher.


    const static float arscreen = 2.1; // Width auf my Screen

    const static float zoom2width = 1.9; // Zoom to width before Streching

    const static float centerwidth = 1; // Center width without Stretching

Jetzt mitmachen!

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