|
|
|
|
@@ -36,7 +36,7 @@ static gsr_replay_buffer_file* gsr_replay_buffer_file_create(char *replay_direct
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char filename[PATH_MAX];
|
|
|
|
|
snprintf(filename, sizeof(filename), "%s/%s_%d.mp4", replay_directory, FILE_PREFIX, (int)replay_storage_counter);
|
|
|
|
|
snprintf(filename, sizeof(filename), "%s/%s_%d.gsr", replay_directory, FILE_PREFIX, (int)replay_storage_counter);
|
|
|
|
|
*replay_storage_fd = creat(filename, 0700);
|
|
|
|
|
if(*replay_storage_fd <= 0) {
|
|
|
|
|
fprintf(stderr, "gsr error: gsr_av_packet_file_init: failed to create replay file: %s\n", filename);
|
|
|
|
|
@@ -71,7 +71,7 @@ static void gsr_replay_buffer_file_free(gsr_replay_buffer_file *self, const char
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
char filename[PATH_MAX];
|
|
|
|
|
snprintf(filename, sizeof(filename), "%s/%s_%d.mp4", replay_directory, FILE_PREFIX, (int)self->id);
|
|
|
|
|
snprintf(filename, sizeof(filename), "%s/%s_%d.gsr", replay_directory, FILE_PREFIX, (int)self->id);
|
|
|
|
|
remove(filename);
|
|
|
|
|
|
|
|
|
|
if(self->packets) {
|
|
|
|
|
@@ -234,7 +234,7 @@ static uint8_t* gsr_replay_buffer_disk_iterator_get_packet_data(gsr_replay_buffe
|
|
|
|
|
|
|
|
|
|
if(file->fd <= 0) {
|
|
|
|
|
char filename[PATH_MAX];
|
|
|
|
|
snprintf(filename, sizeof(filename), "%s/%s_%d.mp4", self->replay_directory, FILE_PREFIX, (int)file->id);
|
|
|
|
|
snprintf(filename, sizeof(filename), "%s/%s_%d.gsr", self->replay_directory, FILE_PREFIX, (int)file->id);
|
|
|
|
|
file->fd = open(filename, O_RDONLY);
|
|
|
|
|
if(file->fd <= 0) {
|
|
|
|
|
fprintf(stderr, "gsr error: gsr_replay_buffer_disk_iterator_get_packet_data: failed to open file\n");
|
|
|
|
|
@@ -360,17 +360,20 @@ static gsr_replay_buffer_iterator gsr_replay_buffer_disk_find_keyframe(gsr_repla
|
|
|
|
|
gsr_replay_buffer_disk *self = (gsr_replay_buffer_disk*)replay_buffer;
|
|
|
|
|
gsr_replay_buffer_iterator keyframe_iterator = {(size_t)-1, 0};
|
|
|
|
|
gsr_replay_buffer_lock(&self->replay_buffer);
|
|
|
|
|
size_t packet_index = start_iterator.packet_index;
|
|
|
|
|
for(size_t file_index = start_iterator.file_index; file_index < self->num_files; ++file_index) {
|
|
|
|
|
const gsr_replay_buffer_file *file = self->files[file_index];
|
|
|
|
|
for(size_t packet_index = start_iterator.packet_index; packet_index < file->num_packets; ++packet_index) {
|
|
|
|
|
for(; packet_index < file->num_packets; ++packet_index) {
|
|
|
|
|
const gsr_av_packet_disk *packet = &file->packets[packet_index];
|
|
|
|
|
if((packet->packet.flags & AV_PKT_FLAG_KEY) && (invert_stream_index ? packet->packet.stream_index != stream_index : packet->packet.stream_index == stream_index)) {
|
|
|
|
|
keyframe_iterator.packet_index = packet_index;
|
|
|
|
|
keyframe_iterator.file_index = file_index;
|
|
|
|
|
break;
|
|
|
|
|
goto done;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
packet_index = 0;
|
|
|
|
|
}
|
|
|
|
|
done:
|
|
|
|
|
gsr_replay_buffer_unlock(&self->replay_buffer);
|
|
|
|
|
return keyframe_iterator;
|
|
|
|
|
}
|
|
|
|
|
|