summaryrefslogtreecommitdiffstats
path: root/src/roof-buffer.h
blob: a95dbaa797e401c433012b70ca1ffe5d67eb6cd7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#ifndef __ROOF_BUFFER_H
#define __ROOF_BUFFER_H

    // This IS harmful! Just for testing
#define ROOF_INDEPENDENT_STREAMS

#include <stdatomic.h>
#include <stdint.h>
#include "ufo-roof-config.h"

struct _RoofBuffer {
    guint64                     current_id;                             // The ID of the first (active) dataset in the buffer
#ifdef ROOF_INDEPENDENT_STREAMS
    guint64                     *first_id;                              // The ID of the first received dataset (used for numbering), -1 means not yet known
#else
    guint64                     first_id;                               // The ID of the first received dataset (used for numbering), -1 means not yet known
#endif
    guint64			*last_id;
    guint64			n_ready;

    guint			n_streams;
    guint                       ring_size;                              // Number of datasets to buffer
    guint			drop_buffers;				// If we need to catch up
    guint			latency_buffers;			// we skip incomplete buffers if current_id + latency_buffers is ready
    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)


    guint64			max_datasets;				// Only the specified number of datasets will be buffered, the rest will be silently dropped
    guint			n_dims;					// Indicates if we just assemble one fragment after another or there is 2D/3D data structure (ROOF)
    guint                       dataset_size;                           // Size (in bytes) of a full dataset
    guint			dataset_dims[2];			// x (in bytes), y (in rows)
    guint                       fragment_size;                          // Size (in bytes) of a single fragment (we expect fixed-size fragments at the moment)
    guint			fragment_dims[2];			// x (in bytes), y (in rows)

    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 _RoofBuffer	RoofBuffer;

RoofBuffer *roof_buffer_new(RoofConfig *cfg, guint n_dims, guint max_datasets, GError **error);
void roof_buffer_free(RoofBuffer *buf);

gboolean roof_buffer_set_fragment(RoofBuffer *buffer, guint stream_id, guint64 fragment_id, gconstpointer fragment, GError **error);
gboolean roof_buffer_skip_to_ready(RoofBuffer *buffer);
gboolean roof_buffer_get_dataset(RoofBuffer *buffer, gpointer output_buffer, gulong *seqid, GError **error);
gboolean roof_buffer_wait_dataset(RoofBuffer *buffer, gpointer output_buffer, gulong *seqid, gulong timeout, GError **error);

#endif