Index: libspeex/jitter.c===================================================================--- libspeex/jitter.c (Revision 12625)+++ libspeex/jitter.c (Arbeitskopie)@@ -71,6 +71,7 @@ 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 lost_count; /**< Number of consecutive lost packets */ float shortterm_margin[MAX_MARGIN]; /**< Short term margin histogram */@@ -110,6 +111,7 @@ jitter->pointer_timestamp = 0; jitter->current_timestamp = 0; jitter->reset_state = 1;+ jitter->init_getcount = jitter->buffer_margin; /*the first get after buffer_margin calls to jitter_buffer_tick will get "real" data*/ jitter->lost_count = 0; jitter->loss_rate = 0; for (i=0;i<MAX_MARGIN;i++)@@ -190,6 +192,25 @@ jitter->span[i]=packet->span; jitter->len[i]=packet->len;+ if (jitter->init_getcount > 0) { /*We are still initialising, waiting for the buffer to grow*/+ int earliest = packet->timestamp;+ int latest = packet->timestamp + packet->span;+ int i;+ for(i = 0; i < SPEEX_JITTER_MAX_BUFFER_SIZE; ++i) {+ if(jitter->buf[i]) {+ if(jitter->timestamp[i] + 0xFF < earliest + 0xFF) { /* the first packet you receive can be 0xffffff00 to 0x00000000 */+ earliest = jitter->timestamp[i];+ }+ if(jitter->timestamp[i] + 0xFF + jitter->span[i] > latest + 0xFF) { /* the first packet you receive can be 0xffffff00 to 0x00000000 */+ latest = jitter->timestamp[i] + jitter->span[i];+ }+ }+ }+ if((latest - earliest) / jitter->tick_size > jitter->buffer_margin) { /*The buffer has grown enough, terminate initialisation*/+ jitter->init_getcount = 0;+ }+ }+ /* Adjust the buffer size depending on network conditions */ arrival_margin = (packet->timestamp - jitter->current_timestamp) - jitter->buffer_margin*jitter->tick_size;@@ -314,6 +335,10 @@ /*fprintf (stderr, "dropping packet (getting more aggressive)\n");*/ }+ if(jitter->init_getcount > 0) {+ /*fprintf(stderr, "buffering..., getcount = %d\n", jitter->init_getcount);*/+ 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 +449,27 @@ 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_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;