All pastes #382245 Raw Edit

Mine

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