softhdcuvid jetzt mit VAAPI und HDR support

  • Ja AudioStartThreshold * 6 hatte ich schon probiert. Das Problem ist das beim starten einer Aufnahme von der Platte der VDR die Puffer so voll pumpt das das auch nix nützt.


    Der Decoder ist nicht zu langsam es wird ja alles in HW dekodiert. Nur es müssen ja auch Video Frames kommen die man wegwerfen könnte, Meistens reicht es ja auch aus ein Frame zu verwerfen. Nur ich habe festgetellt das die PTS differenz zwischen Video und Audio doch immer mal wieder wackelt. UNd dann kommt es dazu das ein Frame verworfen wird nur um gleich das nächste wieder zu verdoppeln. Evtl. liegt es ja wirklich am Audio und dein Mutex verbessert es. Bin gespannt ob du Erfolg damit hast. Dann übernehme ich es :)

  • Evtl. liegt es ja wirklich am Audio und dein Mutex verbessert es. Bin gespannt ob du Erfolg damit hast. Dann übernehme ich es

    Den Mutex kannst Du schon einbauen. Die PTS von Audio stimmt ab und zu nicht.


    Einen zweiten Punkt hab ich noch gefunden. Wenn ein Audio Packet in den Ringbuffer geschrieben wird wird die PTS gesetzt. Die ist aber für das erste Sample im Packet. Beim Ermitteln der Audio PTS wird die aber für das letzte Sample angenommen. Ich füge beim Setzen der PTS jetzt die Zeit die das Packet beinhaltet zur PTS hinzu.

  • Den Mutex kannst Du schon einbauen. Die PTS von Audio stimmt ab und zu nicht.


    Einen zweiten Punkt hab ich noch gefunden. Wenn ein Audio Packet in den Ringbuffer geschrieben wird wird die PTS gesetzt. Die ist aber für das erste Sample im Packet. Beim Ermitteln der Audio PTS wird die aber für das letzte Sample angenommen. Ich füge beim Setzen der PTS jetzt die Zeit die das Packet beinhaltet zur PTS hinzu.

    Ich warte dann mal auf dein GIT :)


    Habe etwas mit dem AudioStartThreshold rumgespielt und bei AudioStartThreshold * 10 läuft Audio nicht unkontrolliert los bei starten einer Aufnahme und dann schafft es auch AudioVideoReady das sinnvoll zu starten. Danach ist Video leicht vor dem Audio (pts diff ist positiv) und } else if (diff > 55 * 90) { hält das auch so im positiven. Damit funktioniert es ganz gut. Zur sicherheit habe ich mal ne Routine zum einfügen von Stille gemacht um zu sehen ob das dann noch zuschlägt im laufe der Zeit. Ich probiere das erst mal hier aus um zu sehen das es klappt.

  • Ich hab mir die Tage für mich eine neue KIste mit Ryzen APU zusammengebastelt, und wollte mir das aus Interesse mal ansehen. Im Moment geht das Plugin nur leider nicht durch meinen Compiler auf Ubuntu 19.10. Neben einigen Warnungen gibt das hier einen harten Fehler:


    Code
    video.c:542:10: error: conflicting types for 'gettid'
      542 | uint64_t gettid()
          |          ^~~~~~
    In file included from /usr/include/unistd.h:1170,
                     from video.c:68:
    /usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:16: note: previous declaration of 'gettid' was here
       34 | extern __pid_t gettid (void) __THROW;
          |                ^~~~~~


    Ubuntu Eoan (19.10) bringt glibc 2.30 mit, ab der gettid eine eigene Deklaration darin hat. Soweit ich das überblicke ist der Fix recht simpel, ich hab gerade fix einen Pull Request gemacht, der das lösen müsste.

    - HTPC mit zerbasteltem Yavdr 0.6 , Origen ae X15e, MCE Remote, Asus P5N7A-VM, 1x Digibit R1, Kodi und vdr an Pana 46PZ85E
    - Diverse HTPCs im Umfeld bei Familie und Freundenm die sich vor mir fürchten, mit allen möglichen gruseligen Konfigurationen.
    Auch gern Debian, aber wehe jemand kommt mir mit Suse.

  • Ich hab mir die Tage für mich eine neue KIste mit Ryzen APU zusammengebastelt, und wollte mir das aus Interesse mal ansehen. Im Moment geht das Plugin nur leider nicht durch meinen Compiler auf Ubuntu 19.10. Neben einigen Warnungen gibt das hier einen harten Fehler:


    Code
    video.c:542:10: error: conflicting types for 'gettid'
      542 | uint64_t gettid()
          |          ^~~~~~
    In file included from /usr/include/unistd.h:1170,
                     from video.c:68:
    /usr/include/x86_64-linux-gnu/bits/unistd_ext.h:34:16: note: previous declaration of 'gettid' was here
       34 | extern __pid_t gettid (void) __THROW;
          |                ^~~~~~


    Ubuntu Eoan (19.10) bringt glibc 2.30 mit, ab der gettid eine eigene Deklaration darin hat. Soweit ich das überblicke ist der Fix recht simpel, ich hab gerade fix einen Pull Request gemacht, der das lösen müsste.

    Du kannst das gettid in video.c einfach rauswerfen.

  • Hi,


    ich teste gerade softhdvaapi unter Fedora 31. vaapi/egl und vaapi/libplacebo funktionieren beide grundsätzlich. CPU-Load ist bei allen drei Varianten (egl, libplacebo/binlinear und dem gepatchten softhddevice (letzte Version von pesintta, bevor es vaapidevice wurde...)) bei RTL HD ähnlich hoch. Debuglog (egl):


    In Aufnahmen kann man leider nicht richtig vorspulen/springen, da hängt die Ausgabe für ca. 30sec oder hängt sich komplett weg!



    Wenn mein Skin "skinflatplus" aktiviert ist, startet die egl-Version erst gar, mit libplacebo manchmal, manchmal mit SIGSEGV, anbei die Meldung, wenn es mal startet:



    Wie ich das jetzt debuggen soll, weiß ich leider nicht. Wenn das Plugin mit dem Spulen zurechtkommt und das Problem mit skinflatplus geklärt ist, fehlt nicht mehr viel, dass man es praktisch auch mit Intel benutzen kann.

    System 1: Hardware : ASUS B150M-C, Intel Pentium G4560, DVB cineS2, 1x 2TB HDD, 1x 214GB SSD, Gehäuse Antec Remote Fusion Black, 8 GB DDR4 RAM.
    Software : Fedora 34, vdr 2.4.7, softhddevice GIT, Kernel 5.15.11
    System 2: Hardware : Intel NUC10i5FNK, Intel Core i5-10210U (Comet Lake), DVB TechnoTrend TT-connect S2-4600 USB, 1x 1TB NVMe, 32 GB DDR4 RAM.
    Software : Fedora 35, vdr 2.4.7, softhdcuvid, Kernel 5.15.11

  • Habe nun nochmal einen Fix für das springen in den Aufnahmen eingecheckt. Und für die CUVID Leute ist nun auch mal etwas dabei: Das Bufferhandling wurde überarbeitet und sollte nun deutlich besser laufen.


    Derzeit sieht es so aus also ob beim vaapi alle skin Plugins nicht sauber laufen. Ich habe mal mit dem skindesigner getestet und da gibt es Problme beim Skin umschalten (ansonsten läuft es wohl). Den Skinflatplus habe ich nicht aber ich denke der läuft auch nicht. Das könnte daran liegen das ich auf egl umgestellt habe und die Skins die GL Texturen nicht im richtigen EGL Kontext erstellen. Das schaue ich mir nochmal an. Derzeit ist LCARS angesagt :)


    Als Last Resort beim a/v sync schiebe ich nun Stille ins Audio. Wem das auffällt der sollte sich melden. Eigentlich sollte das im normalbetrieb nicht gebraucht werden.


    mfg

    jojo61


    PS: habe noch etwas für den skindesigner nachgeschoben

  • Die letzte Version habe ich mit vaapi/EGL getestet. Spulen und springen in Aufnahmen geht jetzt, top! Habe mal Skin testweise auf skindesigner (mit deinem Patch) umgestellt, verhält sich aber auch komisch. Das Rendering von einigen Buchstaben funktioniert da nicht, weiterhin hängt er sich dann noch kurzer Zeit auf. Ich habe außerdem folgenden Bug gefunden: PIP aktivieren, dann wieder deaktivieren -> Bild bleibt grün.


    zork

    System 1: Hardware : ASUS B150M-C, Intel Pentium G4560, DVB cineS2, 1x 2TB HDD, 1x 214GB SSD, Gehäuse Antec Remote Fusion Black, 8 GB DDR4 RAM.
    Software : Fedora 34, vdr 2.4.7, softhddevice GIT, Kernel 5.15.11
    System 2: Hardware : Intel NUC10i5FNK, Intel Core i5-10210U (Comet Lake), DVB TechnoTrend TT-connect S2-4600 USB, 1x 1TB NVMe, 32 GB DDR4 RAM.
    Software : Fedora 35, vdr 2.4.7, softhdcuvid, Kernel 5.15.11

  • PIP geht mit VAAPI derzeit nicht. Ich habe mal rumgespielt und finde den Fehler nicht. Könnte aber am FFMEPG liegen. Irgendwie scheint der Vaapidecoder nicht mitzukriegen wenn ich eine Instanz zu und wieder auf mache. Danach beschwert er sich das ich die falschen SurfaceIDs übergebe.


    mfg

    jojo61

  • Ich habe mal angefangen, Deinen Code etwas zu bereinigen und Dir einen pull request geschickt. Ich habe da noch einige Ideen für weitere Bereinigungen und Erweiterungen, würde aber, bevor ich Arbeit investiere, wissen, ob Dir so ein Vorgehen recht ist. Ich finde Dein Plugin sehr gut, es scheint mir auch das Einzige in dem Bereich zu sein, was aktiv weiterentwickelt wird. Interessieren würde mich eine Wayland-EGL Integration.


    zork

    System 1: Hardware : ASUS B150M-C, Intel Pentium G4560, DVB cineS2, 1x 2TB HDD, 1x 214GB SSD, Gehäuse Antec Remote Fusion Black, 8 GB DDR4 RAM.
    Software : Fedora 34, vdr 2.4.7, softhddevice GIT, Kernel 5.15.11
    System 2: Hardware : Intel NUC10i5FNK, Intel Core i5-10210U (Comet Lake), DVB TechnoTrend TT-connect S2-4600 USB, 1x 1TB NVMe, 32 GB DDR4 RAM.
    Software : Fedora 35, vdr 2.4.7, softhdcuvid, Kernel 5.15.11

  • zork Ich habe deinen pull request akzeptiert. Ich habe nichts dagegen wenn du weitere Bereinigungen machst. Du solltest mich nur darauf hinweisen weil ich nicht immer im github schaue ob da etwas ansteht,


    Ich entwickle das plugin weiter und habe mal auf einem Raspi 4 getestet. Das hatte ich ja oben schonmal angedeutet. Mittlerweile läuft das plugin dort auch rudimentär. Nur leider unterstützt ffmpeg auf dem Raspi 4 noch nicht den hevc decoder und deswegen habe ich das erstmal beiseite gelegt und hoffe ffmpeg wird da noch etwas tun. Daneben habe ich untersucht wie ich HDR bei Intel aktivieren kann. Das scheint mir derzeit nur über die drm Ausgabe ohne X zu gehen. Da bastele ich gerade dran rum und versuche erst mal das drm plugin von Zille auf dem NUC zum laufen zu bringen. Da Intel HDR aber nur für Gen10 Grafiken eingebaut hat fürchte ich das ich dazu auch noch den Kernel patchen muss. Das bleibt spannend :) Zumindest soll YCrCb 420 aber auch mit Gen9 und LSPCON gehen. Das würde für HDR ja reichen.


    jojo61

  • Bei mir sieht das so aus:


    Code
    root@raspberrypi4:~# ffmpeg -hide_banner -decoders | grep hevc
     VFS..D hevc                 HEVC (High Efficiency Video Coding)
     V..... hevc_v4l2m2m         V4L2 mem2mem HEVC decoder wrapper (codec hevc)

    sieht nicht nach hardware decoding aus.


    Ich habe ein angepasstes kodi installiert, das funktioniert sehr gut.


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • jsffm Bei mir funktioniert hevc_v4l2m2m gar nicht. Zumindest decodiert er nichts. Ob das nun hardware decoding ist oder nicht ist mir erst mal egal.

    Kodi liefert ja m.E. mittlerweile sein eigenes ffmpeg mit. Da könnten anpassungen drin sein. Da habe ich aber noch nicht reingeschaut.

    Da ich für den Raspi wohl eh drm Ausgabe brauche werde ich erst mal daran weiterarbeiten.


    jojo61

  • Als ich mir den Pi4 gekauft habe, war ich mir bewusst, dass die Software Zeit braucht, bis sie damit umgehen kann. Die kodi-Anpassungen von ffmpeg werden sicherlich den Weg in den ffmpeg-Standard finden.


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • Ich habe mit softhdcuvid das Problem, daß ich beim Verschieben von Schnittmarken (Taste 4 bzw. 6) nur sehr langsam arbeiten kann, da es eine gefühlte Ewigkeit dauert, bis nach dem Verschieben das Bild zur neuen Position angezeigt wird.

    Das hatte ich mit softhddevice nicht. Kann man da etwas feintunen?

    Christian


    PS: auf diesem Wege vielen Dank für das Plugin!

  • Da bastele ich gerade dran rum und versuche erst mal das drm plugin von Zille auf dem NUC zum laufen zu bringen.

    softhddevice-drm läuft aktuell auf Raspi (Raspi 4 wohl nicht mehr) und Rockchip. Die Unterstützung von einem NUC ist aktuell nicht vorgesehen. Das Konzept ist das die Video Wiedergabe über DRM passiert ohne X-Server. Die Ausrichtung sind die ARM Devices.

  • softhddevice-drm läuft aktuell auf Raspi (Raspi 4 wohl nicht mehr) und Rockchip. Die Unterstützung von einem NUC ist aktuell nicht vorgesehen. Das Konzept ist das die Video Wiedergabe über DRM passiert ohne X-Server. Die Ausrichtung sind die ARM Devices.

    Das ist mir vollkommen klar das dein Plugin nicht für einen NUC gedacht ist. War auch keine Kritik an dem Plugin. Ich werde aber wohl eine drm Ausgabe für HDR am NUC brauchen und da ist dein Plugin eine prima Quelle für Infos wie es geht :)


    hopsi Ich schaue mir das mit den Schnittmarken mal an. Hast du die aktuelle Version ?

Jetzt mitmachen!

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