init
This commit is contained in:
54
include/replay_buffer/replay_buffer.h
Normal file
54
include/replay_buffer/replay_buffer.h
Normal file
@ -0,0 +1,54 @@
|
||||
#ifndef GSR_REPLAY_BUFFER_H
|
||||
#define GSR_REPLAY_BUFFER_H
|
||||
|
||||
#include "../defs.h"
|
||||
#include <pthread.h>
|
||||
#include <stdbool.h>
|
||||
#include <libavcodec/packet.h>
|
||||
|
||||
typedef struct gsr_replay_buffer gsr_replay_buffer;
|
||||
|
||||
typedef struct {
|
||||
size_t packet_index;
|
||||
size_t file_index;
|
||||
} gsr_replay_buffer_iterator;
|
||||
|
||||
struct gsr_replay_buffer {
|
||||
void (*destroy)(gsr_replay_buffer *self);
|
||||
bool (*append)(gsr_replay_buffer *self, const AVPacket *av_packet, double timestamp);
|
||||
void (*clear)(gsr_replay_buffer *self);
|
||||
AVPacket* (*iterator_get_packet)(gsr_replay_buffer *self, gsr_replay_buffer_iterator iterator);
|
||||
/* The returned data should be free'd with free */
|
||||
uint8_t* (*iterator_get_packet_data)(gsr_replay_buffer *self, gsr_replay_buffer_iterator iterator);
|
||||
/* The clone has to be destroyed before the replay buffer it clones is destroyed */
|
||||
gsr_replay_buffer* (*clone)(gsr_replay_buffer *self);
|
||||
/* Returns {0, 0} if replay buffer is empty */
|
||||
gsr_replay_buffer_iterator (*find_packet_index_by_time_passed)(gsr_replay_buffer *self, int seconds);
|
||||
/* Returns {-1, 0} if not found */
|
||||
gsr_replay_buffer_iterator (*find_keyframe)(gsr_replay_buffer *self, gsr_replay_buffer_iterator start_iterator, int stream_index, bool invert_stream_index);
|
||||
bool (*iterator_next)(gsr_replay_buffer *self, gsr_replay_buffer_iterator *iterator);
|
||||
|
||||
pthread_mutex_t mutex;
|
||||
bool mutex_initialized;
|
||||
gsr_replay_buffer *original_replay_buffer;
|
||||
};
|
||||
|
||||
gsr_replay_buffer* gsr_replay_buffer_create(gsr_replay_storage replay_storage, const char *replay_directory, double replay_buffer_time, size_t replay_buffer_num_packets);
|
||||
void gsr_replay_buffer_destroy(gsr_replay_buffer *self);
|
||||
|
||||
void gsr_replay_buffer_lock(gsr_replay_buffer *self);
|
||||
void gsr_replay_buffer_unlock(gsr_replay_buffer *self);
|
||||
bool gsr_replay_buffer_append(gsr_replay_buffer *self, const AVPacket *av_packet, double timestamp);
|
||||
void gsr_replay_buffer_clear(gsr_replay_buffer *self);
|
||||
AVPacket* gsr_replay_buffer_iterator_get_packet(gsr_replay_buffer *self, gsr_replay_buffer_iterator iterator);
|
||||
/* The returned data should be free'd with free */
|
||||
uint8_t* gsr_replay_buffer_iterator_get_packet_data(gsr_replay_buffer *self, gsr_replay_buffer_iterator iterator);
|
||||
/* The clone has to be destroyed before the replay buffer it clones is destroyed */
|
||||
gsr_replay_buffer* gsr_replay_buffer_clone(gsr_replay_buffer *self);
|
||||
/* Returns {0, 0} if replay buffer is empty */
|
||||
gsr_replay_buffer_iterator gsr_replay_buffer_find_packet_index_by_time_passed(gsr_replay_buffer *self, int seconds);
|
||||
/* Returns {-1, 0} if not found */
|
||||
gsr_replay_buffer_iterator gsr_replay_buffer_find_keyframe(gsr_replay_buffer *self, gsr_replay_buffer_iterator start_iterator, int stream_index, bool invert_stream_index);
|
||||
bool gsr_replay_buffer_iterator_next(gsr_replay_buffer *self, gsr_replay_buffer_iterator *iterator);
|
||||
|
||||
#endif /* GSR_REPLAY_BUFFER_H */
|
||||
44
include/replay_buffer/replay_buffer_disk.h
Normal file
44
include/replay_buffer/replay_buffer_disk.h
Normal file
@ -0,0 +1,44 @@
|
||||
#ifndef GSR_REPLAY_BUFFER_DISK_H
|
||||
#define GSR_REPLAY_BUFFER_DISK_H
|
||||
|
||||
#include "replay_buffer.h"
|
||||
#include <limits.h>
|
||||
|
||||
#define GSR_REPLAY_BUFFER_CAPACITY_NUM_FILES 1024
|
||||
|
||||
typedef struct {
|
||||
AVPacket packet;
|
||||
size_t data_index;
|
||||
double timestamp;
|
||||
} gsr_av_packet_disk;
|
||||
|
||||
typedef struct {
|
||||
size_t id;
|
||||
double start_timestamp;
|
||||
double end_timestamp;
|
||||
int ref_counter;
|
||||
int fd;
|
||||
|
||||
gsr_av_packet_disk *packets;
|
||||
size_t capacity_num_packets;
|
||||
size_t num_packets;
|
||||
} gsr_replay_buffer_file;
|
||||
|
||||
typedef struct {
|
||||
gsr_replay_buffer replay_buffer;
|
||||
double replay_buffer_time;
|
||||
|
||||
size_t storage_counter;
|
||||
size_t storage_num_bytes_written;
|
||||
int storage_fd;
|
||||
gsr_replay_buffer_file *files[GSR_REPLAY_BUFFER_CAPACITY_NUM_FILES]; // GSR_REPLAY_BUFFER_CAPACITY_NUM_FILES * REPLAY_BUFFER_FILE_SIZE_BYTES = 256gb, should be enough for everybody
|
||||
size_t num_files;
|
||||
|
||||
char replay_directory[PATH_MAX];
|
||||
|
||||
bool owns_directory;
|
||||
} gsr_replay_buffer_disk;
|
||||
|
||||
gsr_replay_buffer* gsr_replay_buffer_disk_create(const char *replay_directory, double replay_buffer_time);
|
||||
|
||||
#endif /* GSR_REPLAY_BUFFER_DISK_H */
|
||||
22
include/replay_buffer/replay_buffer_ram.h
Normal file
22
include/replay_buffer/replay_buffer_ram.h
Normal file
@ -0,0 +1,22 @@
|
||||
#ifndef GSR_REPLAY_BUFFER_RAM_H
|
||||
#define GSR_REPLAY_BUFFER_RAM_H
|
||||
|
||||
#include "replay_buffer.h"
|
||||
|
||||
typedef struct {
|
||||
AVPacket packet;
|
||||
int ref_counter;
|
||||
double timestamp;
|
||||
} gsr_av_packet_ram;
|
||||
|
||||
typedef struct {
|
||||
gsr_replay_buffer replay_buffer;
|
||||
gsr_av_packet_ram **packets;
|
||||
size_t capacity_num_packets;
|
||||
size_t num_packets;
|
||||
size_t index;
|
||||
} gsr_replay_buffer_ram;
|
||||
|
||||
gsr_replay_buffer* gsr_replay_buffer_ram_create(size_t replay_buffer_num_packets);
|
||||
|
||||
#endif /* GSR_REPLAY_BUFFER_RAM_H */
|
||||
Reference in New Issue
Block a user