diff --git a/src/moq-output.cpp b/src/moq-output.cpp index 4594fc5..4bc0222 100644 --- a/src/moq-output.cpp +++ b/src/moq-output.cpp @@ -2,6 +2,7 @@ #include "moq-output.h" #include "util/util_uint64.h" +#include "util/threading.h" extern "C" { #include "moq.h" @@ -15,7 +16,8 @@ MoQOutput::MoQOutput(obs_data_t *, obs_output_t *output) connect_time_ms(0), origin(moq_origin_create()), session(0), - broadcast(moq_publish_create()) + broadcast(moq_publish_create()), + reconnecting(false) { } @@ -81,8 +83,19 @@ bool MoQOutput::Start() self->connect_time_ms = static_cast(std::chrono::duration_cast(elapsed).count()); LOG_INFO("MoQ session established (%d ms): %s", self->connect_time_ms, self->server_url.c_str()); + + if (self->reconnecting) + os_atomic_set_bool(&self->reconnecting, false); + } else if (error_code == -2) { + //on swrver disconnection. Signal to attempt to reconnect + LOG_INFO("MoQ session disconnected (%d): %s", error_code, self->server_url.c_str()); + obs_output_signal_stop(self->output, OBS_OUTPUT_DISCONNECTED); + os_atomic_set_bool(&self->reconnecting, true); } else { LOG_INFO("MoQ session closed (%d): %s", error_code, self->server_url.c_str()); + // signal connection failure and stop the broadcast + obs_output_signal_stop(self->output, OBS_OUTPUT_CONNECT_FAILED); + os_atomic_set_bool(&self->reconnecting, false); } }; @@ -133,6 +146,8 @@ void MoQOutput::Stop(bool signal) obs_output_signal_stop(output, OBS_OUTPUT_SUCCESS); } + os_atomic_set_bool(&reconnecting, false); + return; } diff --git a/src/moq-output.h b/src/moq-output.h index a46e6a5..d1a59c0 100644 --- a/src/moq-output.h +++ b/src/moq-output.h @@ -46,6 +46,8 @@ class MoQOutput int broadcast; std::map video_tracks; std::map audio_tracks; + + volatile bool reconnecting; }; void register_moq_output();