#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);
}
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();
}
}
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;
+ }
+
if (frames_being_encoded.count(pic.i_pts)) {
ReceivedTimestamps received_ts = frames_being_encoded[pic.i_pts];
frames_being_encoded.erase(pic.i_pts);
#include <movit/image_format.h>
+#include "defs.h"
#include "print_latency.h"
#include "x264_dynamic.h"
// Key is the pts of the frame.
std::unordered_map<int64_t, ReceivedTimestamps> frames_being_encoded;
+
+ // Metrics.
+ std::atomic<int64_t> metric_x264_queued_frames{0};
+ std::atomic<int64_t> metric_x264_max_queued_frames{X264_QUEUE_LENGTH};
+ std::atomic<int64_t> metric_x264_dropped_frames{0};
+ std::atomic<int64_t> metric_x264_output_frames_i{0};
+ std::atomic<int64_t> metric_x264_output_frames_p{0};
+ std::atomic<int64_t> metric_x264_output_frames_b{0};
};
#endif // !defined(_X264ENCODE_H)