#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"
vector<FrameOnDisk> frames[MAX_STREAMS]; // Under frame_mu.
vector<string> frame_filenames; // Under frame_mu.
+atomic<int64_t> metric_received_frames[MAX_STREAMS]{{0}};
+Summary metric_received_frame_size_bytes;
+
namespace {
FrameOnDisk write_frame(int stream_idx, int64_t pts, const uint8_t *data, size_t size, DB *db)
HTTPD *global_httpd;
void load_existing_frames();
-int record_thread_func();
+void record_thread_func();
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);
db.clean_unused_frame_files(frame_basenames);
}
-int record_thread_func()
+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_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.
+ return;
+ }
+
pthread_setname_np(pthread_self(), "ReceiveFrames");
- int64_t pts_offset;
+ int64_t pts_offset = 0; // Needs to be initialized due to a spurious GCC warning.
DB db(global_flags.working_directory + "/futatabi.db");
while (!should_quit.load()) {
if (av_read_frame(format_ctx.get(), &pkt) != 0) {
break;
}
+ if (pkt.stream_index >= MAX_STREAMS) {
+ 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;
start_pts = last_pts + TIMEBASE;
}
- return 0;
}