diff --git a/plugins/obs-outputs/rtmp-stream.c b/plugins/obs-outputs/rtmp-stream.c index 1d10f6129..179bee537 100644 --- a/plugins/obs-outputs/rtmp-stream.c +++ b/plugins/obs-outputs/rtmp-stream.c @@ -78,6 +78,7 @@ struct rtmp_stream { os_sem_t *send_sem; os_event_t *stop_event; uint64_t stop_ts; + uint64_t shutdown_timeout_ts; struct dstr path, key; struct dstr username, password; @@ -234,6 +235,10 @@ static void rtmp_stream_stop(void *data, uint64_t ts) stream->stop_ts = ts / 1000ULL; os_event_signal(stream->stop_event); + if (ts) + stream->shutdown_timeout_ts = ts + + (uint64_t)stream->max_shutdown_time_sec * 1000000000ULL; + if (active(stream)) { if (stream->stop_ts == 0) os_sem_post(stream->send_sem); @@ -378,6 +383,19 @@ static int send_packet(struct rtmp_stream *stream, static inline bool send_headers(struct rtmp_stream *stream); +static inline bool can_shutdown_stream(struct rtmp_stream *stream, + struct encoder_packet *packet) +{ + uint64_t cur_time = os_gettime_ns(); + bool timeout = cur_time >= stream->shutdown_timeout_ts; + + if (timeout) + info("Stream shutdown timeout reached (%d second(s))", + stream->max_shutdown_time_sec); + + return timeout || packet->sys_dts_usec >= (int64_t)stream->stop_ts; +} + static void *send_thread(void *data) { struct rtmp_stream *stream = data; @@ -395,7 +413,7 @@ static void *send_thread(void *data) continue; if (stopping(stream)) { - if (packet.sys_dts_usec >= (int64_t)stream->stop_ts) { + if (can_shutdown_stream(stream, &packet)) { obs_free_encoder_packet(&packet); break; } @@ -931,7 +949,7 @@ static void rtmp_stream_defaults(obs_data_t *defaults) { obs_data_set_default_int(defaults, OPT_DROP_THRESHOLD, 500); obs_data_set_default_int(defaults, OPT_PFRAME_DROP_THRESHOLD, 800); - obs_data_set_default_int(defaults, OPT_MAX_SHUTDOWN_TIME_SEC, 5); + obs_data_set_default_int(defaults, OPT_MAX_SHUTDOWN_TIME_SEC, 30); obs_data_set_default_string(defaults, OPT_BIND_IP, "default"); }