All pastes #382070 Raw Edit

Anonymous

public c v1 · immutable
·published 2007-03-05 08:36 UTC
rendered paste body
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] + 0x100 < earliest + 0x100) { /* the first packet you receive can be 0xffffff00 to 0x00000000 */+               earliest = jitter->timestamp[i];+            }+            if(jitter->timestamp[i] + 0x100 + jitter->span[i] > latest + 0x100) { /* 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;