summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/jitterbuf.h2
-rw-r--r--main/jitterbuf.c16
2 files changed, 16 insertions, 2 deletions
diff --git a/include/jitterbuf.h b/include/jitterbuf.h
index 480934692..d2635f3f0 100644
--- a/include/jitterbuf.h
+++ b/include/jitterbuf.h
@@ -104,7 +104,7 @@ typedef struct jitterbuf {
long hist_maxbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the max delays (highest first) */
long hist_minbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the min delays (lowest first) */
int hist_maxbuf_valid; /* are the "maxbuf"/minbuf valid? */
-
+ unsigned int dropem:1; /* flag to indicate dropping frames (overload) */
jb_frame *frames; /* queued frames */
jb_frame *free; /* free frames (avoid malloc?) */
diff --git a/main/jitterbuf.c b/main/jitterbuf.c
index 189be3451..f41e0d382 100644
--- a/main/jitterbuf.c
+++ b/main/jitterbuf.c
@@ -512,17 +512,31 @@ static void jb_dbgqueue(jitterbuf *jb)
enum jb_return_code jb_put(jitterbuf *jb, void *data, const enum jb_frame_type type, long ms, long ts, long now)
{
+ long numts;
+
jb_dbg2("jb_put(%x,%x,%ld,%ld,%ld)\n", jb, data, ms, ts, now);
jb->info.frames_in++;
+ if (jb->frames && jb->dropem)
+ return JB_DROP;
+ jb->dropem = 0;
+
if (type == JB_TYPE_VOICE) {
/* presently, I'm only adding VOICE frames to history and drift calculations; mostly because with the
* IAX integrations, I'm sending retransmitted control frames with their awkward timestamps through */
if (history_put(jb,ts,now,ms))
return JB_DROP;
}
-
+ numts = 0;
+ if (jb->frames)
+ numts = jb->frames->prev->ts - jb->frames->ts;
+ if (numts >= jb->info.conf.max_jitterbuf) {
+ ast_log(LOG_DEBUG, "Attempting to exceed Jitterbuf max %ld timeslots\n",
+ jb->info.conf.max_jitterbuf);
+ jb->dropem = 1;
+ return JB_DROP;
+ }
/* if put into head of queue, caller needs to reschedule */
if (queue_put(jb,data,type,ms,ts)) {
return JB_SCHED;