From 1ea13d66da4aca375505b550bd207ad1c14d298f Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 7 Aug 2023 00:52:08 +0200 Subject: [PATCH] Add metrics for the SRT output (basically same as on inputs). --- nageru/video_encoder.cpp | 9 +++++++++ nageru/video_encoder.h | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/nageru/video_encoder.cpp b/nageru/video_encoder.cpp index 29f3105..4d6a403 100644 --- a/nageru/video_encoder.cpp +++ b/nageru/video_encoder.cpp @@ -209,6 +209,7 @@ bool VideoEncoder::begin_frame(int64_t pts, int64_t duration, movit::YCbCrLumaCo RefCountedGLsync VideoEncoder::end_frame() { + want_srt_metric_update = true; lock_guard lock(qs_mu); return quicksync_encoder->end_frame(); } @@ -256,6 +257,8 @@ void VideoEncoder::open_output_streams() if (is_srt) { srt_mux.reset(mux); srt_mux_metrics.init({{ "destination", "srt" }}); + srt_metrics.init({{ "cardtype", "output" }}); + global_metrics.add("srt_num_connection_attempts", {{ "cardtype", "output" }}, &metric_srt_num_connection_attempts); } else { http_mux.reset(mux); http_mux_metrics.init({{ "destination", "http" }}); @@ -373,6 +376,7 @@ int VideoEncoder::connect_to_srt() // Die immediately. return sock; } + ++metric_srt_num_connection_attempts; if (srt_connect(sock, cur->ai_addr, cur->ai_addrlen) < 0) { fprintf(stderr, "srt_connect(%s): %s\n", print_addrinfo(cur).c_str(), srt_getlasterror_str()); srt_close(sock); @@ -390,6 +394,9 @@ int VideoEncoder::connect_to_srt() int VideoEncoder::write_srt_packet(uint8_t *buf, int buf_size) { + if (want_srt_metric_update.exchange(false) && srt_sock != -1) { + srt_metrics.update_srt_stats(srt_sock); + } while (buf_size > 0) { if (srt_sock == -1) { srt_sock = connect_to_srt(); @@ -397,12 +404,14 @@ int VideoEncoder::write_srt_packet(uint8_t *buf, int buf_size) usleep(100000); continue; } + srt_metrics.update_srt_stats(srt_sock); } int to_send = min(buf_size, SRT_LIVE_DEF_PLSIZE); int ret = srt_send(srt_sock, (char *)buf, to_send); if (ret < 0) { fprintf(stderr, "srt_send(): %s\n", srt_getlasterror_str()); srt_close(srt_sock); + srt_metrics.metric_srt_uptime_seconds = 0.0 / 0.0; srt_sock = connect_to_srt(); continue; } diff --git a/nageru/video_encoder.h b/nageru/video_encoder.h index 86badf2..91d2c75 100644 --- a/nageru/video_encoder.h +++ b/nageru/video_encoder.h @@ -14,6 +14,7 @@ #include #include #include +#include extern "C" { #include @@ -24,6 +25,7 @@ extern "C" { #include "shared/mux.h" #include "shared/ref_counted_gl_sync.h" +#include "srt_metrics.h" class AudioEncoder; class AV1Encoder; @@ -112,6 +114,9 @@ private: std::string http_mux_header; MuxMetrics http_mux_metrics; MuxMetrics srt_mux_metrics; + SRTMetrics srt_metrics; + std::atomic metric_srt_num_connection_attempts{0}; + std::atomic want_srt_metric_update{true}; // Is nominally set every frame. Some racing is OK (this is mainly a rate-limiter). std::atomic quicksync_encoders_in_shutdown{0}; std::atomic overriding_bitrate{0}; -- 2.39.2