summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2011-10-03 06:46:51 +0000
committerNanang Izzuddin <nanang@teluu.com>2011-10-03 06:46:51 +0000
commita1a6b84641a8f18d82106298b664e4654b1d0fab (patch)
treeffb87170ef877c6198b5cc0279b5b14a42ca6fd3
parent9463049c47d6ac9e6c833fa35461a9b7b9d7cb22 (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.c41
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.