Index: libspeex/jitter.c===================================================================--- libspeex/jitter.c (Revision 12625)+++ libspeex/jitter.c (Arbeitskopie)@@ -71,6 +71,8 @@ int tick_size; /**< Output granularity */ int reset_state; /**< True if state was just reset */ int buffer_margin; /**< How many frames we want to keep in the buffer (lower bound) */+ int init_getcount; /**< Countdown howmany gets will return silence to fill buffer */+ int init_putcount; /**< Countdown howmany gets will return silence to fill buffer */ int lost_count; /**< Number of consecutive lost packets */ float shortterm_margin[MAX_MARGIN]; /**< Short term margin histogram */@@ -110,6 +112,8 @@ jitter->pointer_timestamp = 0; jitter->current_timestamp = 0; jitter->reset_state = 1;+ jitter->init_getcount = jitter->buffer_margin; /*the buffer_margin + 1st call to jitter_buffer_get will get "real" data*/+ jitter->init_putcount = jitter->buffer_margin + 1; /*the first get after buffer_margin + 1 jitter_buffer_put calls will get "real" data*/ jitter->lost_count = 0; jitter->loss_rate = 0; for (i=0;i<MAX_MARGIN;i++)@@ -133,6 +137,9 @@ int i,j; spx_int32_t arrival_margin; /*fprintf (stderr, "put packet %d %d\n", timestamp, span);*/+ if (jitter->init_putcount > 0) {+ --jitter->init_putcount;+ } if (jitter->reset_state) { jitter->reset_state=0;@@ -314,6 +321,10 @@ /*fprintf (stderr, "dropping packet (getting more aggressive)\n");*/ }+ if(jitter->init_getcount > 0 && jitter->init_putcount > 0) {+ /*fprintf(stderr, "buffering..., getcount = %d, putcount = %d\n", jitter->init_getcount, jitter->init_putcount);*/+ return JITTER_BUFFER_MISSING;+ } /* Searching for the packet that fits best */ /* Search the buffer for a packet with the right timestamp and spanning the whole current chunk */@@ -424,16 +435,33 @@ void jitter_buffer_tick(JitterBuffer *jitter) {+ if (jitter->init_getcount > 0) {+ --jitter->init_getcount;+ } jitter->current_timestamp += jitter->tick_size; } /* Used like the ioctl function to control the jitter buffer parameters */ int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr) {+ int margin_diff; switch(request) { case JITTER_BUFFER_SET_MARGIN:+ margin_diff = *(spx_int32_t*)ptr - jitter->buffer_margin; jitter->buffer_margin = *(spx_int32_t*)ptr;+ if(jitter->init_putcount) {+ jitter->init_putcount = jitter->init_putcount + margin_diff;+ if(jitter->init_putcount < 0) {+ jitter->init_putcount = 0;+ }+ }+ if(jitter->init_getcount) {+ jitter->init_getcount = jitter->init_getcount + margin_diff;+ if(jitter->init_getcount < 0) {+ jitter->init_getcount = 0;+ }+ } break; case JITTER_BUFFER_GET_MARGIN: *(spx_int32_t*)ptr = jitter->buffer_margin;