From 8430f6d2bb89b06f3dde9c7c7bc876a5eb593005 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Wed, 18 May 2011 06:59:23 +0000 Subject: 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 --- pjmedia/build/Jbtest.dat | 4 ++-- pjmedia/src/pjmedia/jbuf.c | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) (limited to 'pjmedia') 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; -- cgit v1.2.3