diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 101eece0f..482c9a32a 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -466,6 +466,7 @@ struct obs_output { int reconnect_retry_sec; int reconnect_retry_max; int reconnect_retries; + int reconnect_retry_cur_sec; bool reconnecting; pthread_t reconnect_thread; os_event_t *reconnect_stop_event; diff --git a/libobs/obs-output.c b/libobs/obs-output.c index dc3fc9810..724ef97e2 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -1028,7 +1028,7 @@ static inline void signal_reconnect(struct obs_output *output) { struct calldata params = {0}; calldata_set_int(¶ms, "timeout_sec", - output->reconnect_retry_sec); + output->reconnect_retry_cur_sec); calldata_set_ptr(¶ms, "output", output); signal_handler_signal(output->context.signals, "reconnect", ¶ms); calldata_free(¶ms); @@ -1220,7 +1220,7 @@ void obs_output_end_data_capture(obs_output_t *output) static void *reconnect_thread(void *param) { struct obs_output *output = param; - unsigned long ms = output->reconnect_retry_sec * 1000; + unsigned long ms = output->reconnect_retry_cur_sec * 1000; output->reconnect_thread_active = true; @@ -1238,8 +1238,10 @@ static void output_reconnect(struct obs_output *output) { int ret; - if (!output->reconnecting) + if (!output->reconnecting) { + output->reconnect_retry_cur_sec = output->reconnect_retry_sec; output->reconnect_retries = 0; + } if (output->reconnect_retries >= output->reconnect_retry_max) { output->reconnecting = false; @@ -1252,6 +1254,10 @@ static void output_reconnect(struct obs_output *output) os_event_reset(output->reconnect_stop_event); } + if (output->reconnect_retries) { + output->reconnect_retry_cur_sec *= 2; + } + output->reconnect_retries++; ret = pthread_create(&output->reconnect_thread, NULL,