obs-outputs: Have a timeout for backed up packets

If packets get backed up for too long of a time, just disconnect instead
of trying to output them all.
master
jp9000 2015-11-01 15:00:01 -08:00
parent 071222029b
commit 8756115f67
1 changed files with 18 additions and 1 deletions

View File

@ -35,6 +35,7 @@
#define debug(format, ...) do_log(LOG_DEBUG, format, ##__VA_ARGS__)
#define OPT_DROP_THRESHOLD "drop_threshold_ms"
#define OPT_MAX_SHUTDOWN_TIME_SEC "max_shutdown_time_sec"
//#define TEST_FRAMEDROPS
@ -52,6 +53,8 @@ struct rtmp_stream {
volatile bool disconnected;
pthread_t send_thread;
int max_shutdown_time_sec;
os_sem_t *send_sem;
os_event_t *stop_event;
@ -222,14 +225,25 @@ static inline void send_headers(struct rtmp_stream *stream);
static bool send_remaining_packets(struct rtmp_stream *stream)
{
struct encoder_packet packet;
uint64_t max_ns = (uint64_t)stream->max_shutdown_time_sec * 1000000000;
uint64_t begin_time_ns = os_gettime_ns();
if (!stream->sent_headers)
send_headers(stream);
while (get_next_packet(stream, &packet))
while (get_next_packet(stream, &packet)) {
if (send_packet(stream, &packet, false, packet.track_idx) < 0)
return false;
/* Just disconnect if it takes too long to shut down */
if ((os_gettime_ns() - begin_time_ns) > max_ns) {
info("Took longer than %d second(s) to shut down, "
"automatically stopping connection",
stream->max_shutdown_time_sec);
return false;
}
}
return true;
}
@ -494,6 +508,8 @@ static bool rtmp_stream_start(void *data)
dstr_copy(&stream->password, obs_service_get_password(service));
stream->drop_threshold_usec =
(int64_t)obs_data_get_int(settings, OPT_DROP_THRESHOLD) * 1000;
stream->max_shutdown_time_sec =
(int)obs_data_get_int(settings, OPT_MAX_SHUTDOWN_TIME_SEC);
obs_data_release(settings);
return pthread_create(&stream->connect_thread, NULL, connect_thread,
@ -627,6 +643,7 @@ static void rtmp_stream_data(void *data, struct encoder_packet *packet)
static void rtmp_stream_defaults(obs_data_t *defaults)
{
obs_data_set_default_int(defaults, OPT_DROP_THRESHOLD, 600);
obs_data_set_default_int(defaults, OPT_MAX_SHUTDOWN_TIME_SEC, 5);
}
static obs_properties_t *rtmp_stream_properties(void *unused)