Index: libspeex/jitter.c===================================================================--- libspeex/jitter.c (Revision 12648)+++ 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 = 0x10 + jitter->buffer_margin; /*if after buffer_margin + 16 ticks we still haven't buffered enough, we drop out of prebuffering anyways*/ jitter->lost_count = 0; jitter->loss_rate = 0; for (i=0;i<MAX_MARGIN;i++)@@ -181,6 +183,30 @@ } /*fprintf (stderr, "Buffer is full, discarding earliest frame %d (currently at %d)\n", timestamp, jitter->pointer_timestamp);*/ }+ 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(LT32(jitter->timestamp[i], earliest))+ {+ earliest = jitter->timestamp[i];+ }+ if(GT32(jitter->timestamp[i] + jitter->span[i], latest))+ {+ 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;+ }+ } /* Copy packet in buffer */ jitter->buf[i]=(char*)speex_alloc(packet->len);@@ -192,7 +218,7 @@ /* Adjust the buffer size depending on network conditions. The arrival margin is how much in advance (or late) the packet it */- arrival_margin = (packet->timestamp - jitter->current_timestamp) - jitter->buffer_margin*jitter->tick_size;+ arrival_margin = (packet->timestamp - jitter->current_timestamp); if (arrival_margin >= -LATE_BINS*jitter->tick_size) {@@ -289,7 +315,7 @@ /* Adjusting the buffering bssed on the amount of packets that are early/on time/late */- if (late_ratio_short > .1 || late_ratio_long > .03)+ if (jitter->init_getcount || late_ratio_short > .1 || late_ratio_long > .03) { /* If too many packets are arriving late */ jitter->shortterm_margin[MAX_MARGIN-1] += jitter->shortterm_margin[MAX_MARGIN-2];@@ -338,7 +364,7 @@ { for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) {- if (jitter->buf[i] && jitter->timestamp[i]<=jitter->pointer_timestamp && GE32(jitter->timestamp[i]+jitter->span[i],jitter->pointer_timestamp+chunk_size))+ if (jitter->buf[i] && LE32(jitter->timestamp[i], jitter->pointer_timestamp) && GE32(jitter->timestamp[i]+jitter->span[i],jitter->pointer_timestamp+chunk_size)) break; } }@@ -348,7 +374,7 @@ { for (i=0;i<SPEEX_JITTER_MAX_BUFFER_SIZE;i++) {- if (jitter->buf[i] && jitter->timestamp[i]<=jitter->pointer_timestamp && GT32(jitter->timestamp[i]+jitter->span[i],jitter->pointer_timestamp))+ if (jitter->buf[i] && LE32(jitter->timestamp[i], jitter->pointer_timestamp) && GT32(jitter->timestamp[i]+jitter->span[i],jitter->pointer_timestamp)) break; } }@@ -434,16 +460,28 @@ 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;