class QOpenGLContext;
class QSurface;
+namespace {
+
+// These need to survive several QuickSyncEncoderImpl instances,
+// so they are outside.
+bool mux_metrics_inited = false;
+LatencyHistogram mixer_latency_histogram, qs_latency_histogram;
+MuxMetrics current_file_mux_metrics, total_mux_metrics;
+
+} // namespace
+
#define CHECK_VASTATUS(va_status, func) \
if (va_status != VA_STATUS_SUCCESS) { \
fprintf(stderr, "%s:%d (%s) failed with %d\n", __func__, __LINE__, func, va_status); \
static int frameno = 0;
print_latency("Current Quick Sync latency (video inputs → disk mux):",
- task.received_ts, (task.frame_type == FRAME_B), &frameno);
+ task.received_ts, (task.frame_type == FRAME_B), &frameno, &qs_latency_histogram);
{
// Add video.
memset(&slice_param, 0, sizeof(slice_param));
}
+ if (!mux_metrics_inited) {
+ mixer_latency_histogram.init("mixer");
+ qs_latency_histogram.init("quick_sync");
+ mux_metrics_inited = true;
+ }
+
storage_thread = thread(&QuickSyncEncoderImpl::storage_task_thread, this);
encode_thread = thread([this]{
video_extradata = x264_encoder->get_global_headers();
}
+ if (!mux_metrics_inited) {
+ current_file_mux_metrics.init({{ "destination", "current_file" }});
+ total_mux_metrics.init({{ "destination", "files_total" }});
+ mux_metrics_inited = true;
+ }
+ current_file_mux_metrics.reset();
+
AVCodecParametersWithDeleter audio_codecpar = file_audio_encoder->get_codec_parameters();
file_mux.reset(new Mux(avctx, frame_width, frame_height, Mux::CODEC_H264, video_extradata, audio_codecpar.get(), TIMEBASE,
- std::bind(&DiskSpaceEstimator::report_write, disk_space_estimator, filename, _1)));
+ std::bind(&DiskSpaceEstimator::report_write, disk_space_estimator, filename, _1),
+ { ¤t_file_mux_metrics, &total_mux_metrics }));
if (global_flags.x264_video_to_disk) {
x264_encoder->add_mux(file_mux.get());
ReceivedTimestamps received_ts = find_received_timestamp(frame.input_frames);
static int frameno = 0;
print_latency("Current mixer latency (video inputs → ready for encode):",
- received_ts, false, &frameno);
+ received_ts, false, &frameno, &mixer_latency_histogram);
// Release back any input frames we needed to render this frame.
frame.input_frames.clear();