From 714bb0a88150c45efbe93c4bb9e5f36c54ca09a4 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Tue, 7 May 2024 23:12:41 -0700 Subject: [PATCH 1/4] libobs: Remove unused `obs_output_signal_delay()` function It's not referenced anywhere, and not exported. --- libobs/obs-output-delay.c | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/libobs/obs-output-delay.c b/libobs/obs-output-delay.c index 82812e9ddb0889..bef5253a2df4ac 100644 --- a/libobs/obs-output-delay.c +++ b/libobs/obs-output-delay.c @@ -137,17 +137,6 @@ void process_delay(void *data, struct encoder_packet *packet) ; } -void obs_output_signal_delay(obs_output_t *output, const char *signal) -{ - struct calldata params; - uint8_t stack[128]; - - calldata_init_fixed(¶ms, stack, sizeof(stack)); - calldata_set_ptr(¶ms, "output", output); - calldata_set_int(¶ms, "sec", output->active_delay_ns / 1000000000); - signal_handler_signal(output->context.signals, signal, ¶ms); -} - bool obs_output_delay_start(obs_output_t *output) { struct delay_data dd = { From 57d4f8d439413773cdba1033390227b286407258 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 8 May 2024 00:41:14 -0700 Subject: [PATCH 2/4] libobs: Internalize unnecessarily-external output functions This performs two output start steps internal to libobs: - `obs_output_can_begin_data_capture()` - `obs_output_initialize_encoders()` Both functions are implemented at the beginning of the `.start` callback in every output except for mpegts (where this does not affect behavior anyway). As such, it is not useful to make outputs call these functions, so let's just call them ourselves. Calling these functions multiple times is safe, for outputs which still have the old calls implemented. --- libobs/obs-output-delay.c | 13 ------------- libobs/obs-output.c | 6 ++++++ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/libobs/obs-output-delay.c b/libobs/obs-output-delay.c index bef5253a2df4ac..a71ab4d7700514 100644 --- a/libobs/obs-output-delay.c +++ b/libobs/obs-output-delay.c @@ -144,25 +144,12 @@ bool obs_output_delay_start(obs_output_t *output) .ts = os_gettime_ns(), }; - if (!delay_active(output)) { - bool can_begin = obs_output_can_begin_data_capture(output, 0); - if (!can_begin) - return false; - if (!obs_output_initialize_encoders(output, 0)) - return false; - } - pthread_mutex_lock(&output->delay_mutex); deque_push_back(&output->delay_data, &dd, sizeof(dd)); pthread_mutex_unlock(&output->delay_mutex); os_atomic_inc_long(&output->delay_restart_refs); - if (delay_active(output)) { - do_output_signal(output, "starting"); - return true; - } - if (!obs_output_begin_data_capture(output, 0)) { obs_output_cleanup_delay(output); return false; diff --git a/libobs/obs-output.c b/libobs/obs-output.c index 8528fcb011a62f..db8be76ce5e064 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -378,6 +378,12 @@ bool obs_output_start(obs_output_t *output) obs_service_initialize(output->service, output))) return false; + if (!obs_output_can_begin_data_capture(output, 0)) + return false; + + if (flag_encoded(output) && !obs_output_initialize_encoders(output, 0)) + return false; + if (output->delay_sec) { return obs_output_delay_start(output); } else { From 86d668227a9bf670d9711e52142529d479a6780e Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 8 May 2024 00:50:10 -0700 Subject: [PATCH 3/4] plugins: Remove unnecessary usage of output check/init functions See previous commit for reasoning. --- plugins/obs-ffmpeg/obs-ffmpeg-hls-mux.c | 5 ----- plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c | 4 ---- plugins/obs-ffmpeg/obs-ffmpeg-mux.c | 10 ---------- plugins/obs-ffmpeg/obs-ffmpeg-output.c | 3 --- plugins/obs-outputs/flv-output.c | 5 ----- plugins/obs-outputs/ftl-stream.c | 7 ------- plugins/obs-outputs/null-output.c | 5 ----- plugins/obs-outputs/rtmp-stream.c | 5 ----- plugins/obs-webrtc/whip-output.cpp | 5 ----- 9 files changed, 49 deletions(-) diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-hls-mux.c b/plugins/obs-ffmpeg/obs-ffmpeg-hls-mux.c index 7fc984973f1ea4..0b4d8532a08cfa 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-hls-mux.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-hls-mux.c @@ -118,11 +118,6 @@ bool ffmpeg_hls_mux_start(void *data) obs_data_t *settings; int keyint_sec; - if (!obs_output_can_begin_data_capture(stream->output, 0)) - return false; - if (!obs_output_initialize_encoders(stream->output, 0)) - return false; - service = obs_output_get_service(stream->output); if (!service) return false; diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c b/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c index 69ec8a7c25ef4a..b06e303525847b 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-mpegts.c @@ -1050,10 +1050,6 @@ static bool set_config(struct ffmpeg_output *stream) } av_dump_format(ff_data->output, 0, NULL, 1); } - if (!obs_output_can_begin_data_capture(stream->output, 0)) - return false; - if (!obs_output_initialize_encoders(stream->output, 0)) - return false; ret = pthread_create(&stream->write_thread, NULL, write_thread, stream); if (ret != 0) { diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c index 111b48336b6242..b996c0b6d0d7b0 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-mux.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-mux.c @@ -412,11 +412,6 @@ static inline bool ffmpeg_mux_start_internal(struct ffmpeg_muxer *stream, update_encoder_settings(stream, path); - if (!obs_output_can_begin_data_capture(stream->output, 0)) - return false; - if (!obs_output_initialize_encoders(stream->output, 0)) - return false; - if (stream->is_network) { obs_service_t *service; service = obs_output_get_service(stream->output); @@ -1041,11 +1036,6 @@ static bool replay_buffer_start(void *data) { struct ffmpeg_muxer *stream = data; - if (!obs_output_can_begin_data_capture(stream->output, 0)) - return false; - if (!obs_output_initialize_encoders(stream->output, 0)) - return false; - obs_data_t *s = obs_output_get_settings(stream->output); stream->max_time = obs_data_get_int(s, "max_time_sec") * 1000000LL; stream->max_size = obs_data_get_int(s, "max_size_mb") * (1024 * 1024); diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c index 899f5e2d03b6ca..b4b419a176caca 100644 --- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c +++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c @@ -1212,9 +1212,6 @@ static bool try_connect(struct ffmpeg_output *output) output->active = true; - if (!obs_output_can_begin_data_capture(output->output, 0)) - return false; - ret = pthread_create(&output->write_thread, NULL, write_thread, output); if (ret != 0) { ffmpeg_log_error(LOG_WARNING, &output->ff_data, diff --git a/plugins/obs-outputs/flv-output.c b/plugins/obs-outputs/flv-output.c index 97a1b3d13bfd72..91849fdac228cd 100644 --- a/plugins/obs-outputs/flv-output.c +++ b/plugins/obs-outputs/flv-output.c @@ -456,11 +456,6 @@ static bool flv_output_start(void *data) obs_data_t *settings; const char *path; - if (!obs_output_can_begin_data_capture(stream->output, 0)) - return false; - if (!obs_output_initialize_encoders(stream->output, 0)) - return false; - stream->got_first_video = false; stream->sent_headers = false; os_atomic_set_bool(&stream->stopping, false); diff --git a/plugins/obs-outputs/ftl-stream.c b/plugins/obs-outputs/ftl-stream.c index ce628697f00028..d65916203a9d6d 100644 --- a/plugins/obs-outputs/ftl-stream.c +++ b/plugins/obs-outputs/ftl-stream.c @@ -641,13 +641,6 @@ static bool ftl_stream_start(void *data) obs_data_set_int(video_settings, "bf", 0); obs_data_release(video_settings); - if (!obs_output_can_begin_data_capture(stream->output, 0)) { - return false; - } - if (!obs_output_initialize_encoders(stream->output, 0)) { - return false; - } - stream->frames_sent = 0; os_atomic_set_bool(&stream->connecting, true); diff --git a/plugins/obs-outputs/null-output.c b/plugins/obs-outputs/null-output.c index c8997b3c32a63c..2646483b0bb784 100644 --- a/plugins/obs-outputs/null-output.c +++ b/plugins/obs-outputs/null-output.c @@ -51,11 +51,6 @@ static bool null_output_start(void *data) { struct null_output *context = data; - if (!obs_output_can_begin_data_capture(context->output, 0)) - return false; - if (!obs_output_initialize_encoders(context->output, 0)) - return false; - if (context->stop_thread_active) pthread_join(context->stop_thread, NULL); diff --git a/plugins/obs-outputs/rtmp-stream.c b/plugins/obs-outputs/rtmp-stream.c index 8903406ffda9b5..2ba76af69fd0e4 100644 --- a/plugins/obs-outputs/rtmp-stream.c +++ b/plugins/obs-outputs/rtmp-stream.c @@ -1462,11 +1462,6 @@ static bool rtmp_stream_start(void *data) { struct rtmp_stream *stream = data; - if (!obs_output_can_begin_data_capture(stream->output, 0)) - return false; - if (!obs_output_initialize_encoders(stream->output, 0)) - return false; - os_atomic_set_bool(&stream->connecting, true); return pthread_create(&stream->connect_thread, NULL, connect_thread, stream) == 0; diff --git a/plugins/obs-webrtc/whip-output.cpp b/plugins/obs-webrtc/whip-output.cpp index 56e087beec0867..67925bab5b84e1 100644 --- a/plugins/obs-webrtc/whip-output.cpp +++ b/plugins/obs-webrtc/whip-output.cpp @@ -54,11 +54,6 @@ bool WHIPOutput::Start() { std::lock_guard l(start_stop_mutex); - if (!obs_output_can_begin_data_capture(output, 0)) - return false; - if (!obs_output_initialize_encoders(output, 0)) - return false; - if (start_stop_thread.joinable()) start_stop_thread.join(); start_stop_thread = std::thread(&WHIPOutput::StartThread, this); From edc16310a5372ddc77f3c281d3ef9593046321f3 Mon Sep 17 00:00:00 2001 From: tt2468 Date: Wed, 8 May 2024 01:46:01 -0700 Subject: [PATCH 4/4] libobs: Deprecate old output functions Deprecates the following unnecessary functions: - `obs_output_can_begin_data_capture()` - `obs_output_initialize_encoders()` Both were made unnecessary to be called externally by prior commits, so we can now deprecate these functions. --- docs/sphinx/reference-outputs.rst | 6 ++++++ libobs/obs-output.c | 23 +++++++++++++++++++---- libobs/obs.h | 8 ++++---- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/docs/sphinx/reference-outputs.rst b/docs/sphinx/reference-outputs.rst index 5433eb057c5ebd..14b1c4184f19f4 100644 --- a/docs/sphinx/reference-outputs.rst +++ b/docs/sphinx/reference-outputs.rst @@ -912,6 +912,9 @@ Functions used by outputs :param flags: Reserved. Set this to 0. :return: *true* if data capture can begin +.. deprecated:: 30.2.0 + Usage is no longer necessary. + --------------------- .. function:: bool obs_output_initialize_encoders(obs_output_t *output, int flags) @@ -924,6 +927,9 @@ Functions used by outputs :param flags: Reserved. Set this to 0. :return: *true* if successful, *false* otherwise +.. deprecated:: 30.2.0 + Usage is no longer necessary. + --------------------- .. function:: bool obs_output_begin_data_capture(obs_output_t *output, int flags) diff --git a/libobs/obs-output.c b/libobs/obs-output.c index db8be76ce5e064..3708311c9611a7 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -366,6 +366,10 @@ bool obs_output_actual_start(obs_output_t *output) return success; } +static bool can_begin_data_capture(const struct obs_output *output); +static inline bool initialize_audio_encoders(obs_output_t *output); +static inline bool initialize_video_encoders(obs_output_t *output); + bool obs_output_start(obs_output_t *output) { if (!obs_output_valid(output, "obs_output_start")) @@ -378,11 +382,22 @@ bool obs_output_start(obs_output_t *output) obs_service_initialize(output->service, output))) return false; - if (!obs_output_can_begin_data_capture(output, 0)) - return false; + /* this block of logic is likely flawed. please investigate! */ + if (!delay_active(output)) { + if (active(output)) + return false; + if (data_capture_ending(output)) + pthread_join(output->end_data_capture_thread, NULL); + if (!can_begin_data_capture(output)) + return false; + } - if (flag_encoded(output) && !obs_output_initialize_encoders(output, 0)) - return false; + if (flag_encoded(output)) { + if (flag_audio(output) && !initialize_audio_encoders(output)) + return false; + if (flag_video(output) && !initialize_video_encoders(output)) + return false; + } if (output->delay_sec) { return obs_output_delay_start(output); diff --git a/libobs/obs.h b/libobs/obs.h index 5e65084f6e9b34..c3b10b2beff5d6 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -2344,12 +2344,12 @@ obs_output_set_audio_conversion(obs_output_t *output, const struct audio_convert_info *conversion); /** Returns whether data capture can begin */ -EXPORT bool obs_output_can_begin_data_capture(const obs_output_t *output, - uint32_t flags); +OBS_DEPRECATED EXPORT bool +obs_output_can_begin_data_capture(const obs_output_t *output, uint32_t flags); /** Initializes encoders (if any) */ -EXPORT bool obs_output_initialize_encoders(obs_output_t *output, - uint32_t flags); +OBS_DEPRECATED EXPORT bool obs_output_initialize_encoders(obs_output_t *output, + uint32_t flags); /** * Begins data capture from media/encoders.