Beiträge von wirbel

    Hi,


    in dem Fork fehlen noch die Änderungen, die nach dem 30.Mai 2021 in rofafor/master kamen.

    Die müssen noch per Hand nachgepflegt werden, weil sie mit anderen Änderungen kollidieren. Für die Anwendung in w_scan_cpp hatten die keinen Vorteil, als stand-alone Plugin vielleicht.


    Die Meldung besagt, dass die SDT eines anderen (wohl des vorherigen) Transponders empfangen wird und etwas beim Umschalten geklemmt hat.

    Klingt nach Astra 19.2 von den IDs her.

    #1 0x00007f9fe0041176 __GI_raise (libc.so.6 + 0x41176)

    #2 0x00007f9fe0028917 __GI_abort (libc.so.6 + 0x28917)


    heißt aber AFAIK, dass das geplant aborted wurde, also dass ggf. das kaputt ist, was in den vasprintf gesteckt wurde.

    in vasprintf wird malloc aufgerufen, soll ja ein neuer const char* zurück gegeben werden. malloc versucht sich ein neues Häppchen Speicher aus dem tcache zu holen (sind ja nur wenige bytes), aber stolpert dabei und printet einen Fehler + ruft wohl abort() aus stdlib.h auf.

    Die PIDs in der xspf sind service ID, Audiio, Video und die normalen DVB SI tables.


    So wie es ausschaut, hat tvheadend Probleme beim Transcodieren (nicht genug CPU power dort?) oder Verpacken des Streams, deswegen bekommst du wohl die Daten häppchenweise.

    SHF: Genau die gleiche Idee. Die macros machen auch nicht viel anderes.


    Wollen wir mit deinem oder meinem Patch weitermachen?

    Mir egal, Hauptsache gleicher Code und es ist absolut sicher, dass der Lock aus dem Spiel ist.


    @Zeilennummern, ich nutze einen online c++ demangler zur Lesbarkeit und hangele mich dann Zeile für Zeile durch den code, beginnend ab der ersten im Core. Setzt voraus, dass man *genau* den code hat, vdr und plugin.

    habe ich die channels.conf per w_scan_cpp erzeugt und er hat auch den einen von mir erzeugten Kanal im channels.conf Format ausgegeben:
    HDMI:114000:I0C0M256:C:6900:256=36:257=@15:0:0:1:0:1:0
    Frage: passt das? Frequenz stimmt schonmal, bei den restlichen xPIDs bin ich mir nicht sicher.

    Das bedeutet, dass das satip Plugin auf dem Computer auf dem du w_scan_cpp ausgeführt hast, ebenso erfolgreich funktioniert hat.

    w_scan_cpp nutzt intern das satip Plugin.


    Ich glaube, wenn das funktioniert, dann ist diese config auf der VDR Seite für das satip Plugin ok. Zumindest hast du Empfang und die DVB SI Tables kommen an.

    Der Stream meldet sich H.265 mit Audio ISO/IEC 13818-7 Audio with ADTS transport.

    Es knallt immer wieder in vnsiclient.c:1148 und den Zeilen danach, kurioserweise immer wieder


    cVNSIClient::processCHANNELS_GetChannels(), dann cChannel::Name(), dann cString::sprintf(), in cString::sprintf() wird vasprintf() aufgerufen, dann schafft es vielleicht nocht die Fehlermeldung ins log, bevor der Prozess beendet wird. Das sind dann die Zeilen im for loop in


    Code
    cVNSIClient::processCHANNELS_GetChannels


    Auffällig ist auch, dass zwei threads in der gleichen Funktion cVNSIClient::processCHANNELS_GetChannels sind.

    @warnings:


    Code
    streamer.c:57:17: warning: member ‘cLiveStreamer::m_Event’ is used uninitialized [-Wuninitialized]
    57 |  , m_VideoInput(m_Event)
    |                 ^~~~~~~

    Der Constructor von m_VideoInput wird mit dem lokalen class member m_Event aufgerufen,

    aber m_Event ist selbst noch nicht sicher erzeugt. Deswegen erst den m_Event constructor aufrufen und _dann_ den Constructor von m_VideoInput.

    Falsche Reihenfolge.


    g++ hat recht.





    Hier wird für jeden member von (*whitelist) eine lokale Kopie innerhalb des for loop angelegt.

    Das kostet Speicher und seeeehr viel Zeit, und hofft darauf, dass die Kopie wirklich alle Daten kopiert, etc.


    Code
    channelfilter.c: In member function ‘void cVNSIChannelFilter::StoreWhitelist(bool)’:
    channelfilter.c:188:23: warning: loop variable ‘i’ creates a copy from type ‘const cVNSIProvider’ [-Wrange-loop-construct]
    188 |       for (const auto i : *whitelist)
    |                       ^
    channelfilter.c:188:23: note: use reference type to prevent copying
    188 |       for (const auto i : *whitelist)
    |                       ^
    |                       &




    videoinput.c:468ff


    Hier gibt es gleichzeitig mehrere Probleme.

    Zum einen wird von jedem member von sPool (seehr laaangsam) eine lokale Kopie im Geltungsbereich des for loop angelegt.

    Das alleine garantiert nicht, dass in der Zwischenzeit aber nicht der 'echte' cDummyReceiver nicht zerstört wurde -> race.

    Und zusätzlich könnte auch der shared pointer dabei sein zerstört zu werden 'expired'. Aber selbst wenn nicht, kann ja 'recv' immer noch ein NULL pointer sein.


    Eigentlich haben die gcc Entwickler wirklich gute Arbeit geleistet.

    Code rausgefischt mit Warnungen, der schwer zu lesen ist..


    Code
    inlined from ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’ at videoinput.c:469:28:
    /usr/include/c++/13/bits/atomic_base.h:505:31: warning: ‘unsigned char __atomic_load_1(const volatile void*, int)’ writing 1 byte into a region of size 0 overflows the destination [-Wstringop-overflow=]
    505 |         return __atomic_load_n(&_M_i, int(__m));
    |                ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~
    In static member function ‘static std::shared_ptr<cDummyReceiver> cDummyReceiver::Create(cDevice*)’:
    cc1plus: note: destination object is likely at address zero

    Wunderbar!

    Ich frage mich jedesmal, welchen Lack damals die C/C++ Entwickler gesoffen haben, als sie float<->string(char*) konversationen von der lokalen Sprache abhängig machten.



    Ich würde allerdings diese Art von Stolperstellen gerne an einer zentralen Stelle in librepfunc bündeln,

    damit ich nicht immer wieder darüber stolpere.


    Ich schau mir das an und würde dich eventuell nach Tests oder Änderungen fragen.

    Eine Möglichkeit wäre


    w_scan_cpp -fc --satip > channels.conf


    Aber das wird nur dann funktionieren, wenn tvheadend sich wie ein normaler SAT>IP server verhält.


    Die zweite Möglichkeit wäre, einfach einen bekannten Kanal in die channels.conf per Hand einzutragen, mindestens müssen Frequenz, Symbolrate und Modulation stimmen. PIDs sind egal.