aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/replay_buffer/replay_buffer_disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/replay_buffer/replay_buffer_disk.c')
-rw-r--r--src/replay_buffer/replay_buffer_disk.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/replay_buffer/replay_buffer_disk.c b/src/replay_buffer/replay_buffer_disk.c
index ffc59cc..56244f9 100644
--- a/src/replay_buffer/replay_buffer_disk.c
+++ b/src/replay_buffer/replay_buffer_disk.c
@@ -254,6 +254,36 @@ static uint8_t* gsr_replay_buffer_disk_iterator_get_packet_data(gsr_replay_buffe
return packet_data;
}
+static gsr_replay_buffer* gsr_replay_buffer_disk_take_data(gsr_replay_buffer *replay_buffer) {
+ gsr_replay_buffer_disk *self = (gsr_replay_buffer_disk*)replay_buffer;
+ gsr_replay_buffer_disk *destination = calloc(1, sizeof(gsr_replay_buffer_disk));
+ if(!destination)
+ return NULL;
+
+ gsr_replay_buffer_disk_set_impl_funcs(destination);
+
+ destination->replay_buffer_time = self->replay_buffer_time;
+ destination->storage_counter = self->storage_counter;
+ destination->storage_num_bytes_written = self->storage_num_bytes_written;
+ destination->storage_fd = self->storage_fd;
+
+ for(size_t i = 0; i < self->num_files; ++i) {
+ destination->files[i] = self->files[i];
+ }
+ destination->num_files = self->num_files;
+
+ snprintf(destination->replay_directory, sizeof(destination->replay_directory), "%s", self->replay_directory);
+ /* |self| keeps writing to the same directory, so it's the one that removes it */
+ destination->owns_directory = false;
+
+ self->num_files = 0;
+ self->storage_fd = 0;
+ self->storage_num_bytes_written = 0;
+ /* |storage_counter| is not reset, to not overwrite the files that were moved to |destination| */
+
+ return (gsr_replay_buffer*)destination;
+}
+
static gsr_replay_buffer* gsr_replay_buffer_disk_clone(gsr_replay_buffer *replay_buffer) {
gsr_replay_buffer_disk *self = (gsr_replay_buffer_disk*)replay_buffer;
gsr_replay_buffer_disk *destination = calloc(1, sizeof(gsr_replay_buffer_disk));
@@ -398,6 +428,7 @@ static void gsr_replay_buffer_disk_set_impl_funcs(gsr_replay_buffer_disk *self)
self->replay_buffer.iterator_get_packet = gsr_replay_buffer_disk_iterator_get_packet;
self->replay_buffer.iterator_get_packet_data = gsr_replay_buffer_disk_iterator_get_packet_data;
self->replay_buffer.clone = gsr_replay_buffer_disk_clone;
+ self->replay_buffer.take_data = gsr_replay_buffer_disk_take_data;
self->replay_buffer.find_packet_index_by_time_passed = gsr_replay_buffer_disk_find_file_index_by_time_passed;
self->replay_buffer.find_keyframe = gsr_replay_buffer_disk_find_keyframe;
self->replay_buffer.iterator_next = gsr_replay_buffer_disk_iterator_next;