1. Cookies optimieren die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklärst Du dich damit einverstanden, dass wir Cookies verwenden. Weitere Informationen
    Information ausblenden
  2. Willkommen im Forum von DIGITAL FERNSEHEN - dem führenden Portal für digitales Fernsehen, Medien und Entertainment. Wenn du hier neu bist, schau dich ruhig etwas um und melde dich an, um am Forengeschehen teilnehmen zu können.
    Information ausblenden

Wie berechnet sich die Checksumme der info.dvr?

Dieses Thema im Forum "SL HD" wurde erstellt von mgersi, 4. November 2009.

  1. mgersi

    mgersi Senior Member

    Registriert seit:
    26. November 2008
    Beiträge:
    310
    Zustimmungen:
    1
    Punkte für Erfolge:
    28
    Anzeige
    Weiss jemand wie die Checksumme der info.dvr berechnet wird? Nachdem der SL100HD in den Aufnahmen irgendwann die Untertitel und den Videotext vergisst, würde ich sie gerne über die info.dvr wieder aktivieren. Dies scheitert an der Checksumme der info.dvr. Wenn man ein Byte ändert, wird beim nächsten Verbinden der Festplatte mit dem Receiver diese Aufnahme gelöscht.

    Irgendwelche Ideen?
     
  2. dgor

    dgor Neuling

    Registriert seit:
    14. Oktober 2009
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    AW: Wie berechnet sich die Checksumme der info.dvr?

    Hi mgersi,

    ich habe mich mit diesem Thema auch schon ein bisschen beschäftigt. Durch eine kleine Debugsession ist es mir dann tatsächlich gelungen den Berechnungsalgorithmus zu verstehen. Es ist kein Standard-CRC-Algorithmus sondern es werden bestimmte Bereiche aufaddiert und anschließend Modulo mit einer Konstante verknüpft. Ich habe ein kleines Konsolenprogramm in Visual C++ geschrieben. Falls du dich mit C/C++ auskennst, kannst du dir ja mal den Source-Code anschauen bzw. falls du die Möglichkeit besitzt dein eigenes Programm zusammencompilieren. :D

    Code:
    
    #include "stdafx.h" 
     
    #include <fcntl.h> 
    #include <sys/types.h> 
    #include <sys/stat.h> 
    #include <io.h> 
    #include <stdio.h> 
     
    #include "test.h" 
    #ifdef _DEBUG 
    #define new DEBUG_NEW 
    #endif 
     
     
    // The one and only application object 
     
    CWinApp theApp; 
     
    using namespace std; 
     
    unsigned long CalcChecksum( unsigned char* buffer, unsigned long len, unsigned long seed ); 
     
     
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
    { 
        int nRetCode = 0; 
      int fh; 
      unsigned char buffer[0x8000]; 
      unsigned short len = 0x7FFC; 
      unsigned short count; 
      unsigned short seed = 1; 
      unsigned long chkSum; 
     
        // initialize MFC and print and error on failure 
        if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) 
        { 
            // TODO: change error code to suit your needs 
            _tprintf(_T("Fatal Error: MFC initialization failed\n")); 
            nRetCode = 1; 
        } 
        else 
        { 
            // TODO: code your application's behavior here. 
        if( argc != 2 ) 
        { 
          cout << "usage: CalcChecksum.exe drive:\\path\\info.dvr" << endl; 
          return 0; 
        } 
     
        fh = _open(argv[1], _O_RDONLY | _O_BINARY); 
        if( fh == -1 ) 
        { 
          cout << "Error opening file " << argv[1] << endl; 
        } 
        count = _read( fh, buffer, 0x8000 ); 
        if( count != 0x8000 ) 
        { 
          cout << "Error reading file " << argv[1] << endl; 
          return 0; 
        } 
        _close(fh); 
        chkSum = CalcChecksum( &buffer[0], len, seed ); 
        _ultoa( chkSum, (char*)&buffer[0], 16 ); 
        cout << "Checksum: 0x" << buffer << endl; 
      } 
     
        return nRetCode; 
    } 
     
     
    unsigned long CalcChecksum( unsigned char* buffer, unsigned long len, unsigned long seed ) 
    { 
      unsigned char nrOfSegments; 
      unsigned long regECX = seed; 
      unsigned long regEDX = 0; 
      unsigned long regEDI = 0; 
      unsigned long retVal; 
     
     
      nrOfSegments = len / 0x15b0; 
     
      for( unsigned short i = 0; i < nrOfSegments; i++ ) 
      { 
        for( unsigned short j = 0; j < 0x15b0; j++ ) 
        { 
          regEDX = buffer[i*0x15b0+j]; 
          regECX += regEDX; 
          regEDI += regECX; 
        } 
        regECX = regECX % 0xFFF1; 
        regEDI = regEDI % 0xFFF1; 
      } 
     
      for( i = (nrOfSegments*0x15b0); i < len; i++ ) 
      { 
          regEDX = buffer[i]; 
          regECX += regEDX; 
          regEDI += regECX; 
      } 
      regECX = regECX % 0xFFF1; 
      regEDI = regEDI % 0xFFF1; 
     
      retVal = (regEDI << 16) | regECX; 
      return( retVal ); 
     
    } 
    
    
     
  3. mgersi

    mgersi Senior Member

    Registriert seit:
    26. November 2008
    Beiträge:
    310
    Zustimmungen:
    1
    Punkte für Erfolge:
    28
    AW: Wie berechnet sich die Checksumme der info.dvr?

    das ist ja prompte Bedienung, danke. Kannst Du mir die CalcChecksum.exe zur Verfügung stellen (Hab keinen Compiler)?

     
  4. dgor

    dgor Neuling

    Registriert seit:
    14. Oktober 2009
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    AW: Wie berechnet sich die Checksumme der info.dvr?

    Hi mgersi,

    wie du an der Anzahl meiner geposteten Beiträge siehst, bin ich noch neu hier (mitlesen tue ich allerdings schon seit ca. August 2009). Wie kann ich dir denn die Datei zur Verfügung stellen?
     
  5. mgersi

    mgersi Senior Member

    Registriert seit:
    26. November 2008
    Beiträge:
    310
    Zustimmungen:
    1
    Punkte für Erfolge:
    28
    AW: Wie berechnet sich die Checksumme der info.dvr?

    Hallo dgor,

    Du hast eine PN=Private Nachricht

    Grüße
     
  6. Ijon Tichy

    Ijon Tichy Gold Member

    Registriert seit:
    23. Januar 2007
    Beiträge:
    1.172
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    AW: Wie berechnet sich die Checksumme der info.dvr?

    Ist etwas bei den Versuchen herausgekommen?
    Wenn ja - ich bin auch sehr interessiert, ältere Aufnahmen mit Untertiteln anzuschauen.
     
  7. dgor

    dgor Neuling

    Registriert seit:
    14. Oktober 2009
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    AW: Wie berechnet sich die Checksumme der info.dvr?

    @mgersi konntest du schon was bzgl. der Untertitel-/Videotextproblematik in Erfahrung bringen? Gruß dgor
     
  8. mgersi

    mgersi Senior Member

    Registriert seit:
    26. November 2008
    Beiträge:
    310
    Zustimmungen:
    1
    Punkte für Erfolge:
    28
    AW: Wie berechnet sich die Checksumme der info.dvr?

    Die ganze Analyse ist noch wacklig.

    Der Videotext verschwindet vor den Untertiteln. Und bei gleichem Inhalt der info.dvr funktioniert er mal und mal nicht.

    Ein Reboot mit eingestecktem USB Device sorgt meist dafür dass der Videotext weg ist. :-(

    Position 0x148 bestimmt die Reihenfolge der Anzeige der Aufnahmen im Record Manager. Die oberste Aufnahme hat den Wert 0x2, die nächste 0x3 usw.

    3FF4 und 3FF8 beinhaltet die Position an der die Wiedergabe gestoppt wurde.

    2BA8 hat mit den Untertitel zu tun. 0 keine Ut, 1 mit Ut
    2BAA hat mit den Untertitel zu tun. 0 keine Ut, 1 mit Ut

    ZDF Untertitel konnte ich bei einer Testdatei mit 2BA8=1 und 2BAA=1 wiederbeleben.


    Dein Programm funktioniert super. Die errechnete Checksumme hat er bisher immer akzeptiert. Hattest Du bei Deinen Analysen etwas bzgl VT und UT rausgefunden?
     
  9. dgor

    dgor Neuling

    Registriert seit:
    14. Oktober 2009
    Beiträge:
    8
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    AW: Wie berechnet sich die Checksumme der info.dvr?

    Hallo mgersi,

    deine Angaben decken sich mit meinen Beobachtungen. Folgende Angaben könnten meiner Ansicht nach noch weiter eingegrenzt werden:

    0x2BA8: 0 keine UT, 1 mit UT
    0x2BAA: 0 kein VTX, 1 mit VTX

    Des weiteren habe ich noch folgendes festgestellt:
    Ab der FW-Version Exx wird bei aktiviertem Timeshift eine eigene Datei in dem Ordner ALIDVRS2 für die TS-Daten angelegt (diese ist im Aufnahme-Manager nicht sichtbar). Bei deaktivierten TS werden nach einem Reboot evtl. vorhandenen TS-Dateien automatisch gelöscht. Diese Dateien sind anscheinend für die Anzeige von aufgezeichnetem VTX unerlässlich (warum auch immer :eek:). Falls du bei deinen Versuchen den TS deaktiviert hattest, würde dies genau das Verhalten des nicht angezeigten VTX beschreiben. Ich hatte bei meinen Versuchen dann den TS aktiviert und konnte dann in Abhängigkeit des Flags 0x2BAA den aufgezeichneten VTX anzeigen.

    Bei den aufgezeichneten UT scheint diese Abhängigkeit nicht zu bestehen (bei vorhanden UT und gesetzten Flag 0x2BA8 werden diese auch angezeigt).

    Dieses Verhalten habe ich bei der FW-Version E64 beobachtet. Wie es sich bei der alten FW-Version E178 verhält, muss ich noch testen.

    Könntest du bitte prüfen, ob du diese Abhängigkeit zwischen TS und VTX ebenfalls beobachten kannst?

    Gruß dgor
     
    Zuletzt bearbeitet: 23. November 2009
  10. Ijon Tichy

    Ijon Tichy Gold Member

    Registriert seit:
    23. Januar 2007
    Beiträge:
    1.172
    Zustimmungen:
    0
    Punkte für Erfolge:
    36
    AW: Wie berechnet sich die Checksumme der info.dvr?

    Frage eines Laien: Wie kann ich die info.dvr-Datei öffnen, dieses Flag setzen, und dann wieder so speichern, dass der Receiver die Untertitel anzeigt?
    Ich würde auch gern die Früchte eurer Arbeit genießen.