]> git.sesse.net Git - nageru/blobdiff - main.cpp
Allow symlinked frame files. Useful for testing.
[nageru] / main.cpp
index 8f9530459149cc77dbf3389ca823b0267d98b948..3aebe5a4e05151fe355689a89fe49859219136b7 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -39,6 +39,7 @@ extern "C" {
 #include <QApplication>
 #include <QGLFormat>
 #include <QSurfaceFormat>
+#include <QProgressDialog>
 #include <movit/init.h>
 #include <movit/util.h>
 
@@ -239,6 +240,8 @@ int main(int argc, char **argv)
                // TODO: Delete the surface, too.
        }
 
+       load_existing_frames();
+
        MainWindow main_window;
        main_window.show();
 
@@ -247,7 +250,6 @@ int main(int argc, char **argv)
 
        init_jpeg_vaapi();
 
-       load_existing_frames();
        thread record_thread(record_thread_func);
 
        int ret = app.exec();
@@ -259,7 +261,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) {
@@ -267,7 +269,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) {
@@ -356,12 +358,17 @@ 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()
 {
-       DB db(global_flags.working_directory + "/futatabi.db");
+       QProgressDialog progress("Scanning frame directory...", "Abort", 0, 1);
+       progress.setWindowTitle("Futatabi");
+       progress.setWindowModality(Qt::WindowModal);
+       progress.setMinimumDuration(1000);
+       progress.setMaximum(1);
+       progress.setValue(0);
 
        string frame_dir = global_flags.working_directory + "/frames";
        DIR *dir = opendir(frame_dir.c_str());
@@ -371,6 +378,7 @@ void load_existing_frames()
                return;
        }
 
+       vector<string> frame_basenames;
        for ( ;; ) {
                errno = 0;
                dirent *de = readdir(dir);
@@ -382,15 +390,35 @@ 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;
-                       load_frame_file(filename.c_str(), frame_filenames.size(), &db);
                        frame_filenames.push_back(filename);
+                       frame_basenames.push_back(de->d_name);
                }
-       }
 
+               if (progress.wasCanceled()) {
+                       exit(1);
+               }
+       }
        closedir(dir);
 
+       progress.setMaximum(frame_filenames.size() + 2);
+       progress.setValue(1);
+
+       progress.setLabelText("Opening database...");
+       DB db(global_flags.working_directory + "/futatabi.db");
+
+       progress.setLabelText("Reading frame files...");
+       progress.setValue(2);
+
+       for (size_t i = 0; i < frame_filenames.size(); ++i) {
+               load_frame_file(frame_filenames[i].c_str(), frame_basenames[i], i, &db);
+               progress.setValue(i + 3);
+               if (progress.wasCanceled()) {
+                       exit(1);
+               }
+       }
+
        if (start_pts == -1) {
                start_pts = 0;
        } else {