]> git.sesse.net Git - nageru/blobdiff - nageru/video_encoder.cpp
If a FFmpeg input does not give a frame for at least ten seconds, consider it a fatal...
[nageru] / nageru / video_encoder.cpp
index 29f31050e084a4e9527407cbdfc6823c0a7330d4..4a84ddce1efe786a0f401b2d4e700f358c5482d5 100644 (file)
@@ -89,17 +89,25 @@ VideoEncoder::VideoEncoder(ResourcePool *resource_pool, QSurface *surface, const
 
        open_output_streams();
        stream_audio_encoder->add_mux(http_mux.get());
-       stream_audio_encoder->add_mux(srt_mux.get());
+       if (srt_mux != nullptr) {
+               stream_audio_encoder->add_mux(srt_mux.get());
+       }
        quicksync_encoder->set_http_mux(http_mux.get());
-       quicksync_encoder->set_srt_mux(srt_mux.get());
+       if (srt_mux != nullptr) {
+               quicksync_encoder->set_srt_mux(srt_mux.get());
+       }
        if (global_flags.x264_video_to_http) {
                x264_encoder->add_mux(http_mux.get());
-               x264_encoder->add_mux(srt_mux.get());
+               if (srt_mux != nullptr) {
+                       x264_encoder->add_mux(srt_mux.get());
+               }
        }
 #ifdef HAVE_AV1
        if (global_flags.av1_video_to_http) {
                av1_encoder->add_mux(http_mux.get());
-               av1_encoder->add_mux(srt_mux.get());
+               if (srt_mux != nullptr) {
+                       av1_encoder->add_mux(srt_mux.get());
+               }
        }
 #endif
 }
@@ -209,6 +217,7 @@ bool VideoEncoder::begin_frame(int64_t pts, int64_t duration, movit::YCbCrLumaCo
 
 RefCountedGLsync VideoEncoder::end_frame()
 {
+       want_srt_metric_update = true;
        lock_guard<mutex> lock(qs_mu);
        return quicksync_encoder->end_frame();
 }
@@ -256,6 +265,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 +384,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 +402,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 +412,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;
                }