FreeCalypso > hg > themwi-rtp-lib
diff include/twjit.h @ 3:d10ea5dc61b3
twjit: initial import from previous work repository
The initial development of twjit was done in a private branch of
osmo-bts git repository; the intent was to prototype twjit in osmo-bts.
However, as I am getting a better feel for the full scope of the problem
(producing a replacement for libortp), I changed course to the present
themwi-rtp-lib (libtwrtp) approach.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 05 Jul 2024 18:50:48 +0000 |
parents | |
children | 668b84c52094 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/twjit.h Fri Jul 05 18:50:48 2024 +0000 @@ -0,0 +1,135 @@ +/* + * Themyscira Wireless jitter buffer implementation: definition of + * structures and API functions. + */ + +#pragma once + +#include <stdint.h> +#include <stdbool.h> + +#include <osmocom/core/linuxlist.h> +#include <osmocom/core/timer.h> + +/* + * twjit configuration tunings, usually set via vty. + */ +struct twrtp_jibuf_config { + /* buffer depth: starting minimum and high watermark */ + uint16_t bd_start; + uint16_t bd_hiwat; + /* interval for thinning of too-deep standing queue */ + uint16_t thinning_int; + /* guard against time traveler RTP packets */ + uint16_t max_future_sec; + /* min and max time delta in starting state, 0 means not set */ + uint16_t start_min_delta; + uint16_t start_max_delta; +}; + +/* + * Stats collected during the lifetime of a twjit instance. + */ +struct twrtp_jibuf_stats { + /* normal operation */ + uint32_t delivered_pkt; + uint32_t delivered_bytes; + uint32_t handovers; + /* undesirable, but not totally unexpected */ + uint32_t too_old; + uint32_t underruns; + uint32_t output_gaps; + uint32_t thinning_drops; + /* unusual error events */ + uint32_t bad_packets; + uint32_t duplicate_ts; + /* independent analysis of Rx packet stream */ + uint32_t ssrc_changes; + uint32_t seq_skips; + uint32_t seq_backwards; + uint32_t seq_repeats; + uint32_t intentional_gaps; + uint32_t ts_resets; +}; + +/* + * Each twjit instance has two sub-buffers; each subbuf is a queue of + * received RTP packets that have the same SSRC and whose timestamps + * increment in the expected cadence, with each ts delta being an + * integral multiple of the samples-per-quantum constant. + */ +struct twrtp_jibuf_sub { + uint32_t ssrc; + uint32_t head_ts; + struct llist_head queue; + uint32_t depth; + /* last packet arrival time, used only in starting state */ + struct timeval last_arrival; + uint32_t delta_ms; + /* thinning mechanism */ + uint16_t drop_int_count; + /* running config for this subbuf */ + struct twrtp_jibuf_config conf; +}; + +/* + * Each twjit instance is in one of 4 fundamental states at any moment, + * as enumerated here. + */ +enum twrtp_jibuf_state { + TWJIT_STATE_EMPTY, + TWJIT_STATE_HUNT, + TWJIT_STATE_FLOWING, + TWJIT_STATE_HANDOVER, +}; + +/* Main structure for one instance of twjit */ +struct twrtp_jibuf_inst { + /* pointer to config structure given to twrtp_jibuf_create(), + * memory must remain valid, but content can change at any time. */ + struct twrtp_jibuf_config *ext_config; + /* count of RTP timestamp units per quantum */ + uint32_t ts_quantum; + /* quanta per second, used to scale max_future_sec */ + uint32_t quanta_per_sec; + /* operational state */ + enum twrtp_jibuf_state state; + struct twrtp_jibuf_sub sb[2]; + uint8_t read_sb; /* 0 or 1 */ + uint8_t write_sb; /* ditto */ + /* Rx packet stream analysis */ + uint32_t last_ssrc; + uint32_t last_ts; + uint16_t last_seq; + bool got_first_packet; + /* stats over lifetime of this instance */ + struct twrtp_jibuf_stats stats; +}; + +/* twjit module API functions */ + +struct twrtp_jibuf_inst *twrtp_jibuf_create(void *ctx, uint16_t quantum_ms, + uint32_t quantum_ts_inc, + struct twrtp_jibuf_config *config); + +void twrtp_jibuf_destroy(struct twrtp_jibuf_inst *twjit); + +struct msgb; + +/* RTP input, takes ownership of msgb */ +void twrtp_jibuf_input(struct twrtp_jibuf_inst *twjit, struct msgb *msg); + +/* output function, to be called by TDM/GSM/etc fixed-timing side */ +struct msgb *twrtp_jibuf_output(struct twrtp_jibuf_inst *twjit); + +/* vty configuration functions */ + +void twrtp_jibuf_init_defaults(struct twrtp_jibuf_config *config); + +void twrtp_jibuf_vty_init(int twjit_node); + +struct vty; + +int twrtp_jibuf_config_write(struct vty *vty, + const struct twrtp_jibuf_config *conf, + const char *name, const char *prefix);