libobs: Add optional reconnect callback to outputs

This commit is contained in:
Dennis Sädtler
2025-03-05 10:55:01 +01:00
committed by Ryan Foster
parent 2950daa29d
commit 187eef7b38
4 changed files with 59 additions and 1 deletions
+22
View File
@@ -772,6 +772,28 @@ General Output Functions
.. versionadded:: 31.0
---------------------
.. function:: void obs_output_set_reconnect_callback(obs_output_t *output, bool (*reconnect_cb)(void *data, obs_output_t *output, int code), void *param)
Sets a callback that can be used to decide whether or not to attempt reconnecting.
Can also be used to reconfigure the output within the callback before continuing the reconnection attempts,
e.g., to update the stream key after the previous one has expired.
Passing in a `NULL` pointer removes the callback.
:param output: The output to register the reconnect_cb() function against
:param reconnect_cb: Function pointer to the callback function
:param param: Data passed to the callback
reconnect_cb() arguments:
:param data: Data passed to the callback
:param output: The output associated with the invoked callback function
:param code: Error code the output was stopped with
:return: Whether or not to continue attempting to reconnect
.. versionadded:: 31.1
Functions used by outputs
-------------------------
+7
View File
@@ -78,6 +78,11 @@ struct packet_callback {
void *param;
};
struct reconnect_callback {
bool (*reconnect_cb)(void *data, obs_output_t *output, int code);
void *param;
};
/* ------------------------------------------------------------------------- */
/* validity checks */
@@ -1150,6 +1155,8 @@ struct obs_output {
pthread_mutex_t pkt_callbacks_mutex;
DARRAY(struct packet_callback) pkt_callbacks;
struct reconnect_callback reconnect_callback;
bool valid;
uint64_t active_delay_ns;
+24 -1
View File
@@ -2874,10 +2874,21 @@ static void output_reconnect(struct obs_output *output)
}
}
static inline bool can_reconnect(const obs_output_t *output, int code)
static inline bool check_reconnect_cb(obs_output_t *output, int code)
{
if (!output->reconnect_callback.reconnect_cb)
return true;
return output->reconnect_callback.reconnect_cb(output->reconnect_callback.param, output, code);
}
static inline bool can_reconnect(obs_output_t *output, int code)
{
bool reconnect_active = output->reconnect_retry_max != 0;
if (reconnect_active && !check_reconnect_cb(output, code))
return false;
return (reconnecting(output) && code != OBS_OUTPUT_SUCCESS) ||
(reconnect_active && code == OBS_OUTPUT_DISCONNECTED);
}
@@ -3190,3 +3201,15 @@ void obs_output_remove_packet_callback(obs_output_t *output,
da_erase_item(output->pkt_callbacks, &data);
pthread_mutex_unlock(&output->pkt_callbacks_mutex);
}
void obs_output_set_reconnect_callback(obs_output_t *output,
bool (*reconnect_cb)(void *data, obs_output_t *output, int code), void *param)
{
if (!reconnect_cb) {
output->reconnect_callback.reconnect_cb = NULL;
output->reconnect_callback.param = NULL;
} else {
output->reconnect_callback.reconnect_cb = reconnect_cb;
output->reconnect_callback.param = param;
}
}
+6
View File
@@ -2074,6 +2074,12 @@ EXPORT void obs_output_remove_packet_callback(obs_output_t *output,
struct encoder_packet_time *pkt_time, void *param),
void *param);
/* Sets a callback to be called when the output checks if it should attempt to reconnect.
* If the callback returns false, the output will not attempt to reconnect. */
EXPORT void obs_output_set_reconnect_callback(obs_output_t *output,
bool (*reconnect_cb)(void *data, obs_output_t *output, int code),
void *param);
/* ------------------------------------------------------------------------- */
/* Functions used by outputs */