61 lines
1.7 KiB
C
61 lines
1.7 KiB
C
|
|
#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 {
|
|
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;
|
|
int extra_timeout_max;
|
|
int extra_timeout_count;
|
|
|
|
/* list of frames */
|
|
jitter_frame_t *frame_list;
|
|
} jitter_t;
|
|
|
|
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);
|
|
|