aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-02-10 18:16:31 +0000
committermnicholson <mnicholson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-02-10 18:16:31 +0000
commit631397bd7e1eef768bd903b3e9c0dae115890a82 (patch)
treea4f68977f908aa911ab753db34e490ccbf1035a9
parentfff38ff0e6fa019c31c4ef5307af492c0cde6c64 (diff)
Merged revisions 174583 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r174583 | mnicholson | 2009-02-10 11:52:42 -0600 (Tue, 10 Feb 2009) | 18 lines Improve behavior of jitterbuffer when maxjitterbuffer is set. 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: http://svn.digium.com/svn/asterisk/trunk@174584 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--main/jitterbuf.c32
1 files changed, 19 insertions, 13 deletions
diff --git a/main/jitterbuf.c b/main/jitterbuf.c
index 834be8781..867b6948b 100644
--- a/main/jitterbuf.c
+++ b/main/jitterbuf.c
@@ -510,27 +510,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_debug(1, "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_debug(1, "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;