diff --git a/frontend/utility/MultitrackVideoOutput.cpp b/frontend/utility/MultitrackVideoOutput.cpp index 5d8f6bbac8ed83..a5fc27518cde4d 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; @@ -454,10 +457,11 @@ void MultitrackVideoOutput::PrepareStreaming(QWidget *parent, const char *servic 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; @@ -869,6 +873,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 60f98356cf85d3..d9dc0d5ae566a1 100644 --- a/frontend/utility/MultitrackVideoOutput.hpp +++ b/frontend/utility/MultitrackVideoOutput.hpp @@ -63,6 +63,7 @@ struct MultitrackVideoOutput { 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);