Entwicklung eines Patches für xineliboutput um Modeswitching anhand der Framerate durchzuführen

  • Dieser Beitrag hat mir mein damaliges Vorhaben wieder in Erinnerung gerufen und ich möchte mich nun damit etwas tiefergehender beschäftigen.


    Ziel ist es die X-Modeline über xrandr umzuschalten auf eine Modeline mit entsprechender Framerate zum abgespielten Stream. Die Auflösung könnte man bei Bedarf natürlich auch mit schalten lassen (bei VDPAU aber nur progressiv, interlaced Ausgabe ist dort ja nicht möglich).


    Für das Modeswitching ansich kann der alte Patch von durchflieger als Vorlage genutzt werden. Dieser ist hier zu finden [patch] SDTV/HDTV video mode switching für das vdr-xinliboutput-plugin
    Er läuft zwar zur Zeit nicht mit den aktuelleren xineliboutput-Versionen, das sollte sich aber anpassen lassen.


    Mein Problem dabei ist aber auszulesen welche Framerate der zur Zeit wiedergegebene Stream besitzt.
    Da ich mich im xine selbst aber nicht so auskenne dieser Hilferuf an unsere xine Experten hier.
    Ich bräuchte ein paar Tips wie man die Framerate von xine bekommen kann.


    Mein erster Versuch war es das über xine_get_stream_info auszuelesen.


    Dazu habe ich in der xine_frontend.c in der Funktion fe_frame_output_cb folgende zeilen eingefügt.


    Code
    uint32_t frame_duration = xine_get_stream_info (this->stream, XINE_STREAM_INFO_FRAME_DURATION);
      printf ("frame duration: %d\n", frame_duration);


    Die Ausgabe davon ist aber leider 0. Wo sollte den dieser Wert gesetzt werden? Macht dies das Demux-Plugin, das Decoder-Plugin, das Output-Plugin oder etwas komplett anderes?
    Komme ich darüber überhaupt weiter?
    Gibt es evtl. eine andere Funktion die mir diese Information liefert?

  • Zitat

    Original von Maniac
    Macht dies das Demux-Plugin, das Decoder-Plugin


    Kommt in den beiden vor, aber nicht im xineliboutput-demuxer. Du müsstest den Frame also nach dem dekodieren abfangen, evtl. 'update_frame_format' (wie z.B. in vo_hook.c).

  • Ich habe gerade festgestellt, das es auf SD Sendern anscheinend funktioniert. Es wird immer wieder eine Frame Duration von 3600 ausgegegen, das passt ja auch soweit (90000 / 3600 = 25).


    Auf HD-Sender kommt nachdem umschalten kurz 2-3x die Ausgabe.


    Beim MediaPlayer wird das Video anscheinend als slave_stream abgespielt, das scheint auch zu klappen. Hab aber gerade auf Anhieb auch nur 25FPS Testmaterial gefunden.


    Also kurz gesagt bei SD scheint es zu klappen, bei HD nicht. Jemand eine Idee woran das liegen kann?


    Kann mir jemand einen FreeTV Sender auf Astra 19,2 nennen welcher nicht mit 25 FPS sendet, bzw. 50 FPS, da die Werte anscheinend nach dem Deinterlacen ermittelt werden.

  • Danke, jetzt funktioniert es.


    Allerdings verstehe ich die funktionsweise des Patches nicht 100%. Das Problem tritt anscheinend dadurch auf, das
    if (buf->decoder_flags & BUF_FLAG_FRAMERATE)
    immer false ist. Beim init des Decoders nimmt der Patch nun die dort gemeldete Frame Duration und speichert diese zwischen, immer wenn sie sich ändert wird ein Update der Frame Duration gemacht und die zwischengespeicherte aktualisiert.


    Nach meinem Verständnis hätte nun auch ein auskommentieren des if-Statements gereicht. Damit dort auch einfach immer der Wert aus this->video_step gesetzt wird. Allerdings springt die Frame Duration dann zwischen dem richtigen Wert 3600 und vielfachen davon hin und her. Und das Bild im TV spielt dann natürlich auch verrückt. Bei deinem Patch passiert das nicht.


    Wo liegt dort mein Denkfehler? Das ist jetzt rein Interesse halber ;)


    Ich werd jetzt mal sehen das ich das Modeswitching noch eingebaut bekomme.

  • Ok, dann werd ich bei Gelegenheit da selbst nochmal ein bischen forschen :)


    Hab das jetzt auch alles soweit eingebaut, allerdings funktioniert bei der Zeile "rates = XRRConfigRates(sc, size, &nrate);" aus dem Patch von durchflieger noch irgendwas nicht richtig.


    Bei der Fehlersuche hab ich dann gerade mal manuell eine Framerate von 23,976 FPS im X-Server eingestellt und ein entsprechendes File abgespielt. Ergebnis das ruckelt wie bekloppt, jemand ne Ahnung was das sein kann? Das ganze sollte doch nun flüssig laufen, da keine Zwischenbilder mehr berechnet werden müssen und nicht schlimmer aussehen als vorher?


    Edit: Ich beantworte mir die Frage mal selbst ;)
    Scheint am Deinterlacer zu liegen, welcher das ganze wieder auf 50 Frames hochzieht. Ich hab gerade mal in der config_xineliboutput eingestellt das er den Deinterlacer bei progressivem Material nicht nutzen soll und das ruckeln ist weg.


    Ich bin der Meinung irgendwo mal eine Auflistung gelesen zu haben wir die Framerate der Deinterlacer ist. Finde das aber gerade nicht wieder hat da jemand einen Link für mich?

  • Diese Stelle im Code funktioniert nicht richtig.


    Code
    rates = XRRConfigRates(sc, size, &nrate);
          while (nrate-- > 0) {
            if (video_rate == *rates++ && (size_found == -1 || width_found < width)) {
              size_found = size;
              width_found = width;
            }


    Ich habe zur Zeit 8 Modelines mit einer Breite von 1920 eingetragen.
    In rates sollten ja alle Framerates liegen, welche dazu in der Config gefunden werden.
    Die Schleife wird auch 8x durchgeführt, die Werte die ich bekomme sind aber 50, 51, 52, 53, 54, 55, 56, 57
    Da davon nichts zu z.B. 24 passt wird ausgegeben das keine passende Modeline gefunden wurde.

  • Hallo Maniac,
    damit du mit xrandr nicht nur Zahlen von 50,51... bekommst musst du in deiner xorg.conf in der Section "Screen" noch die Zeile

    Code
    Option "DynamicTwinView" "False"


    eintragen. Dann sollten die richtigen Frequenzen der Modelines angezeigt werden.


    Tschau, Uwe.

    Gigabyte GA-Z77-D3H; I3-3220; 4GB 1600MHz DDR3; Technotrend S2-4100 + Technotrend Budget + Nova-HD-S2;
    passive geForce GT620 1GB; WD RED 2TB; LG DVD-DL Brenner; Debian Jessie mit VDR 2.2.0 + SoftHDDevice + KODI

  • Feindsender: Spricht etwas dagegen, dass ich deinen Patch an die xine-lib Entwickler weiterleite? Wenn er angenommen wird, wäre es dann nicht mehr nötig die xine-lib zu patchen.


    Hat zur Zeit jemand in der config den Wert video.output.vdpau_honor_progressive auf 1 stehen? Dort gab es ja früher die Probleme das zu schnell geschaltet wurde, aber das wurde glaub ich mittlerweile gefixt. Testen werd ich das heute Abend nochmal auf dem Astra Testkanal, dort ist das bei der HD+ Werbung immer recht gut aufgefallen.
    Für das Modeswitching wäre dies nämlich recht wichtig.
    Die VDPAU-Deinterlacer verdoppeln nämlich die Framerate beim Deinterlacing, bei 50i kommt z.B. 50p raus. Bei 24p wirds dann 48p wodurch es dann sehr stark ruckelt wenn das nur mit 24Hz wieder gegeben wird.

  • Zitat

    Originally posted by Maniac
    Die VDPAU-Deinterlacer verdoppeln nämlich die Framerate beim Deinterlacing, bei 50i kommt z.B. 50p raus. Bei 24p wirds dann 48p wodurch es dann sehr stark ruckelt wenn das nur mit 24Hz wieder gegeben wird.


    das hat auch seinen guten Grund. Da das Videotiming nicht mit dem Stream synchronisiert ist, laufen die beiden Takte zwangslaeufig auseinander. Bei der doppelten Frequenz (Framerate ca. 50Hz) wird eine Verdoppelung/Verlust von Bildinformation vom Auge aber nicht mehr wahrgenommen. Bei einer Framerate von 25 bzw. 24 Hz aber sehrwohl.


    Wobei man jetzt natuerlich argumentieren kann, dass Bildsequenzen von 25Hz systembedingt sowieso immer ruckeln (Kino Effekt) und somit ein Frame mehr oder weniger eh schon 'wurscht' ist:)


    Ich wuerde jedoch in jedem Fall die Deinterlacer aktivieren und entsprechend das Display natuerlich mit doppelter Wiederholrate fahren. Ich nehme mal an die VDPAU-Deinterlacer sind schon schlau genug zu merken, wenn es tatsaechlich nichts zu tun gibt (weil z.B. nur progressives Material vorliegt).


    ALs Hintergrundinfo ist das vielleicht noch ganz informativ:


    http://www.nvnews.net/vbulletin/showthread.php?t=123895


    - sparkie

  • Der patch müsste noch für den vdpau mpeg4 decoder angepasst werden. Kann ich aber mangels passender Grafikkarte mit feature set C nicht testen.


    Wenn Dynamic Twin View auf false steht lassen sich einige modelines nicht mehr auseinander halten. 23,98 und 24 Hz, 29,97 und 30 Hz oder 59,94 und 60 Hz werden dann gerundet. Ob es einen Unterschied macht müsste man testen.


    Zum honor_progressive - Soweit ich sehe wurde das nur im h264 decoder gefixt, also würden die Probleme bei mpeg2 bestehen bleiben. Bei N24 sieht man es dann schön wie der deinterlace an und aus geschaltet wird.


    gruß
    Maik

  • Zitat

    Original von Feindsender
    Der patch müsste noch für den vdpau mpeg4 decoder angepasst werden. Kann ich aber mangels passender Grafikkarte mit feature set C nicht testen.


    Gucke ich mir mal an, aber sollte ja ähnlich wie in den anderen beiden sein.


    Zitat

    Original von Feindsender
    Wenn Dynamic Twin View auf false steht lassen sich einige modelines nicht mehr auseinander halten. 23,98 und 24 Hz, 29,97 und 30 Hz oder 59,94 und 60 Hz werden dann gerundet. Ob es einen Unterschied macht müsste man testen.


    Dürfte theoretisch keine Probleme machen, wir bekommen dann z.B. zwar nur 23 angezeigt, aber die Modeline selbst gibt ja trotzdem 23,976 aus.


    Zitat

    Original von Feindsender
    Zum honor_progressive - Soweit ich sehe wurde das nur im h264 decoder gefixt, also würden die Probleme bei mpeg2 bestehen bleiben. Bei N24 sieht man es dann schön wie der deinterlace an und aus geschaltet wird.


    Das wäre natürlich ärgerlich.
    Die Idee das ganze einzubauen war nach sparkies Post nämlich an dieser Config-Option fest zu machen ob z.B. eine Modeline mit 24Hz oder mit 48Hz verwendet wird.
    Ich gucke mir das aber trotzdem mal an, evtl. lässt sich das ja auch für SD fixen.

  • Das Umschalten funktioniert nun nach der Änderung in der xorg.conf. Allerdings habe ich nachdem Umschalten nurnoch ein schwarzes Bild und der Ton bleibt auch 1-2 Sekunden später stehen. Es hilft dann nur noch vdr-sxfe zu beenden und neu zu starten.
    Getestet hab ich es indem ich über den MediaPlayer verschiedene Dateien abspielen wollte.


    Mit eingeschaltetem honor_progressive habe ich auch auf N24 keine Probleme feststellen können.


    Edit: Starte ich den X-Server mit einer 24Hz Modeline und starte vdr-sxfe wechselt er problemlos auf eine 50Hz Modeline. Beim MediaPlayer klappt das nicht.


    Hängt das evtl. damit zusammen, das der MediaPlayer als SlaveStream darstellt?

  • Der VDPAU Mpeg4 Decoder braucht keinen Patch um die Frame Duration zu aktualiseren, das scheint dort schon so zu klappen.
    Den Patch für die Frame Duration in den h264 und VC1 Decodern werd ich dann heute Abend mal an die xine-devs weitergeben.


    Kann man über xine-ui oder ein anderes Frontend etwas als slave_stream über xine abspielen?
    Dann kann ich mal testen wie es sich dort mit dem Umschalten der Modeline verhält.

  • Ich glaube dieses Problem hatte ich auch. Wenn man einige Sekunden wartet bevor man die modeline umschaltet funktionierts. Deshalb nutze ich ein externes script das 5 Sekunden wartet und dann umschaltet. Teste doch mal auf der console mit xrander. Bei mir scheint es jetzt aber auch ohne die 5 Sekunden zu klappen. Vielleicht seit dem Nvidia Treiber 256.xx ?


    gruß
    Maik

  • Danke, das werd ich mal testen. NVidia-Treiber habe ich zur Zeit die 195.30 installiert, aber den kann ich ja zum testen mal fix upgraden.


    xrandr als Consolenversion hab ich zwar zur Zeit nicht drauf, ist aber auch fix kompiliert. Wollte ich sowieso noch machen für weitere Tests mit xine-ui.

Jetzt mitmachen!

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