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;ispan[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] < earliest) { + earliest = jitter->timestamp[i]; + } + if(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; + } + } + /* 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;