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-delay.c b/libobs/obs-output-delay.c index 82812e9ddb0889..a71ab4d7700514 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 = { @@ -155,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..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,6 +382,23 @@ bool obs_output_start(obs_output_t *output) obs_service_initialize(output->service, output))) 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)) { + 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); } else { 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. 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);