VDR version 2.7.5 freigegeben

  • Jedes cRecording-Objekt hat ja auch ein cRecordingInfo-Objekt, sollte man dann nicht einfach immer auf cRecordingInfo::FramesPerSecond() zugreifen anstatt die Variable nochmals mitzuführen?

    Das hat leider nichts gebracht - cRecorder und cRecording haben jeweils ein eigenes cRecordingInfo-Objekt und cRecordings soll das Info-File neu einlesen wenn es aktualisiert wurde. Bleibt die Frage warum das (manchmal) nicht funktioniert :(

  • Hier mal ein Patch, der das doppelte Speichern von priority, lifetime und framesPerSecond entfernt.

    Das ist auf jeden Fall schon mal sinnvoll, denn eine Information, die an zwei Stellen gespeichert ist, wird früher oder später an mindestens einer Stelle falsch sein ;-).

    Ob das den eigentlichen Fehler auch behebt, muss sich erst noch zeigen...

  • Da geht Dein Patch weiter als meine Änderungen ;) Ich hatte nur framesPerSecond verlagert, aber bei beiden Varianten tritt das Phänomen noch auf.
    Ich habe es jetzt soweit debugged, dass im Fehlerfall zwar die richtigen Werte erzeugt werden, aber das recordingInfo->Write() in cRecorder::Action() später erfolgt als das cRecordingInfo::Read(FILE f) und somit dort nur der Defaultwert 'F 25' drin steht.

  • FireFly Der Ablauf ist aber doch

    Code
                          recordingInfo->Write(); 
                          LOCK_RECORDINGS_WRITE; 
                          Recordings->UpdateByName(recordingName); 

    Kann es vielleicht sein, dass st.st_mtime in cRecordingInfo::Read(FILE *f) noch den "alten" Timestamp liefert?

    Kannst du mal diesen Patch ausprobieren? (nur compiliert, nicht getestet)

  • Auf die Schnelle habe ich jetzt einfach mal den Check auskommentiert:

    Code
      if (ownEvent) {
         struct stat st;
         if (fstat(fileno(f), &st))
            return false;
         //if (modified == st.st_mtime)
         //   return true;
         if (modified) {

    ... und konnte das Problem damit nicht mehr nachstellen. Morgen test ich dann Deinen Patch (der dann ja auch funktionieren müsste) und lasse mir auch nochmal die mtime ausgeben

  • Auf die Schnelle habe ich jetzt einfach mal den Check auskommentiert:

    Ich hatte Klaus diesen Check ja vorgeschlagen, weil damit das Neueinlesen einer umfangreichen Filmsammlung per touch .update deutlich schneller geht. Die Metadaten liegen oft noch im Cache des Dateisystems, sodass der Check schnell vonstatten geht, wohingegen das unspezifische Einlesen der Info-Dateien die Platte ganz schön rattern lässt. Insofern würde ich nur ungern auf den Check verzichten, zumal mir solche Effekte mit doppelt langen Zeitangaben schon seit einigen VDR-Versionen nicht mehr aufgefallen sind. Und ich habe diesen Check schon seit Jahren lokal bei mir drin…

    Ich habe es jetzt soweit debugged, dass im Fehlerfall zwar die richtigen Werte erzeugt werden, aber das recordingInfo->Write() in cRecorder::Action() später erfolgt als das cRecordingInfo::Read(FILE f) und somit dort nur der Defaultwert 'F 25' drin steht.

    Müsste man dann nach einem Write() nicht das Neueinlesen explizit triggern? Ohne dass ich ihm mir en detail angesehen habe, macht der Patch von Klaus vermutlich genau das.

    Im Cutter habe ich auch zwei Aufrufe von recordingInfo->Write() gefunden. Müsste man dort nicht auch die Info-Datei neu einlesen?

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.4 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Wenn man sich die Zeit ausgeben lässt

    Code
    bool cRecordingInfo::Read(FILE *f)
    {
      if (ownEvent) {
         struct stat st;
         if (fstat(fileno(f), &st))
            return false;
    +     if (modified)
    +        isyslog("Read(FILE) mtime: %ld - %ld = %ld", st.st_mtime, modified, st.st_mtime - modified);
         if (modified == st.st_mtime)
            return true;

    dann wird es klar warum framesPerSecond nicht aktualisiert wird:

    Das time_t modified ist nur sekundengenau, so dass manchmal schon die nächste Sekunde angebrochen ist, aber oft auch nicht und dann die info-Datei nicht neu eingelesen wird.
    st_mtime ist lt. man 3type stat nur ein Alias für die Sekunden: #define st_mtime  st_mtim.tv_sec, man könnte auf struct timespec  st_mtim umstellen, muss dann aber das struct timespec umständlich vergleichen.
    Da ist der Patch mit Force die einfachere und sichere Alternative und mein nächster Test.

  • Ich finde, beides ergänzt sich doch recht gut:

    • Aufruf per Force, wenn der VDR das nach internen Aktionen für einzelne Dateien benötigt.
    • Check per st_mtime, wenn alle Aufzeichnungen neu eingelesen werden sollen.

    Ich hatte den ersten Fall damals gar nicht auf dem Radarschirm. Danke, dass du das Ganze so detailliert untersucht hat. :thumbup:

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.4 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • kls Mit dem Force-Patch funktioniert es wie erwartet: :):thumbup:

    Insofern würde ich nur ungern auf den Check verzichten,

    Ich auch, warum sollte man Daten nochmal einlesen, die schon vorhanden sind? Aber das time_t modified ist mit der Auflösung von einer Sekunde zu ungenau, weshalb man das Einlesen in manchen Situation erzwingen muss. Beim Anzeigen der Recording Errors, die auch von cRecorder über die Info-Datei an die Liste der Aufnahmen übergeben werden, sollte die Genauigkeit aber reichen so dass dort kein Force notwendig ist.

    Müsste man dann nach einem Write() nicht das Neueinlesen explizit triggern?

    Das wurde ja schon gemacht und auch nur für diese Aufnahme, aber wie gesagt ist der Timestamp der Info-Datei nur Sekunden-genau.

  • Das wurde ja schon gemacht und auch nur für diese Aufnahme, aber wie gesagt ist der Timestamp der Info-Datei nur Sekunden-genau.

    Bleibt noch die Frage nach dem Wiedereinlesen im Cutter…

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.4 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Beim Anzeigen der Recording Errors, die auch von cRecorder über die Info-Datei an die Liste der Aufnahmen übergeben werden, sollte die Genauigkeit aber reichen so dass dort kein Force notwendig ist.

    Ich hatte in letzter Zeit, ich denke so ab Version 2.7.4, relativ oft den Fall, das Recording Errors während und nach einer Aufnahme nicht korrekt im Recordings Menü angezeigt wurden. Das ist mir beim Schneiden einer solchen Aufnahme aufgefallen, erst bei der geschnittenen Aufnahme wurden die Fehler dann korrekt angezeigt. Ich weiß allerdings nicht, ob das den gleichen Zusammenhang hat.

    Grüße
    kamle5

    VDR 2.7.5: ASUS Prime X470-PRO, Ryzen 7 5700X, 64GB, 6TB HD, GT1030, Fedora 41 Kernel 6.13 X86_64, Devicebonding 2 x 1 auf 2, TT6400, DVBSky S952 V3

    Git-Repo: gitlab.com/kamel5

  • kls Ehrlich gesagt habe ich mich gewundert, dass Infos wie FramesPerSecond indirekt über die info-Datei an die Aufnahmeliste übergeben werden.
    Mit Recordings->UpdateByName(recordingName) in cRecorder::Action() erreicht man ja schon die richtige Aufnahme, da könnte man ein cRecordings::UpdateByName(onst char *FileName, const *cRecordingsInfo) draus machen/hinzufügen und die relevanten Infos direkt übernehmen .... (oder nur die u.a. Parameter)

    Edit: es gibt nur drei Stellen, wo Recordings->UpdateByName() augerufen wird:

    • cCuttingThread::HandleErrors(): Setzt Errors
    • cRecorder::Action(): Setzt fps, Width, Height, ScanType, AspectRatio
    • cIndexFileGenerator::Action(): Setzt fps, Width, Height, ScanType, AspectRatio und Errors

    Die Änderungen würden sich also in Grenzen halten und für das UpdateByName() ist jetzt auch schon ein LOCK_RECORDINGS_WRITE gesetzt

  • Ehrlich gesagt habe ich mich gewundert, dass Infos wie FramesPerSecond indirekt über die info-Datei an die Aufnahmeliste übergeben werden.

    Da hast du natürlich grundsätzlich recht. Aber ausser priority, lifetime und framesPerSecond geht es ja auch noch um die ganzen Frame-Parameter (in cRecorder::Action()). Um alle erdenklichen (und evtl. künftigen) Fälle abzudecken müsste man also die Info komplett kopieren - da erscheint es mir einfacher, die Datei neu einzulesen.

  • Ich habe mal Pakete für Ubuntu 20.04, 22.04 und 24.04 bauen lassen: https://launchpad.net/~seahawk1986-h…buntu/vdr-2.7.5

    Meine VDRs

    VDR 1: Intel DH67BL, Celeron 540, 4 GB Ram, POV Geforce GT 1030, Ubuntu 24.04 (yavdr-ansible), VDR 2.7.4, CIR-Empfänger
    VDR 2: Acer Revo 3610, Pinnacle PCTV SAT 452e, Medion X10, yaVDR 0.6
    Client 1: Raspberry Pi 2, Ubuntu 22.04 (yavdr-ansible), VDR 2.6.1

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • Mir ist da nochwas in der Aufnahmeliste augefallen:
    Wenn man eine Aufnahme schneidet wird normalerweise während des Schneidens die Dauer der geschnittenen Aufnahme hochgezählt. Ändert man danach die Schnittmarken und scheidet die gleiche Aufnahme nochmals, dann wird nicht nur die Dauer nicht mehr hochgezählt sondern auch nach dem Ende des Schneidens wird weiterhin die Dauer der Aufnahme nach dem ersten Schneiden angezeigt. (Vermutlich betrifft das auch die Anzahl der Fehler in der Aufnahme). Erst nach einem Restart des VDR wird die richtige Dauer der geschnittenen Aufnahme wieder angezeigt.

    Ursache ist, dass die erste geschnittene Aufnahme in der Aufnahmeliste nicht gelöscht wird sondern beim Schneiden nur ein Eintrag hinzugefügt wird (falls er noch nicht existiert). In cCutter::Start() werden zwar die Videodateien des ersten Schneidens gelöscht aber die Aufnahme nicht aus der Aufnahmeliste entfernt. Der folgende Patch löscht die Aufnahme in der Liste bevor die neue hinzugefügt wird:

    Diff
    --- vdr-2.7.5/recording.c       2025-04-16 13:49:13.520577063 +0200
    +++ vdr-2.7.5-devel/recording.c 2025-04-18 12:53:29.645557856 +0200
    @@ -2056,6 +2066,7 @@
          if ((Usage() & ruCut) != 0) {
             cutter = new cCutter(FileNameSrc());
             cutter->Start();
    +        Recordings->DelByName(FileNameDst());
             Recordings->AddByName(FileNameDst(), false);
             }
          else if ((Usage() & (ruMove | ruCopy)) != 0) {

    kls Gibt es eine bessere/elegantere Möglichkeit für das Del/Add oder kannst Du das so übernehmen?

Participate now!

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