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;ipointer_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;ibuf[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;ibuf[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;