summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2011-05-18 06:59:23 +0000
committerNanang Izzuddin <nanang@teluu.com>2011-05-18 06:59:23 +0000
commit8430f6d2bb89b06f3dde9c7c7bc876a5eb593005 (patch)
treeafe74d65c7d95a13bf6136c89f8f9998aea38111 /pjmedia
parent9d61f9ded11c24cef9c18962c65fda728e871568 (diff)
Fix #1258: Fixed bug in jitter buffer, i.e: unexpected state switches when prefetch mechanism is active, by separating prefetch mechanism from JB state.
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@3568 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/build/Jbtest.dat4
-rw-r--r--pjmedia/src/pjmedia/jbuf.c11
2 files changed, 8 insertions, 7 deletions
diff --git a/pjmedia/build/Jbtest.dat b/pjmedia/build/Jbtest.dat
index b2f4999d..af83185d 100644
--- a/pjmedia/build/Jbtest.dat
+++ b/pjmedia/build/Jbtest.dat
@@ -316,8 +316,8 @@ PGPGPGPGPGPGPGPGPGPG PGPGPGPGPGPGPGPGPGPG PGPGPGPGPG
= Fixed mode prefetch 5, with two empty events
%fixed 5
!burst 1
-!discard 0
-!lost 0
+!discard 4 <- the burst level is about 1, but prefetching will cause delay by 5 frames prefetching, delay adjustment may take place later on
+!lost 4 <- progressive discard drops frames as if they were lost
!empty 10
!delay 5
G
diff --git a/pjmedia/src/pjmedia/jbuf.c b/pjmedia/src/pjmedia/jbuf.c
index c045e882..244a82ad 100644
--- a/pjmedia/src/pjmedia/jbuf.c
+++ b/pjmedia/src/pjmedia/jbuf.c
@@ -119,6 +119,7 @@ struct pjmedia_jbuf
operation), the value may be
continuously updated based on
current frame burst level. */
+ pj_bool_t jb_prefetching; /**< flag if jbuf is prefetching. */
int jb_status; /**< status is 'init' until the first
'put' operation */
int jb_init_cycle_cnt; /**< status is 'init' until the first
@@ -140,7 +141,6 @@ struct pjmedia_jbuf
#define JB_STATUS_INITIALIZING 0
#define JB_STATUS_PROCESSING 1
-#define JB_STATUS_PREFETCHING 2
@@ -550,6 +550,7 @@ PJ_DEF(pj_status_t) pjmedia_jbuf_reset(pjmedia_jbuf *jb)
jb->jb_status = JB_STATUS_INITIALIZING;
jb->jb_init_cycle_cnt= 0;
jb->jb_max_hist_level= 0;
+ jb->jb_prefetching = (jb->jb_prefetch != 0);
jb_framelist_reset(&jb->jb_framelist);
@@ -860,11 +861,11 @@ PJ_DEF(void) pjmedia_jbuf_put_frame2(pjmedia_jbuf *jb,
*discarded = (status != PJ_SUCCESS);
if (status == PJ_SUCCESS) {
- if (jb->jb_status == JB_STATUS_PREFETCHING) {
+ if (jb->jb_prefetching) {
TRACE__((jb->jb_name.ptr, "PUT prefetch_cnt=%d/%d",
new_size, jb->jb_prefetch));
if (new_size >= jb->jb_prefetch)
- jb->jb_status = JB_STATUS_PROCESSING;
+ jb->jb_prefetching = PJ_FALSE;
}
jb->jb_level += (new_size > cur_size ? new_size-cur_size : 1);
jbuf_update(jb, JB_OP_PUT);
@@ -891,7 +892,7 @@ PJ_DEF(void) pjmedia_jbuf_get_frame2(pjmedia_jbuf *jb,
char *p_frame_type,
pj_uint32_t *bit_info)
{
- if (jb->jb_status == JB_STATUS_PREFETCHING) {
+ if (jb->jb_prefetching) {
/* Can't return frame because jitter buffer is filling up
* minimum prefetch.
@@ -938,7 +939,7 @@ PJ_DEF(void) pjmedia_jbuf_get_frame2(pjmedia_jbuf *jb,
} else {
/* Jitter buffer is empty */
if (jb->jb_prefetch)
- jb->jb_status = JB_STATUS_PREFETCHING;
+ jb->jb_prefetching = PJ_TRUE;
//pj_bzero(frame, jb->jb_frame_size);
*p_frame_type = PJMEDIA_JB_ZERO_EMPTY_FRAME;