X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fmain.cpp;h=4c54d332d24951b9118798b86c90ef3ab10e464b;hb=a3b76e5ad9493b0af08fdcbe6d6b689d91496f85;hp=486bcfff213654bf409691ac4212bd4acdaaa44c;hpb=e0d676aec4f44252170da8e1c8824421ac6976ff;p=nageru diff --git a/futatabi/main.cpp b/futatabi/main.cpp index 486bcff..4c54d33 100644 --- a/futatabi/main.cpp +++ b/futatabi/main.cpp @@ -1,5 +1,5 @@ -#include #include +#include #include #include #include @@ -21,27 +21,27 @@ extern "C" { } #include "clip_list.h" -#include "shared/context.h" #include "defs.h" -#include "shared/disk_space_estimator.h" -#include "shared/ffmpeg_raii.h" #include "flags.h" -#include "frame_on_disk.h" #include "frame.pb.h" -#include "shared/httpd.h" +#include "frame_on_disk.h" #include "mainwindow.h" #include "player.h" +#include "shared/context.h" +#include "shared/disk_space_estimator.h" +#include "shared/ffmpeg_raii.h" +#include "shared/httpd.h" +#include "shared/metrics.h" #include "shared/post_to_main_thread.h" #include "shared/ref_counted_gl_sync.h" #include "shared/timebase.h" -#include "shared/metrics.h" #include "ui_mainwindow.h" #include "vaapi_jpeg_decoder.h" #include #include -#include #include +#include #include #include @@ -52,7 +52,7 @@ constexpr char frame_magic[] = "Ftbifrm0"; constexpr size_t frame_magic_len = 8; mutex RefCountedGLsync::fence_lock; -atomic should_quit{false}; +atomic should_quit{ false }; int64_t start_pts = -1; @@ -70,7 +70,8 @@ mutex frame_mu; vector frames[MAX_STREAMS]; // Under frame_mu. vector frame_filenames; // Under frame_mu. -atomic metric_received_frames[MAX_STREAMS]{{0}}; +atomic metric_received_frames[MAX_STREAMS]{ { 0 } }; +Summary metric_received_frame_size_bytes; namespace { @@ -78,8 +79,8 @@ FrameOnDisk write_frame(int stream_idx, int64_t pts, const uint8_t *data, size_t { if (open_frame_files.count(stream_idx) == 0) { char filename[256]; - snprintf(filename, sizeof(filename), "%s/frames/cam%d-pts%09ld.frames", - global_flags.working_directory.c_str(), stream_idx, pts); + snprintf(filename, sizeof(filename), "%s/frames/cam%d-pts%09" PRId64 ".frames", + global_flags.working_directory.c_str(), stream_idx, pts); FILE *fp = fopen(filename, "wb"); if (fp == nullptr) { perror(filename); @@ -144,7 +145,7 @@ FrameOnDisk write_frame(int stream_idx, int64_t pts, const uint8_t *data, size_t frames[stream_idx].push_back(frame); } - if (++file.frames_written_so_far >= 1000) { + if (++file.frames_written_so_far >= FRAMES_PER_FILE) { size_t size = ftell(file.fp); // Start a new file next time. @@ -181,7 +182,7 @@ FrameOnDisk write_frame(int stream_idx, int64_t pts, const uint8_t *data, size_t return frame; } -} // namespace +} // namespace HTTPD *global_httpd; @@ -211,7 +212,9 @@ int main(int argc, char **argv) } avformat_network_init(); + global_metrics.set_prefix("futatabi"); global_httpd = new HTTPD; + global_metrics.remove("num_connected_multicam_clients"); QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true); @@ -252,6 +255,12 @@ int main(int argc, char **argv) load_existing_frames(); + for (int stream_idx = 0; stream_idx < MAX_STREAMS; ++stream_idx) { + if (!frames[stream_idx].empty()) { + assert(start_pts > frames[stream_idx].back().pts); + } + } + MainWindow main_window; main_window.show(); @@ -266,7 +275,6 @@ int main(int argc, char **argv) should_quit = true; record_thread.join(); - JPEGFrameView::shutdown(); return ret; } @@ -317,9 +325,9 @@ void load_frame_file(const char *filename, const string &basename, unsigned file // OK, found the magic. Try to parse the frame header. magic_offset = 0; - if (skipped_bytes > 0) { + if (skipped_bytes > 0) { fprintf(stderr, "WARNING: %s: Skipped %zu garbage bytes in the middle.\n", - filename, skipped_bytes); + filename, skipped_bytes); skipped_bytes = 0; } @@ -366,7 +374,7 @@ void load_frame_file(const char *filename, const string &basename, unsigned file if (skipped_bytes > 0) { fprintf(stderr, "WARNING: %s: Skipped %zu garbage bytes at the end.\n", - filename, skipped_bytes); + filename, skipped_bytes); } off_t size = ftell(fp); @@ -398,7 +406,7 @@ void load_existing_frames() } vector frame_basenames; - for ( ;; ) { + for (;;) { errno = 0; dirent *de = readdir(dir); if (de == nullptr) { @@ -448,7 +456,7 @@ void load_existing_frames() for (int stream_idx = 0; stream_idx < MAX_STREAMS; ++stream_idx) { sort(frames[stream_idx].begin(), frames[stream_idx].end(), - [](const auto &a, const auto &b) { return a.pts < b.pts; }); + [](const auto &a, const auto &b) { return a.pts < b.pts; }); } db.clean_unused_frame_files(frame_basenames); @@ -457,8 +465,9 @@ void load_existing_frames() void record_thread_func() { for (unsigned i = 0; i < MAX_STREAMS; ++i) { - global_metrics.add("received_frames", {{ "stream", to_string(i) }}, &metric_received_frames[i]); + global_metrics.add("received_frames", { { "stream", to_string(i) } }, &metric_received_frames[i]); } + global_metrics.add("received_frame_size_bytes", &metric_received_frame_size_bytes); if (global_flags.stream_source.empty() || global_flags.stream_source == "/dev/null") { // Save the user from some repetitive messages. @@ -482,7 +491,7 @@ void record_thread_func() while (!should_quit.load()) { AVPacket pkt; - unique_ptr pkt_cleanup( + unique_ptr pkt_cleanup( &pkt, av_packet_unref); av_init_packet(&pkt); pkt.data = nullptr; @@ -493,11 +502,13 @@ void record_thread_func() if (av_read_frame(format_ctx.get(), &pkt) != 0) { break; } - if (pkt.stream_index >= MAX_STREAMS) { + if (pkt.stream_index >= MAX_STREAMS || + format_ctx->streams[pkt.stream_index]->codecpar->codec_type != AVMEDIA_TYPE_VIDEO) { continue; } ++metric_received_frames[pkt.stream_index]; + metric_received_frame_size_bytes.count_event(pkt.size); // Convert pts to our own timebase. AVRational stream_timebase = format_ctx->streams[pkt.stream_index]->time_base; @@ -524,8 +535,10 @@ void record_thread_func() current_pts = pts; } - fprintf(stderr, "%s: Hit EOF. Waiting one second and trying again...\n", global_flags.stream_source.c_str()); - sleep(1); + if (!should_quit.load()) { + fprintf(stderr, "%s: Hit EOF. Waiting one second and trying again...\n", global_flags.stream_source.c_str()); + sleep(1); + } start_pts = last_pts + TIMEBASE; }