]> git.sesse.net Git - nageru/blobdiff - main.cpp
Remove frame files that do not exist from the database.
[nageru] / main.cpp
index cf0390096f7995406e49b44999859d1d970c0b21..e0518afb95421d3ad906cc9a910f2dee01aef9d0 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -166,7 +166,12 @@ FrameOnDisk write_frame(int stream_idx, int64_t pts, const uint8_t *data, size_t
                                }
                        }
                }
-               db->store_frame_file(filename, size, frames_this_file);
+
+               const char *basename = filename.c_str();
+               while (strchr(basename, '/') != nullptr) {
+                       basename = strchr(basename, '/');
+               }
+               db->store_frame_file(basename, size, frames_this_file);
        }
 
        return frame;
@@ -261,7 +266,7 @@ int main(int argc, char **argv)
        return ret;
 }
 
-void load_frame_file(const char *filename, unsigned filename_idx, DB *db)
+void load_frame_file(const char *filename, const string &basename, unsigned filename_idx, DB *db)
 {
        struct stat st;
        if (stat(filename, &st) == -1) {
@@ -269,7 +274,7 @@ void load_frame_file(const char *filename, unsigned filename_idx, DB *db)
                exit(1);
        }
 
-       vector<DB::FrameOnDiskAndStreamIdx> all_frames = db->load_frame_file(filename, st.st_size, filename_idx);
+       vector<DB::FrameOnDiskAndStreamIdx> all_frames = db->load_frame_file(basename, st.st_size, filename_idx);
        if (!all_frames.empty()) {
                // We already had this cached in the database, so no need to look in the file.
                for (const DB::FrameOnDiskAndStreamIdx &frame : all_frames) {
@@ -358,7 +363,7 @@ void load_frame_file(const char *filename, unsigned filename_idx, DB *db)
        size_t size = ftell(fp);
        fclose(fp);
 
-       db->store_frame_file(filename, size, all_frames);
+       db->store_frame_file(basename, size, all_frames);
 }
 
 void load_existing_frames()
@@ -378,6 +383,7 @@ void load_existing_frames()
                return;
        }
 
+       vector<string> frame_basenames;
        for ( ;; ) {
                errno = 0;
                dirent *de = readdir(dir);
@@ -389,9 +395,10 @@ void load_existing_frames()
                        break;
                }
 
-               if (de->d_type == DT_REG) {
+               if (de->d_type == DT_REG || de->d_type == DT_LNK) {
                        string filename = frame_dir + "/" + de->d_name;
                        frame_filenames.push_back(filename);
+                       frame_basenames.push_back(de->d_name);
                }
 
                if (progress.wasCanceled()) {
@@ -410,7 +417,7 @@ void load_existing_frames()
        progress.setValue(2);
 
        for (size_t i = 0; i < frame_filenames.size(); ++i) {
-               load_frame_file(frame_filenames[i].c_str(), i, &db);
+               load_frame_file(frame_filenames[i].c_str(), frame_basenames[i], i, &db);
                progress.setValue(i + 3);
                if (progress.wasCanceled()) {
                        exit(1);
@@ -428,6 +435,8 @@ void load_existing_frames()
                sort(frames[stream_idx].begin(), frames[stream_idx].end(),
                        [](const auto &a, const auto &b) { return a.pts < b.pts; });
        }
+
+       db.clean_unused_frame_files(frame_basenames);
 }
 
 int record_thread_func()