diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2022-07-31 07:55:14 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2022-10-23 16:56:27 +0200 |
commit | 2b7efedc483362d3afc2ae71dfb716ac5427f600 (patch) | |
tree | 675898699f0cd411fee8af8435b5b13ad9784234 /src/libjitter/jitter.h | |
parent | 4fc92eba45a9c197317bdea02d9811c784d77775 (diff) |
Refactoring jitter buffer
Features are:
* Packet based buffer
* Random in, first out
* Adaptive delay compensation (voice)
* Fixed delay (data, optionally MODEM/FAX)
* Interpolation of missing frames
* Any sample size
Diffstat (limited to 'src/libjitter/jitter.h')
-rw-r--r-- | src/libjitter/jitter.h | 62 |
1 files changed, 53 insertions, 9 deletions
diff --git a/src/libjitter/jitter.h b/src/libjitter/jitter.h index e344d8a..b4cb15f 100644 --- a/src/libjitter/jitter.h +++ b/src/libjitter/jitter.h @@ -1,14 +1,58 @@ +#define JITTER_FLAG_NONE 0 // no flags at all +#define JITTER_FLAG_LATENCY (1 << 0) // keep latency close to target_window_duration +#define JITTER_FLAG_REPEAT (1 << 1) // repeat audio to extrapolate gaps + +/* window settings for low latency audio and extrapolation of gaps */ +#define JITTER_AUDIO 0.050, 1.000, JITTER_FLAG_LATENCY | JITTER_FLAG_REPEAT +/* window settings for analog data (fax/modem) or digial data (HDLC) */ +#define JITTER_DATA 0.100, 0.200, JITTER_FLAG_NONE + +typedef struct jitter_frame { + struct jitter_frame *next; + uint16_t sequence; + uint32_t timestamp; + int length; + uint8_t samples[0]; +} jitter_frame_t; + typedef struct jitter { - sample_t *spl; /* pointer to sample buffer */ - int len; /* buffer size: number of samples */ - int inptr, outptr; /* write pointer and read pointer */ + char name[64]; + + /* sample properties */ + int sample_size; + double sample_duration; + + /* automatic sequence generation */ + uint16_t next_sequence; + uint32_t next_timestamp; + + /* window properties */ + int unlocked; + uint32_t window_flags; + int target_window_size; + int max_window_size; + int window_valid; + uint32_t window_ssrc; + uint32_t window_timestamp; + + /* reduction of delay */ + double delay_interval; + double delay_counter; + int32_t min_delay_value; + + /* extrapolation */ + int extra_size; + int extra_index; + void *extra_samples; + + /* list of frames */ + jitter_frame_t *frame_list; } jitter_t; -int jitter_create(jitter_t *jitter, int length); -void jitter_reset(jitter_t *jitter); -void jitter_destroy(jitter_t *jitter); -void jitter_save(jitter_t *jb, sample_t *samples, int length); -void jitter_load(jitter_t *jb, sample_t *samples, int length); -void jitter_clear(jitter_t *jb); +int jitter_create(jitter_t *jb, const char *name, double samplerate, int sample_size, double target_window_duration, double max_window_duration, uint32_t window_flags); +void jitter_reset(jitter_t *jb); +void jitter_destroy(jitter_t *jb); +void jitter_save(jitter_t *jb, void *samples, int length, int has_sequence, uint16_t sequence, uint32_t timestamp, uint32_t ssrc); +void jitter_load(jitter_t *jb, void *samples, int length); |