Integer Overflow in iService getLength()

  • Hi,


    ich nehme immer mal wieder sehr lange Sendungen auf, welche dann im Anschluss immer fehlerhaft in der Filmliste dargestellt wurden:


    Man beachte die anzeige von -331:30 Minuten.



    Das Problem tritt schon lange auf und heute bin ich mal der Ursache auf den Grund gegangen:

    in der .ts.meta steht für die Aufnahmelänge ebenfalls ein negativer Wert, z.B.:

    Code: 20191110 1850 - Pro7 MAXX - ran Football_ 10_ Spieltag NFL (Spiel 1).ts.meta
    1. 1:0:1:306:C003:F101:FFFF0000:0:0:0:
    2. ran Football: 10. Spieltag NFL (Spiel 1)
    3. ran Football: 10. Spieltag NFL (Spiel 1) Sport, D 2019 Altersfreigabe: ab 12
    4. 1573408200
    5. -1784788096
    6. 16600502272
    7. f:0,c:0005ff,c:020025,c:0305ff,c:100000,c:110600


    Wenn ich den negativen Wert auf den korrekten Wert setze (z.B. 4212000000 für 13 Stunden Aufnahme), wird in der Filmliste dennoch nur 6:37:40 h angezeigt.



    Umgerechnet auf den "meta-Wert" ergibt das 2148300000, also knapp über dem Maximalwert für 32-Bit Signed Integer (https://en.wikipedia.org/wiki/2,147,483,647#In_computing).

    Ich habe mich dann auf die Suche begeben, wo die Länge berechnet wird. Erwartungsgemäß findet das im C++ Code statt, genauer gesagt liegt das Problem vermutlich in der Funktion getLength() der entsprechenden iService Klassen (http://git.opendreambox.org/?p…ervice/iservice.h;hb=HEAD), da hier nur int als Rückgabewert gegeben ist.


    Ghost , Reichi : Könnte man hier die Datenwerte entsprechend vergrößern? Ich weiß, dass Aufnahmen > 6,5 Stunden eher selten sind, aber sie kommen nunmal vor :)

    so long
    m0rphU

  • Ich vermute das dürfte sehr viel schwieriger werden. Den Längen Berechnungen dürfte etwas wie die 90 kHz 33-Bit Timer PCR/PTS/DTS zugrunde liegen. Manchmal gibt es Sprünge, keine einfachen Überläufe, in diesen Werten. Diese sind nur aufwendiger zu berücksichtigen.