All pastes #381997 Raw Edit

Stuff

public c v1 · immutable
·published 2007-03-05 06:24 UTC
rendered paste body
Index: libspeex/jitter.c===================================================================--- libspeex/jitter.c	(Revision 12625)+++ libspeex/jitter.c	(Arbeitskopie)@@ -71,6 +71,8 @@    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 init_putcount;                                                     /**< 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 +112,8 @@    jitter->pointer_timestamp = 0;    jitter->current_timestamp = 0;    jitter->reset_state = 1;+   jitter->init_getcount = jitter->buffer_margin; /*the buffer_margin + 1st call to jitter_buffer_get will get "real" data*/+   jitter->init_putcount = jitter->buffer_margin + 1; /*the first get after buffer_margin + 1 jitter_buffer_put calls will get "real" data*/    jitter->lost_count = 0;    jitter->loss_rate = 0;    for (i=0;i<MAX_MARGIN;i++)@@ -133,6 +137,9 @@    int i,j;    spx_int32_t arrival_margin;    /*fprintf (stderr, "put packet %d %d\n", timestamp, span);*/+   if (jitter->init_putcount > 0) {+      --jitter->init_putcount;+   }    if (jitter->reset_state)    {       jitter->reset_state=0;@@ -314,6 +321,10 @@       /*fprintf (stderr, "dropping packet (getting more aggressive)\n");*/    }    +   if(jitter->init_getcount > 0 && jitter->init_putcount > 0) {+      /*fprintf(stderr, "buffering..., getcount = %d, putcount = %d\n", jitter->init_getcount, jitter->init_putcount);*/+      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 +435,33 @@  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_putcount) {+            jitter->init_putcount = jitter->init_putcount + margin_diff;+	    if(jitter->init_putcount < 0) {+               jitter->init_putcount = 0;+	    }+         }+	 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;