#include "defs.h"
#include "flags.h"
+#include "metrics.h"
#include "mux.h"
#include "print_latency.h"
#include "timebase.h"
free_frames.push(frame_pool.get() + i * (global_flags.width * global_flags.height * 2 * bytes_per_pixel));
}
encoder_thread = thread(&X264Encoder::encoder_thread_func, this);
+
+ global_metrics.add("x264_queued_frames", &metric_x264_queued_frames, Metrics::TYPE_GAUGE);
+ global_metrics.add("x264_max_queued_frames", &metric_x264_max_queued_frames, Metrics::TYPE_GAUGE);
+ global_metrics.add("x264_dropped_frames", &metric_x264_dropped_frames);
+ global_metrics.add("x264_output_frames", {{ "type", "i" }}, &metric_x264_output_frames_i);
+ global_metrics.add("x264_output_frames", {{ "type", "p" }}, &metric_x264_output_frames_p);
+ global_metrics.add("x264_output_frames", {{ "type", "b" }}, &metric_x264_output_frames_b);
+
+ metric_x264_crf.init_uniform(50);
+ global_metrics.add("x264_crf", &metric_x264_crf);
+
+ latency_histogram.init("x264");
}
X264Encoder::~X264Encoder()
lock_guard<mutex> lock(mu);
if (free_frames.empty()) {
fprintf(stderr, "WARNING: x264 queue full, dropping frame with pts %ld\n", pts);
+ ++metric_x264_dropped_frames;
return;
}
lock_guard<mutex> lock(mu);
queued_frames.push(qf);
queued_frames_nonempty.notify_all();
+ metric_x264_queued_frames = queued_frames.size();
}
}
perror("nice()");
// No exit; it's not fatal.
}
+ pthread_setname_np(pthread_self(), "x264_encode");
init_x264();
x264_init_done = true;
qf.data = nullptr;
}
+ metric_x264_queued_frames = queued_frames.size();
frames_left = !queued_frames.empty();
}
if (num_nal == 0) return;
+ if (IS_X264_TYPE_I(pic.i_type)) {
+ ++metric_x264_output_frames_i;
+ } else if (IS_X264_TYPE_B(pic.i_type)) {
+ ++metric_x264_output_frames_b;
+ } else {
+ ++metric_x264_output_frames_p;
+ }
+
+ metric_x264_crf.count_event(pic.prop.f_crf_avg);
+
if (frames_being_encoded.count(pic.i_pts)) {
ReceivedTimestamps received_ts = frames_being_encoded[pic.i_pts];
frames_being_encoded.erase(pic.i_pts);
static int frameno = 0;
print_latency("Current x264 latency (video inputs → network mux):",
received_ts, (pic.i_type == X264_TYPE_B || pic.i_type == X264_TYPE_BREF),
- &frameno);
+ &frameno, &latency_histogram);
} else {
assert(false);
}