rendered paste bodyIndex: libspeex/jitter.c===================================================================--- libspeex/jitter.c (Revision 12644)+++ 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,24 @@ } /*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 +212,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 +309,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];@@ -304,7 +324,7 @@ jitter->pointer_timestamp -= jitter->tick_size; jitter->current_timestamp -= jitter->tick_size; /*fprintf (stderr, "i");*/- /*fprintf (stderr, "interpolate (getting some slack)\n");*/+ printf ("interpolate (getting some slack)\n"); } else if (late_ratio_short + ontime_ratio_short < .005 && late_ratio_long + ontime_ratio_long < .01 && early_ratio_short > .8) { /* Many frames arriving early */@@ -330,7 +350,9 @@ 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))+ { break;+ } } /* If no match, try for an "older" packet that still spans (fully) the current chunk */@@ -338,8 +360,13 @@ { 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] && LT32(jitter->timestamp[i], jitter->pointer_timestamp) && GE32(jitter->timestamp[i]+jitter->span[i],jitter->pointer_timestamp+chunk_size)) {+ printf("older which spans, tickstamp[i]=%d, tickspan[i]=%d, pointer_timestamp=%d, chunk_size = 1\n",+ jitter->timestamp[i] / jitter->tick_size,+ jitter->span[i] / jitter->tick_size,+ jitter->pointer_timestamp); break;+ } } } @@ -348,8 +375,10 @@ { 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] && LT32(jitter->timestamp[i], jitter->pointer_timestamp) && GT32(jitter->timestamp[i]+jitter->span[i],jitter->pointer_timestamp)) {+ printf("older which spans partially\n"); break;+ } } } @@ -376,6 +405,7 @@ } if (found) {+ printf("earliest possible\n"); i=besti; incomplete = 1; /*fprintf (stderr, "incomplete: %d %d %d %d\n", jitter->timestamp[i], jitter->pointer_timestamp, chunk_size, jitter->span[i]);*/@@ -434,16 +464,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;