#ifndef __UFO_ROOF_BUFFER_H #define __UFO_ROOF_BUUFER_H #include struct _UfoRoofBuffer { guint current_id; // The ID of the first (active) dataset in the buffer guint ring_size; // Number of datasets to buffer guint drop_buffers; // If we need to catch up uint8_t *ring_buffer; // The ring buffer _Atomic guint *n_fragments; // Number of completed fragments in each buffer guint *stream_fragment; // Currently processed fragment in the stream (for ordered streams) // int *fragments; // Mark individual completed fragments (if we care for partial data) guint max_datasets; // Only the specified number of datasets will be buffered, the rest will be silently dropped guint dataset_size; // Size (in bytes) of a full dataset guint fragment_size; // Size (in bytes) of a single fragment (we expect fixed-size fragments at the moment) guint fragments_per_dataset; // Number of packets in dataset (used to compute when dataset is ready) guint fragments_per_stream; // Number of packets in each of data streams (used to compute when dataset is ready) }; typedef struct _UfoRoofBuffer UfoRoofBuffer; UfoRoofBuffer *ufo_roof_buffer_new(UfoRoofConfig *cfg, guint max_datasets, GError **error); void ufo_roof_buffer_free(UfoRoofBuffer *buf); gboolean ufo_roof_buffer_set_fragment(UfoRoofBuffer *buffer, guint stream_id, guint fragment_id, gconstpointer fragment, GError **error); gboolean ufo_roof_buffer_get_dataset(UfoRoofBuffer *buffer, gpointer output_buffer, GError **error); #endif