]> git.sesse.net Git - nageru/blobdiff - nageru/video_encoder.cpp
Make it possible to quit while SRT is not connected, although slowly.
[nageru] / nageru / video_encoder.cpp
index 29f31050e084a4e9527407cbdfc6823c0a7330d4..ec96acc58d9c82e24bbb33338bb0dccdb4c2de43 100644 (file)
@@ -89,23 +89,32 @@ 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
 }
 
 VideoEncoder::~VideoEncoder()
 {
+       should_quit = true;
        quicksync_encoder->shutdown();
        x264_encoder.reset(nullptr);
        x264_disk_encoder.reset(nullptr);
@@ -209,6 +218,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 +266,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 +385,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,19 +403,24 @@ int VideoEncoder::connect_to_srt()
 
 int VideoEncoder::write_srt_packet(uint8_t *buf, int buf_size)
 {
-       while (buf_size > 0) {
+       if (want_srt_metric_update.exchange(false) && srt_sock != -1) {
+               srt_metrics.update_srt_stats(srt_sock);
+       }
+       while (buf_size > 0 && !should_quit.load()) {
                if (srt_sock == -1) {
                        srt_sock = connect_to_srt();
                        if (srt_sock == -1) {
                                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;
                }