Video Treiber für Odroid-N2+ (softhdodroid)

  • Ich sehe, dass Du in ProcessBuffer die Auskommentierung des SetCurrentPCR wieder rausgenommen hast. Was soll das bringen? Ohne FastSwitch erfolgt der Aufruf bereits in AudioEnque und mit FastSwitch wird ohnehin unmittelbar darauf über ProcessClockBuffer eine andere PTS gesetzt.

    Mein subjektiver Eindruck ist, dass zumindest bei aktiviertem FastSwitch das Umschalten nun wieder einen Tick langsamer geworden ist.

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • jojo61 Es tut mir leid, wenn ich wieder Wasser in den Wein gießen muss. Aber mit den letzten beiden Commits ist das Plugin unter meiner SK1 nicht mehr benutzbar. Es gibt ein ruckelndes Bild, so, als liege der TV auf 60 Hz. Ich bin wieder auf 16adc5385e475d90720bdcda1a4bf92e9910a0af und alles ist OK.

  • Der erste commit enthält an 3 Stellen Änderungen, die nicht von mir stammen. Die enthalten alle eingangs eine Abfrage auf

    Code
    myKernel == 5 && myMajor == 4

    Was ist, wenn Du die versuchsweise auskommentierst bzw. den ursprünglichen Code an der Stelle wieder verwendest? Die ersten beiden Stellen betreffen sogar nur HEVC. Ich tippe auf die dritte Stelle mit dem AMSTREAM_IOC_TSTAMP_uS64.

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • jojo61 Ich erhalte leider häufige crashes beim DETA des Plugins:


    Thread 27 "device 1 receiv" received signal SIGSEGV, Segmentation fault.

    [Switching to Thread 0x7fea45f0a0 (LWP 1872)]

    0x0000007ff53c3978 in InternalClose (pip=0) at video.c:2984

    2984 OdroidDecoders[pip]->handle = -1;


    Mit dem BT:


    Thread 27 "device 1 receiv" received signal SIGSEGV, Segmentation fault.

    [Switching to Thread 0x7fea45f0a0 (LWP 1872)]

    0x0000007ff53c3978 in InternalClose (pip=0) at video.c:2984

    2984 OdroidDecoders[pip]->handle = -1;

    (gdb) bt

    #0 0x0000007ff53c3978 in InternalClose (pip=0) at video.c:2984

    #1 InternalClose (pip=<optimized out>) at video.c:2952

    #2 0x0000007ff53c4130 in amlReset () at video.c:2946

    #3 amlReset () at video.c:2929

    #4 0x0000007ff53c72d8 in VideoPollInput (stream=0x7ff739b780 <MyVideoStream>) at softhddev.c:1839

    #5 0x0000007ff53c2010 in OdroidDisplayHandlerThread () at video.c:1461

    #6 0x0000007ff53c20a0 in VideoDisplayHandlerThread (dummy=<optimized out>) at video.c:1494

    #7 0x0000007ff79cd5c8 in start_thread (arg=0x0) at ./nptl/pthread_create.c:442

    #8 0x0000007ff7a35edc in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:79


    Wenn ich das dann auskommentiere, crashed es an einer anderen Stelle. Kann es sein, dass es hier ein Problem mit PIP gibt und kann ich das prinzipiell ausschalten?

  • Tja das ist die Folge davon das Dr. Seltsam wollte das ich beim Suspend und Deta den DisplayThread nicht sauber runterfahre.

    Du kannst mal in video.c in Zeile 1024 den "if (SuspendMode == 0)" deaktivieren. Damit das VideoThreadExit() immer aufgerufen wird.

    Also in Zeile 1024 und Zeile 1027 jeweil ein // an den Anfang. Und gibt mir Feedback ob es dann klappt.

  • Leider hilft das nicht. Beim ersten DETA geht es noch gut. Nach einem ATTA kommt kein Bild und nach einem weiteren DETA das:


    .Internal Close pip 0 mit Handle -1

    [Thread 0x7fc51490a0 (LWP 8670) exited]

    [Thread 0x7fad7af0a0 (LWP 8669) exited]

    [New Thread 0x7fad7af0a0 (LWP 8690)]

    [New Thread 0x7fc51490a0 (LWP 8691)]

    [New Thread 0x7fe9c4f0a0 (LWP 8693)]

    [Thread 0x7fc51490a0 (LWP 8691) exited]

    [Thread 0x7fad7af0a0 (LWP 8690) exited]

    [New Thread 0x7fad7af0a0 (LWP 8697)]

    [New Thread 0x7fc51490a0 (LWP 8698)]

    [Thread 0x7fe9c4f0a0 (LWP 8693) exited]

    [Thread 0x7feac6f0a0 (LWP 8673) exited]

    [Thread 0x7fb6ffe0a0 (LWP 8672) exited]

    close handle failed PIP 0

    [Thread 0x7fc51490a0 (LWP 8698) exited]

    [Thread 0x7fad7af0a0 (LWP 8697) exited]


    Thread 27 "device 1 receiv" received signal SIGSEGV, Segmentation fault.

    [Switching to Thread 0x7fea45f0a0 (LWP 8674)]

    0x0000007ff53c3978 in InternalClose (pip=0) at video.c:2984

    2984 OdroidDecoders[pip]->handle = -1;

    (gdb) bt

    #0 0x0000007ff53c3978 in InternalClose (pip=0) at video.c:2984

    #1 InternalClose (pip=<optimized out>) at video.c:2952

    #2 0x0000007ff53c4120 in amlReset () at video.c:2946

    #3 amlReset () at video.c:2929

    #4 0x0000007ff53c72c8 in VideoPollInput (stream=0x7ff739b780 <MyVideoStream>) at softhddev.c:1839

    #5 0x0000007ff53c2010 in OdroidDisplayHandlerThread () at video.c:1461

    #6 0x0000007ff53c20a0 in VideoDisplayHandlerThread (dummy=<optimized out>) at video.c:1494

    #7 0x0000007ff79cd5c8 in start_thread (arg=0x0) at ./nptl/pthread_create.c:442

    #8 0x0000007ff7a35edc in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:79

  • Tritt das nur bei DETA/ATTA aus der softoggle heraus auf (Wechsel zu Kodi und zurück) oder auch wenn Du die svdrp-Befehle in chroot auf der Konsole ausführst?

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • Mit einem sleep von 2 wird es besser. Es geht dann 5 mal gut, und dann verabschiedet sich das Plugin so:


    close handle failed PIP 0


    Thread 42 "device 1 receiv" received signal SIGSEGV, Segmentation fault.

    [Switching to Thread 0x7fe943f0a0 (LWP 11485)]

    0x0000007ff53c3978 in InternalClose (pip=0) at video.c:2984

    2984 OdroidDecoders[pip]->handle = -1;

    (gdb) bt

    #0 0x0000007ff53c3978 in InternalClose (pip=0) at video.c:2984

    #1 InternalClose (pip=<optimized out>) at video.c:2952

    #2 0x0000007ff53c4120 in amlReset () at video.c:2946

    #3 amlReset () at video.c:2929

    #4 0x0000007ff53c72c8 in VideoPollInput (stream=0x7ff739b780 <MyVideoStream>) at softhddev.c:1839

    #5 0x0000007ff53c2010 in OdroidDisplayHandlerThread () at video.c:1461

    #6 0x0000007ff53c20a0 in VideoDisplayHandlerThread (dummy=<optimized out>) at video.c:1494

    #7 0x0000007ff79cd5c8 in start_thread (arg=0x0) at ./nptl/pthread_create.c:442

    #8 0x0000007ff7a35edc in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:79


    Den Text habe ich nicht im Log und ich teste nur VDR mit softhdodroid (keine anderen Plugins) und DETA/ATTA vom Terminal aus (Ugoos SK1, Kernel 5.4).

  • Es ist immer die gleiche Stelle. Das Problem scheint mir zu sein das der close zu lange dauert und der übergeordnete Thread dann schon beendet ist. Dann crasht es beim nächsten Speicherzugriff. Durch den sleep wird es zwar etwas entspannt aber halt nicht sauber. Warum das aber so lange dauert müsste man mal analysieren.

  • Kann man das PIP irgendwie einfach deaktivieren? Wenn ich aus


    void InternalClose(int pip)


    direkt mit einem return; rausgehe, crashed nichts mehr (allerdings habe ich dann auch kein Bild mehr beim ATTA und den Hinweis


    AmlCodec open failed.

  • Wenn InternalClose mit Parameter pip=0 aufgerufen wird, ist es kein pip!

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • Verschieb doch mal

    Code
    if (!pip) {
            isOpen = false;
    }

    über

    Code
    OdroidDecoders[pip]->handle = -1;

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • close handle failed PIP 0

    Ergänze doch in void InternalClose beim Schließen des devices für den Rückgabewert mal die Ausgabe einer Fehler-Nr. im printf:


    Code
            if (r < 0)
            {
                    //codecMutex.Unlock();
                    printf("close handle failed PIP %d, errno=%d\n.",pip, errno);
                    return;
            }

    VDR1: ACT-620, Asus P8B75-M LX, Intel Core i3-3240, 4 GB DDR3 RAM 1600 MHz, passive Geforce GT1030 von MSI, Sandisk 2TB SSD, 2xWinTV DualHD, Atric-IR-Einschalter. SW: Xubuntu 20.04 auf 64GB Sandisk SSD.

    VDR2: Odroid N2+ mit CoreELEC und Ubuntu in chroot, WinTV DualHD

    VDR3: Tanix TX3 mit CoreELEC und Ubuntu in chroot, WinTV DualHD

  • jojo61: Ich habe eine quick&dirty-Lösung.


    Ich habe mir Absturz für Absturz vorgenommen und dabei erst einmal pip auskommentiert, wo es gestört hat.

    Einige Variablen waren nicht static und könnten sich damit prinzipiell im Kontext ändern. Die habe ich static gemacht. Dann gab es einige Pointer, die NULL (0x0) waren (warum auch immer, jojo61 , das müsstest Du mal schauen). Den sleep(1) konnte ich komplett entfernen, ohne dass es weitere Probleme gibt, DETA ist damit deutlich schneller geworden. Die geänderte video.c hänge ich unten an. Vielleicht hilft es Dir ja, Jojo, wenn Du morgen suchst. Ich habe VDR mit softhdodroid dann im Debugger laufen lassen und in einer anderen shell mit einer for-Schleife DETA/ATTA gemacht, ohne dass jetzt irgendetwas crasht.


    Ich durchblicke die PIP-Struktur noch nicht so ganz, aber hoffe, dass die Datei hilft. Vielleicht erklärt das ja auch die Probleme mit externalplayer/Wechsel zu KODI per commands.conf, die einige hier hatten.


    LG,

    Rudi


    video.c.zip

  • jojo61 Ich denke, die Programmierung ist nicht Threadsafe, daher gibt es race-conditions. Hier der neue BT:


    close handle failed PIP 0


    Thread 32 "device 1 receiv" received signal SIGSEGV, Segmentation fault.

    [Switching to Thread 0x7fe9c4f0a0 (LWP 4284)]

    0x0000007ff53c4b54 in InternalClose (pip=0) at video.c:2982

    2982 OdroidDecoders[pip]->handle = -1;

    (gdb) bt

    #0 0x0000007ff53c4b54 in InternalClose (pip=0) at video.c:2982

    #1 InternalClose (pip=<optimized out>) at video.c:2950

    #2 0x0000007ff53c4f94 in amlReset () at video.c:2944

    #3 amlReset () at video.c:2927

    #4 0x0000007ff53c8128 in VideoPollInput (stream=0x7ff739c790 <MyVideoStream>) at softhddev.c:1839

    #5 0x0000007ff53c2efc in OdroidDisplayHandlerThread () at video.c:1459

    #6 0x0000007ff53c2f90 in VideoDisplayHandlerThread (dummy=<optimized out>) at video.c:1492

    #7 0x0000007ff79cd5c8 in start_thread (arg=0x0) at ./nptl/pthread_create.c:442

    #8 0x0000007ff7a35edc in thread_start () at ../sysdeps/unix/sysv/linux/aarch64/clone.S:79



    Es crasht immer noch an derselben Stelle, weil der OdroidDecoders-Pointer Null ist. Wahrscheinlich müsstest Du die einzelnen Threads locken und erst nacheinander freigeben oder die Pointer auf 0x0 abfragen, bevor Du das handle setzt. Das ist aber nicht die einzige Stelle, bei der das Problem auftritt.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!