diff --git a/frontend/utility/MultitrackVideoOutput.cpp b/frontend/utility/MultitrackVideoOutput.cpp index 0f8f5c928..0c5995780 100644 --- a/frontend/utility/MultitrackVideoOutput.cpp +++ b/frontend/utility/MultitrackVideoOutput.cpp @@ -26,6 +26,9 @@ static const char *hevc_main = "Main"; static const char *hevc_main10 = "Main 10"; static const char *av1_main = "Main"; +// Maximum reconnect attempts with an invalid key error before giving up (roughly 30 seconds with default start value) +static constexpr uint8_t MAX_RECONNECT_ATTEMPTS = 5; + Qt::ConnectionType BlockingConnectionTypeFor(QObject *object) { return object->thread() == QThread::currentThread() ? Qt::DirectConnection : Qt::BlockingQueuedConnection; @@ -474,10 +477,11 @@ void MultitrackVideoOutput::PrepareStreaming( obs_output_add_packet_callback(output, bpm_inject, NULL); // Set callback to prevent reconnection attempts once the stream key has become invalid - static auto reconnect_cb = [](void *, obs_output_t *, int code) -> bool { - return code != OBS_OUTPUT_INVALID_STREAM; + static auto reconnect_cb = [](void *param, obs_output_t *, int code) -> bool { + auto _this = static_cast(param); + return code != OBS_OUTPUT_INVALID_STREAM || (_this->reconnect_attempts++ < MAX_RECONNECT_ATTEMPTS); }; - obs_output_set_reconnect_callback(output, reconnect_cb, nullptr); + obs_output_set_reconnect_callback(output, reconnect_cb, this); OBSSignal start_streaming; OBSSignal stop_streaming; @@ -893,6 +897,7 @@ void StreamStartHandler(void *arg, calldata_t *) { auto self = static_cast(arg); self->restart_on_error = true; + self->reconnect_attempts = 0; } void StreamStopHandler(void *arg, calldata_t *data) diff --git a/frontend/utility/MultitrackVideoOutput.hpp b/frontend/utility/MultitrackVideoOutput.hpp index f66d14c03..3bcb8cf6b 100644 --- a/frontend/utility/MultitrackVideoOutput.hpp +++ b/frontend/utility/MultitrackVideoOutput.hpp @@ -65,6 +65,7 @@ private: std::optional current_stream_dump; bool restart_on_error = false; + uint8_t reconnect_attempts = 0; friend void StreamStartHandler(void *arg, calldata_t *data); friend void StreamStopHandler(void *arg, calldata_t *data);