diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2011-10-03 06:46:51 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2011-10-03 06:46:51 +0000 |
commit | a1a6b84641a8f18d82106298b664e4654b1d0fab (patch) | |
tree | ffb87170ef877c6198b5cc0279b5b14a42ca6fd3 | |
parent | 9463049c47d6ac9e6c833fa35461a9b7b9d7cb22 (diff) |
Fix #1378: replaced discard rate decision based on overflow precentage (precentage of excess delay compared to burst-level).
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@3779 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjmedia/src/pjmedia/jbuf.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/pjmedia/src/pjmedia/jbuf.c b/pjmedia/src/pjmedia/jbuf.c index 244a82ad..e5295869 100644 --- a/pjmedia/src/pjmedia/jbuf.c +++ b/pjmedia/src/pjmedia/jbuf.c @@ -767,34 +767,33 @@ PJ_DEF(void) pjmedia_jbuf_put_frame2(pjmedia_jbuf *jb, #if PROGRESSIVE_DISCARD { unsigned interval, seq_delta; - unsigned burst_level, burst_factor; + unsigned burst_level = 0, overflow_pct = 0; - /* Calculating discard interval (aggressiveness) based on - * (current size / burst level). - */ + /* Calculating percentage of burst overflow */ if (jb->jb_status == JB_STATUS_PROCESSING) { burst_level = PJ_MAX(jb->jb_eff_level, jb->jb_level); - burst_factor = cur_size / burst_level; - /* Tolerate small spikes */ - if ((burst_level <= 5) && (burst_factor < 3)) - burst_factor = 0; - } else { - burst_factor = 0; + if (cur_size > (int)burst_level) + overflow_pct = (cur_size - burst_level) * 100 / burst_level; } - switch (burst_factor) { - case 0: + /* Deciding discard interval (aggressiveness) based on + * burst overflow percentage. + */ + if (burst_level <= 5 && overflow_pct < 200) { + /* Tolerate spikes on relatively small burst level */ interval = 0; - break; - case 1: - interval = 7; - break; - case 2: - interval = 5; - break; - default: + } else if (overflow_pct >= 200) { + /* Overflow >= 200% */ interval = 4; - break; + } else if (overflow_pct >= 100) { + /* Overflow >= 100% */ + interval = 5; + } else if (overflow_pct >= 10) { + /* Overflow >= 10% */ + interval = 7; + } else { + /* Overflow < 10%, tolerable */ + interval = 0; } /* Do the math now to see if we should discard this packet. |