X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=main.cpp;h=6cd4741225b95c18b94764782147dfa00adcae8b;hb=fca89bd21985639735df96a527d86f8aa05b61fe;hp=da2340bdfd81c34862bd075648395adaf1e8554b;hpb=fba9223dd99865e3cb90dc353f928ac3da3ac81e;p=nageru diff --git a/main.cpp b/main.cpp index da2340b..6cd4741 100644 --- a/main.cpp +++ b/main.cpp @@ -3,11 +3,13 @@ #include #include #include +#include #include #include #include #include #include +#include #include #include #include @@ -21,6 +23,7 @@ extern "C" { #include "defs.h" #include "disk_space_estimator.h" #include "ffmpeg_raii.h" +#include "flags.h" #include "httpd.h" #include "mainwindow.h" #include "player.h" @@ -48,7 +51,8 @@ int64_t current_pts = 0; string filename_for_frame(unsigned stream_idx, int64_t pts) { char filename[256]; - snprintf(filename, sizeof(filename), "frames/cam%d-pts%09ld.jpeg", stream_idx, pts); + snprintf(filename, sizeof(filename), "%s/frames/cam%d-pts%09ld.jpeg", + global_flags.working_directory.c_str(), stream_idx, pts); return filename; } @@ -61,9 +65,30 @@ int record_thread_func(); int main(int argc, char **argv) { + parse_flags(argc, argv); + if (optind == argc) { + global_flags.stream_source = "multiangle.mp4"; + global_flags.slow_down_input = true; + } else if (optind + 1 == argc) { + global_flags.stream_source = argv[optind]; + } else { + usage(); + exit(1); + } + + string frame_dir = global_flags.working_directory + "/frames"; + + struct stat st; + if (stat(frame_dir.c_str(), &st) == -1) { + fprintf(stderr, "%s does not exist, creating it.\n", frame_dir.c_str()); + if (mkdir(frame_dir.c_str(), 0777) == -1) { + perror(global_flags.working_directory.c_str()); + exit(1); + } + } + avformat_network_init(); global_httpd = new HTTPD; - global_httpd->start(DEFAULT_HTTPD_PORT); QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); @@ -99,8 +124,11 @@ int main(int argc, char **argv) // TODO: Delete the surface, too. } - MainWindow mainWindow; - mainWindow.show(); + MainWindow main_window; + main_window.show(); + + global_httpd->add_endpoint("/queue_status", bind(&MainWindow::get_queue_status, &main_window), HTTPD::NO_CORS_POLICY); + global_httpd->start(DEFAULT_HTTPD_PORT); init_jpeg_vaapi(); @@ -118,7 +146,8 @@ int main(int argc, char **argv) void load_existing_frames() { - DIR *dir = opendir("frames/"); + string frame_dir = global_flags.working_directory + "/frames"; + DIR *dir = opendir(frame_dir.c_str()); if (dir == nullptr) { perror("frames/"); start_pts = 0; @@ -161,9 +190,9 @@ void load_existing_frames() int record_thread_func() { - auto format_ctx = avformat_open_input_unique("multiangle.mp4", nullptr, nullptr); + auto format_ctx = avformat_open_input_unique(global_flags.stream_source.c_str(), nullptr, nullptr); if (format_ctx == nullptr) { - fprintf(stderr, "%s: Error opening file\n", "example.mp4"); + fprintf(stderr, "%s: Error opening file\n", global_flags.stream_source.c_str()); return 1; } @@ -222,8 +251,7 @@ int record_thread_func() assert(pkt.stream_index < MAX_STREAMS); frames[pkt.stream_index].push_back(pts); - // Hack. Remove when we're dealing with live streams. - if (last_pts != -1) { + if (last_pts != -1 && global_flags.slow_down_input) { this_thread::sleep_for(microseconds((pts - last_pts) * 1000000 / TIMEBASE)); } last_pts = pts;