All pastes #382306 Raw Edit

Someone

public c v1 · immutable
·published 2007-03-05 14:49 UTC
rendered paste body
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;