aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/recorder
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2026-08-07 13:53:40 +0200
committerdec05eba <dec05eba@protonmail.com>2026-08-07 13:53:40 +0200
commit90ac49f372f4c3d3d12f4d0d58ab0473a86821d5 (patch)
treed3faf489bc8bb5d9c67abda5a4f04d330ce42607 /src/recorder
parente31968fc4074df739c00947b993ee19be4ef1caa (diff)
Revert "Clear replay data in replay save thread to not block the main capture thread"
This reverts commit 5db30f3fb99545524fc80f87ecc488972aec1711.
Diffstat (limited to 'src/recorder')
-rw-r--r--src/recorder/recorder.c8
-rw-r--r--src/recorder/replay_save.c17
2 files changed, 8 insertions, 17 deletions
diff --git a/src/recorder/recorder.c b/src/recorder/recorder.c
index f24495c..901077c 100644
--- a/src/recorder/recorder.c
+++ b/src/recorder/recorder.c
@@ -752,9 +752,15 @@ static void recorder_poll_replay_save(gsr_recorder *self) {
atomic_store(&self->save_replay_seconds, 0);
const int restart_replay_request = atomic_exchange(&self->save_replay_restart_replay, GSR_RESTART_REPLAY_USE_OPTION);
const bool restart_replay = restart_replay_request == GSR_RESTART_REPLAY_USE_OPTION ? self->settings.restart_replay_on_save : restart_replay_request == GSR_RESTART_REPLAY_ENABLE;
- const bool replay_start_result = gsr_replay_save_start(&self->replay_save, self->video_codec_context, GSR_VIDEO_STREAM_INDEX, &self->audio_capture, &self->encoder, &self->settings, self->file_extension, self->hdr, self->video_sources, current_save_replay_seconds, restart_replay && current_save_replay_seconds == GSR_SAVE_REPLAY_SECONDS_FULL);
+ const bool replay_start_result = gsr_replay_save_start(&self->replay_save, self->video_codec_context, GSR_VIDEO_STREAM_INDEX, &self->audio_capture, &self->encoder, &self->settings, self->file_extension, self->hdr, self->video_sources, current_save_replay_seconds);
if(!replay_start_result && self->callbacks.replay_saved)
self->callbacks.replay_saved(NULL, self->callbacks.userdata);
+
+ if(restart_replay && current_save_replay_seconds == GSR_SAVE_REPLAY_SECONDS_FULL) {
+ pthread_mutex_lock(&self->encoder.replay_mutex);
+ gsr_replay_buffer_clear(self->encoder.replay_buffer);
+ pthread_mutex_unlock(&self->encoder.replay_mutex);
+ }
}
}
diff --git a/src/recorder/replay_save.c b/src/recorder/replay_save.c
index 55cf35d..3251616 100644
--- a/src/recorder/replay_save.c
+++ b/src/recorder/replay_save.c
@@ -23,15 +23,6 @@ static void gsr_replay_save_cleanup(gsr_replay_save *self) {
self->cloned_replay_buffer = NULL;
}
- /*
- This is the data that the replay buffer had before the replay was saved and nothing references it anymore,
- so it can be free'd without holding the replay mutex. This can take a while when the replay buffer is large.
- */
- if(self->restarted_replay_buffer_data) {
- gsr_replay_buffer_destroy(self->restarted_replay_buffer_data);
- self->restarted_replay_buffer_data = NULL;
- }
-
if(self->audio_pts_offsets) {
free(self->audio_pts_offsets);
self->audio_pts_offsets = NULL;
@@ -125,7 +116,7 @@ static void* replay_save_thread(void *userdata) {
return NULL;
}
-bool gsr_replay_save_start(gsr_replay_save *self, AVCodecContext *video_codec_context, int video_stream_index, const gsr_audio_capture *audio_capture, gsr_encoder *encoder, const gsr_recorder_settings *settings, const char *file_extension, bool hdr, gsr_video_sources *video_sources, int current_save_replay_seconds, bool restart_replay) {
+bool gsr_replay_save_start(gsr_replay_save *self, AVCodecContext *video_codec_context, int video_stream_index, const gsr_audio_capture *audio_capture, gsr_encoder *encoder, const gsr_recorder_settings *settings, const char *file_extension, bool hdr, gsr_video_sources *video_sources, int current_save_replay_seconds) {
if(self->thread_created)
return true;
@@ -134,16 +125,10 @@ bool gsr_replay_save_start(gsr_replay_save *self, AVCodecContext *video_codec_co
self->video_stream_index = video_stream_index;
self->output_filepath[0] = '\0';
self->success = false;
- self->restarted_replay_buffer_data = NULL;
atomic_store(&self->finished, 0);
pthread_mutex_lock(&encoder->replay_mutex);
self->cloned_replay_buffer = gsr_replay_buffer_clone(encoder->replay_buffer);
- if(self->cloned_replay_buffer && restart_replay) {
- self->restarted_replay_buffer_data = gsr_replay_buffer_take_data(encoder->replay_buffer);
- if(!self->restarted_replay_buffer_data)
- gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_replay_save: failed to restart the replay buffer");
- }
pthread_mutex_unlock(&encoder->replay_mutex);
if(!self->cloned_replay_buffer) {
/* TODO: Return this error to mark the replay as failed */