]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Improve behavior of jitterbuffer when maxjitterbuffer is set.
authorMatthew Nicholson <mnicholson@digium.com>
Tue, 10 Feb 2009 17:52:42 +0000 (17:52 +0000)
committerMatthew Nicholson <mnicholson@digium.com>
Tue, 10 Feb 2009 17:52:42 +0000 (17:52 +0000)
This change improves the way the jitterbuffer handles maxjitterbuffer and
dramatically reduces the number of frames dropped when maxjitterbuffer is
exceeded.  In the previous jitterbuffer, when maxjitterbuffer was exceeded, all
new frames were dropped until the jitterbuffer is empty.  This change modifies
the code to only drop frames until maxjitterbuffer is no longer exceeded.

Also, previously when maxjitterbuffer was exceeded, dropped frames were not
tracked causing stats for dropped frames to be incorrect, this change also
addresses that problem.

(closes issue #14044)
Patches:
      bug14044-1.diff uploaded by mnicholson (license 96)
Tested by: mnicholson
Review: http://reviewboard.digium.com/r/144/

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@174583 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/jitterbuf.c

index 849cffab534ac6ebe4c095aa34a349df73078d12..6a4172e07e692b6e0ca2bc94249a751457806aeb 100644 (file)
@@ -516,27 +516,33 @@ enum jb_return_code jb_put(jitterbuf *jb, void *data, const enum jb_frame_type t
 
        jb_dbg2("jb_put(%x,%x,%ld,%ld,%ld)\n", jb, data, ms, ts, now);
 
-       jb->info.frames_in++;
+       numts = 0;
+       if (jb->frames)
+               numts = jb->frames->prev->ts - jb->frames->ts;
 
-       if (jb->frames && jb->dropem) 
+       if (numts >= jb->info.conf.max_jitterbuf) {
+               if (!jb->dropem) {
+                       ast_log(LOG_DEBUG, "Attempting to exceed Jitterbuf max %ld timeslots\n",
+                               jb->info.conf.max_jitterbuf);
+                       jb->dropem = 1;
+               }
+               jb->info.frames_dropped++;
                return JB_DROP;
-       jb->dropem = 0;
+       } else {
+               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))
+               if (history_put(jb,ts,now,ms)) {
+                       jb->info.frames_dropped++;
                        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;
-       }
+
+       jb->info.frames_in++;
+
        /* if put into head of queue, caller needs to reschedule */
        if (queue_put(jb,data,type,ms,ts)) {
                return JB_SCHED;