44 #define ASSERT(a) ast_assert(a)
63 static int resynch_jb(
struct fixed_jb *jb,
void *data,
long ms,
long ts,
long now);
81 jb->frames = fr->next;
83 jb->frames->prev = NULL;
90 jb->next_delivery = fr->delivery + fr->ms;
96 release_jb_frame(jb, fr);
114 if (conf->jbsize < 1)
115 conf->jbsize = FIXED_JB_SIZE_DEFAULT;
117 if (conf->resync_threshold < 1)
118 conf->resync_threshold = FIXED_JB_RESYNCH_THRESHOLD_DEFAULT;
121 jb->delay = conf->jbsize;
127 void fixed_jb_destroy(
struct fixed_jb *jb)
130 ASSERT(jb->frames == NULL);
136 static int resynch_jb(
struct fixed_jb *jb,
void *data,
long ms,
long ts,
long now)
144 ASSERT(jb->tail == NULL);
146 return fixed_jb_put_first(jb, data, ms, ts, now);
153 diff = ts - jb->tail->ts;
157 offset = diff - jb->tail->ms;
160 if (!jb->force_resynch && (offset < jb->conf.resync_threshold && offset > -jb->conf.resync_threshold))
161 return FIXED_JB_DROP;
164 jb->force_resynch = 0;
167 jb->rxcore -= offset;
175 return fixed_jb_put(jb, data, ms, ts, now);
179 void fixed_jb_set_force_resynch(
struct fixed_jb *jb)
181 jb->force_resynch = 1;
185 int fixed_jb_put_first(
struct fixed_jb *jb,
void *data,
long ms,
long ts,
long now)
188 jb->rxcore = now - ts;
191 jb->next_delivery = now + jb->delay;
194 return fixed_jb_put(jb, data, ms, ts, now);
197 int fixed_jb_put(
struct fixed_jb *jb,
void *data,
long ms,
long ts,
long now)
203 ASSERT(data != NULL);
209 delivery = jb->rxcore + jb->delay + ts;
212 if (delivery < jb->next_delivery) {
215 return resynch_jb(jb, data, ms, ts, now);
220 if (delivery > jb->next_delivery + jb->delay + jb->conf.resync_threshold) {
223 return resynch_jb(jb, data, ms, ts, now);
228 while (frame && frame->delivery > delivery) {
233 if (frame && (frame->delivery == delivery ||
234 delivery < frame->delivery + frame->ms ||
235 (frame->next && delivery + ms > frame->next->delivery)))
242 return resynch_jb(jb, data, ms, ts, now);
246 jb->force_resynch = 0;
249 newframe = alloc_jb_frame(jb);
250 newframe->data = data;
253 newframe->delivery = delivery;
258 frame->next = newframe;
260 newframe->next = next;
261 next->prev = newframe;
265 newframe->next = NULL;
267 newframe->prev = frame;
270 }
else if (!jb->frames) {
273 ASSERT(jb->tail == NULL);
274 jb->frames = jb->tail = newframe;
275 newframe->next = NULL;
276 newframe->prev = NULL;
281 newframe->next = jb->frames;
282 newframe->prev = NULL;
283 jb->frames->prev = newframe;
284 jb->frames = newframe;
294 ASSERT(interpl >= 2);
296 if (now < jb->next_delivery) {
298 return FIXED_JB_NOFRAME;
305 jb->next_delivery += interpl;
307 return FIXED_JB_INTERP;
311 if (now > jb->frames->delivery + jb->frames->ms) {
313 get_jb_head(jb, frame);
315 return FIXED_JB_DROP;
319 if (now < jb->frames->delivery) {
322 jb->next_delivery += interpl;
324 return FIXED_JB_INTERP;
328 get_jb_head(jb, frame);
334 long fixed_jb_next(
struct fixed_jb *jb)
336 return jb->next_delivery;
343 return FIXED_JB_NOFRAME;
345 get_jb_head(jb, frameout);
352 return jb->rxcore + jb->delay + ts < jb->next_delivery;
Asterisk main include file. File version handling, generic pbx functions.
private fixed_jb structure
All configuration options for http media cache.
#define ast_calloc(num, len)
A wrapper for calloc()
Jitterbuffering algorithm.
int fixed_jb_is_late(struct fixed_jb *jb, long ts)
Checks if the given time stamp is late.