From ea03a11e25ad5c10fd4191d0d76b72bee3f58bb1 Mon Sep 17 00:00:00 2001
From: Mark Spencer <markster@digium.com>
Date: Mon, 9 May 2005 13:56:43 +0000
Subject: [PATCH] Jitter buffer improvements (bug #4167)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5610 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 jitterbuf.c | 11 +++++++----
 jitterbuf.h |  4 ++++
 2 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/jitterbuf.c b/jitterbuf.c
index 365ec44f09..e319776ca0 100755
--- a/jitterbuf.c
+++ b/jitterbuf.c
@@ -489,7 +489,7 @@ static int _jb_get(jitterbuf *jb, jb_frame *frameout, long now)
 
 
 	/* target */
-	jb->info.target = jb->info.jitter + jb->info.min + 2 * jb->info.last_voice_ms; 
+	jb->info.target = jb->info.jitter + jb->info.min + JB_TARGET_EXTRA; 
 
 	/* if a hard clamp was requested, use it */
 	if ((jb->info.max_jitterbuf) && ((jb->info.target - jb->info.min) > jb->info.max_jitterbuf)) {
@@ -509,8 +509,8 @@ static int _jb_get(jitterbuf *jb, jb_frame *frameout, long now)
 	if (!jb->info.silence) { 
 		/* we want to grow */
 		if ((diff > 0) && 
-			/* we haven't grown in 2 frames' length */
-			(((jb->info.last_adjustment + 2 * jb->info.last_voice_ms ) < now) || 
+			/* we haven't grown in the delay length */
+			(((jb->info.last_adjustment + JB_ADJUST_DELAY) < now) || 
 			/* we need to grow more than the "length" we have left */
 			(diff > queue_last(jb)  - queue_next(jb)) ) ) {
 			
@@ -558,7 +558,10 @@ static int _jb_get(jitterbuf *jb, jb_frame *frameout, long now)
 		}
 
 		/* we want to shrink; shrink at 1 frame / 500ms */
-		if (diff < -2 * jb->info.last_voice_ms && 
+		/* unless we don't have a frame, then shrink 1 frame */
+		/* every 80ms (though perhaps we can shrink even faster */
+		/* in this case) */
+		if (diff < -JB_TARGET_EXTRA && 
 		((!frame && jb->info.last_adjustment + 80 < now) || 
 			(jb->info.last_adjustment + 500 < now))) {
 
diff --git a/jitterbuf.h b/jitterbuf.h
index 926a3d19ab..aa73e805b8 100755
--- a/jitterbuf.h
+++ b/jitterbuf.h
@@ -30,6 +30,10 @@ extern "C" {
 #define JB_HISTORY_DROPPCT_MAX	4
 	/* the size of the buffer we use to keep the top and botton timestamps for dropping */
 #define JB_HISTORY_MAXBUF_SZ	JB_HISTORY_SZ * JB_HISTORY_DROPPCT_MAX / 100 
+	/* amount of additional jitterbuffer adjustment  */
+#define JB_TARGET_EXTRA 40
+	/* ms between growing and shrinking; may not be honored if jitterbuffer runs out of space */
+#define JB_ADJUST_DELAY 40
 
 
 /* return codes */
-- 
GitLab