[softhddevice-drm]

  • Hallo zusammen,


    ich möchte an dieser Stelle einen Thread für einen neuen softhddevice Fork öffnen.

    Der Code liegt hier: https://github.com/zillevdr/vdr-plugin-softhddevice-drm

    Danke an zillerbaer , der das ganze umgesetzt hat.

    Diese Version gibt direkt über DRM/DRI aus und nutzt auch hardwarebasiertes Decoding über v4l2-request. Auch ein HW-Deinterlacer ist eingebaut.


    Notwendig sind:

    - FFmpeg mit v4l2-request Unterstützung (und evtl. Hardware Deinterlacer) z.B. von hier: https://github.com/jernejsk/FFmpeg/tree/deint-v2-prime

    - aktueller Kernel mit cedrus improvements patch


    Diese Version sollte auf allen Geräten laufen, die über DRM/DRI ausgeben. Die Decodierung übernimmt FFmpeg. Mit der ffmpeg-Version inkl. v4l2-request Unterstützung ist nun auch hardwarebasiertes Decodieren z.B. auf Allwinner SoCs möglich.


    Um evtl. mehr Leute dafür begeistern zu können, macht ein Forumsthread auf Dauer mehr Sinn als die ursrpünglichen PMs.


    ---


    Daher gleich wieder meine erste Frage an zille:

    Du hast mich auf die ffmpeg Version von https://github.com/jernejsk/LibreELEC.tv/tree/deint und den Kernel Patch https://github.com/LibreELEC/L…cedrus-improvements.patch verwiesen. Kann es sein, dass es daran liegt? Ich würde dann versuchen, die fehlenden Patches mitaufzunehmen - wobei das Grundgerüst ja schon drin ist.


    Danke und Gruß

    Andreas


    EDIT: Jetzt habe ich doch glatt übersehen, dass es doch schon mal einen Post zum Thema gab:

    [Tinkerboard] softhddevice-drm

    Da das Plugin aber weitereinwickelt wurde und nicht mehr nur fürs Tinkerboard läuft, würde ich vorschlagen, die Diskussion hier fortzusetzen, falls nichts dagegen spricht ...


  • Audio ist der Taktgeber. Nach der Audioclock werden die Bilder synchronisiert. Ich benutze eine USB-Soundkarte. Wie realisierst Du Audio? Hörst Du einen Ton? Passiert das bei SD oder HD Material? Gibt es eine Fehlermeldung?

    Aktuell gibt es Audio so richtig gar nicht. Ich habe bisher nur einen HDMI Monitor dran. Ich hatte cma und out-of-memory Fehler und jetzt CMA auf 256MB gesetzt. Damit sind die jetzt weg.


    Logs für Das Erste HD: https://pastebin.com/raw/7N0pabQY
    stderr: https://pastebin.com/raw/Yxr5yFYq



    Logs für Das Erste SD: https://pastebin.com/raw/E1DN65ub

    stderr: https://pastebin.com/raw/5KySf4Gx


    Sieht eigentlich vernünftig aus, oder? Vielleicht lags an der CMA Größe.

    Ich schau mir das mit dem Ton an, wenn ich wieder ans Gerät kann. Mit alsamixer kann ich jedenfalls auf "H3 Audio Codec" zugreifen, das sollte softhddevice dann auch ausgewählt haben!? Ich werde den Kernel für HDMI Audio patchen und sehen, wie es dann aussieht.


    Danke und Gruß

  • Mit alsamixer kann ich jedenfalls auf "H3 Audio Codec" zugreifen, das sollte softhddevice dann auch ausgewählt haben!?

    Ja, das device sollte default sein und wenn nix anderes in der commandline verlangt wird wird das benutzt. Im Log wird das default device geöffnet und konfiguriert ohne Fehler.


    Einen Fehler finde ich in den logs nicht. Schalt bitte mal AV_SYNC_DEBUG im Makefile ein.

  • Jede Menge FrameDuped Meldungen:

    https://pastebin.com/raw/kMCVKwfA

    Kann dir aber nicht sagen, was das Display anzeigt...


    Ich baue mir jetzt mal ein aktuelles ffmpeg mit Deinterlacer neu.


    BTW: Sollte https://github.com/zillevdr/vd…blob/drm/video_drm.c#L813 und https://github.com/zillevdr/vd…blob/drm/video_drm.c#L830 nicht (bzw. zusätzlich) FramesDropped und FramesDuped anzeigen?

  • Mmmh! Der Sound hängt hinterher! Das hab ich noch nie gesehen. Schalt mal bitte SOUND_DEBUG im Makefile ein.


    Was sagt "cat /sys/bus/cpu/devices/cpu0/cpufreq/cpuinfo_cur_freq"? Kannst Du eine USB-Soundkarte zum Test anstöpseln?

    BTW: Sollte https://github.com/zillevdr/vd…blob/drm/video_drm.c#L813 und https://github.com/zillevdr/vd…blob/drm/video_drm.c#L830 nicht (bzw. zusätzlich) FramesDropped und FramesDuped anzeigen?

    Ja, je nachdem ob das Bild zu spät (FramesDropped) oder zu früh (FramesDuped) im Vergleich zur AudioClock ist. Im Normalfall sollte nix von beiden zu sehen sein weil Audio und Video synchron abgespielt wird.


    Edit: Wenn das ein interlaced Video ist, ist es normal. Der HW Deinterlacer läuft noch nicht. Jedes Bild muss 2x angezeigt werden.

  • Also, Kontrolle vor Ort: Läuft!!

    SD und HD. Mit Ton und synchron, was ich aus dem Kurztest gesehen habe. Top Arbeit, zille!

    Kernel und ffmpeg nutze ich noch aus meinem ersten Post. Werde morgen den HW Deinterlacer testen. Dann noch Fernbedienung dran und ab ins Wohnzimmer. Endlich wieder vernünftiges Fernsehen in Sicht... Danke für deine Hilfe soweit.


    Gruß

    Andreas

  • Auch der HW Deinterlacer scheint zu laufen. Es gibt nur noch 0-3 FramesDuped Meldungen und bei interlaced Material werden hier auch deint frames angegeben.

    Den HW Deinterlacer musste ich hier noch aktivieren. ffmpeg von hier , 5.8er Kernel mit cedrus-improvements patch.

    Live hab ichs (noch) nicht gesehen, aber Fehler kommen auch keine :)


    Ich denke, ich schaue mir jetzt mal das OpenGL/ES OSD an ...


    Gruß

    Andreas

  • Auch der HW Deinterlacer scheint zu laufen.

    Kann eigentlich nicht sein. Bei meinen Tests habe ich hier nur ein rotes Bild. Mit LE auch. Das LE Image soll aber gut laufen. Ich denke das mein Board einen Treffer hat. HW Deinterlacing ist aktuell noch abgeschaltet. Ich will Dich bitten da das Kommentarzeichen zu entfernen und zu testen ob es funzt.


    Gruss

    zille

  • Kann eigentlich nicht sein. Bei meinen Tests habe ich hier nur ein rotes Bild.


    Mit LE auch. Das LE Image soll aber gut laufen. Ich denke das mein Board einen Treffer hat.


    Was angezeigt wird, sehe ich heute abend. Bin nur per Remote drauf, aber der Logs zeigen nichts Verdächtiges. Den Post im LE Forum habe ich schon gesehen. Melde mich wieder, wenn ich bestätigen kann, dass es wirklich läuft.

    HW Deinterlacing ist aktuell noch abgeschaltet. Ich will Dich bitten da das Kommentarzeichen zu entfernen und zu testen ob es funzt.

    Habe ich schon gemacht, siehe oben. Das Log zeigt auch an, dass der v4l2m2m deinterlacer greift.

    Gruß Andreas

  • Also hier läuft der Deinterlacer. Das Log zeigt mir das VideoFilterInit an und Bild wird flüssig und synchron dargestellt...

    Gruß Andreas

  • https://github.com/rellla/soft…englosd/tree/opiplus-gles


    Habe hier mal angefangen, den Code für GLES einzubauen. Kompiliert aber erstmal nur. Werde softhddevice versuchen anzupassen, damit zumindest mal EGL/GLES initiert wird.

    OSD per GL rendern sollte ich hinkriegen. Allerdings ist mir noch nicht klar, wie ich das Ergebnis am einfachsten und möglichst ohne memcpy auf das drm osd_plane bekomme. Vielleicht kann mir da jemand einen Tipp geben :)


    Gruß

    Andreas

  • So, ich denke, ich brauche Hilfe von jemanden, der sich mit drm auskennt.


    Hier https://github.com/rellla/soft…mits/opiplus-gles_surface liegt der aktuelle Code, der bisher folgendes machen sollte:

    - gbm device vom drm filehandle erstellen

    - OpenGL OSD Instanz erstellen

    - GL/EGL Context erstellen

    - gbm_surface und daraus EGLSurface erstellen

    - EGLSurface als Textur an einen GLES framebuffer binden

    - das OSD mit GLES zusammenbauen und am Ende auf den output framebuffer von oben rendern


    Mir fehlt jetzt in jedem Fall noch, das gbm_surface über atomic drm commits auf das entsprechende plane zu bringen. Ich weiß auch nicht, wann/ob man double buffering benötigt.


    zillerbaer Kannst du mir hier weiterhelfen, wo der richtige Ort ist, um das zu machen? in video_drm.c habe ich mal kommentierte Codezeilen eingefügt, wo es meiner Meinung nach hingehört, aber wahrscheinlich muss ich auch den buffer vorher richtig herrichten? In drm stecke ich einfach zu wenig drin...


    Bin für jeden Tip dankbar!


    Gruß

    Andreas


    PS: Testweise könnte ich ja mal das GLES-OSD in eine png-Datei rendern lassen, um zu sehen, ob die GLES Seite zumindest schonmal funktioniert....


    PPS: Bin mir nicht mehr ganz sicher, ob der Deinterlacer astrein läuft. Ich habe hier immer mal wieder VideoFilter Fehlermeldungen und dann verabschiedet sich der VDR. Aber das sehe ich mit später an.

  • http://imkreisrum.de/vdr/

    ... GLES funktioniert schonmal. Prinzipiell.

  • wann/ob man double buffering benötigt.

    Zwei Buffer werden eigentlich nur benötigt wenn bewegte Bilder in schneller Folge dargestellt werden sollen. Aktuell nutzt softhddevice-drm nur einen Buffer dazu.


    Mit GL habe ich noch nicht gearbeitet. Welche Methoden da zur Verfügung stehen in einen Framebuffer zu schreiben weiß ich nicht. Den Buffer lege ich da an und beschreibe den mit dem was vdr schickt und zeige das an. Vdr sagt dann wenn das OSD wieder geschlossen werden soll.


    Die PKG Config Sachen gehören m. E. im System eingestellt und nicht im Makefile. Die Pfade unterscheiden sich auch bei unterschiedlichen Distributionen.


    Das Verschieben bitte nicht. Die video.h wird von mmal und drm genutzt. Da soll auch nur das drin stehen was beide mit dem Rest verbindet.

    Ich habe hier immer mal wieder VideoFilter Fehlermeldungen

    Die Fehlermeldungen brauche ich. Ich habe kein funktionierendes H3 Board und kann das leider nicht testen.

  • Zwei Buffer werden eigentlich nur benötigt wenn bewegte Bilder in schneller Folge dargestellt werden sollen. Aktuell nutzt softhddevice-drm nur einen Buffer dazu.


    Mit GL habe ich noch nicht gearbeitet. Welche Methoden da zur Verfügung stehen in einen Framebuffer zu schreiben weiß ich nicht. Den Buffer lege ich da an und beschreibe den mit dem was vdr schickt und zeige das an. Vdr sagt dann wenn das OSD wieder geschlossen werden soll.

    Ok danke, GLES an sich funktioniert und das mit drm bekomme ich hin, denke ich. Brauch dafür nur mal ein bißchen freie Zeit am Stück.


    Quote

    Die PKG Config Sachen gehören m. E. im System eingestellt und nicht im Makefile. Die Pfade unterscheiden sich auch bei unterschiedlichen Distributionen.

    Ja kommt wieder raus. Aber deshalb ja WIP. Das ist aktuell einfacher für meine Build-Umgebung..

    Quote

    Das Verschieben bitte nicht. Die video.h wird von mmal und drm genutzt. Da soll auch nur das drin stehen was beide mit dem Rest verbindet.

    Ich beziehe mich in openglosd.cpp auf VideoRender/ _Drm_Render ... Daher dachte ich, ich schiebe das kurzerhand in eine Header-Datei, wo es m.E. auch hingehört. Aber wie gesagt, WIP. Ich wills einfach zuerst zum Laufen bringen, dann mache ich mich nochmal über den Code.

    Quote

    Die Fehlermeldungen brauche ich. Ich habe kein funktionierendes H3 Board und kann das leider nicht testen.

    https://pastebin.com/raw/e8Hw0hUp


    Ich hab ein bißchen hin- und hergeschalten, und das kommt dann nach einer Zeit. In den Fall RTL SD, also 576i ?

    Ich habe noch nicht geschaut, wie/ob ichs reproduzieren kann. Evtl. hilfts ja schon weiter.


    Gruß

    Andreas

  • Das sieht komisch aus:

    Code
    1. AlsaPlayer: ring buffer empty
    2. AlsaFlushBuffers: AlsaFlushBuffers
    3. AudioPlayHandlerThread: pthread_cond_wait
    4. dequeueing failed
    5. [deinterlace_v4l2m2m @ 0x728b00] no frame (field 0)
    6. FilterHandlerThread: ret -22 Das Argument ist ungültig
    7. FilterHandlerThread: width 0 height0

    Audiodaten sind nicht da und Videodaten auch nicht. Es gab aber kein PlayMode 0! Wo kommt das "dequeueing failed" her? Ich kann das in meinem Code nicht finden.

    Ich beziehe mich in openglosd.cpp auf VideoRender/ _Drm_Render

    Das sollte aber auch auf dem Raspi laufen. Da ist es besser wenn Du gleich auf VideoRender zugreifst. Wenn Du Inhalte aus VideoRender brauchst solltest Du eine Abfrage in video_xxx.c einbauen wie da.


    Gruss

    zille

  • Das sieht komisch aus:

    Code
    1. AlsaPlayer: ring buffer empty
    2. AlsaFlushBuffers: AlsaFlushBuffers
    3. AudioPlayHandlerThread: pthread_cond_wait
    4. dequeueing failed
    5. [deinterlace_v4l2m2m @ 0x728b00] no frame (field 0)
    6. FilterHandlerThread: ret -22 Das Argument ist ungültig
    7. FilterHandlerThread: width 0 height0

    Audiodaten sind nicht da und Videodaten auch nicht. Es gab aber kein PlayMode 0! Wo kommt das "dequeueing failed" her? Ich kann das in meinem Code nicht finden.

    Das kommt von FFMPEG

    Warum keine Daten da sind, weiß ich (noch) nicht. Unabhängig davon sollte es aber doch nicht gleich den ganzen VDR zerschießen...

    Möglicherweise liegt das Problem aber auch direkt bei ffmpeg.


    Gruß

    Andreas