]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
eliminate some int overflows in iax.
authorMichael Jerris <mike@jerris.com>
Mon, 13 Mar 2006 20:36:58 +0000 (20:36 +0000)
committerMichael Jerris <mike@jerris.com>
Mon, 13 Mar 2006 20:36:58 +0000 (20:36 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@856 d0543943-73ff-0310-b7d9-9358b9ac24b2

libs/iax/src/iax-client.h
libs/iax/src/iax.c
libs/iax/src/iax2-parser.h
libs/iax/src/iax2.h
libs/iax/src/jitterbuf.c
libs/iax/src/jitterbuf.h

index c3199f66797fea106838017f0000c2311fa1f9d2..b8071d07902998527ccc5799a9f33300591fa0ea 100644 (file)
@@ -107,7 +107,7 @@ typedef int (*recvfrom_t)(int s, void *buf, size_t len, int flags, struct sockad
 struct iax_event {
        int etype;                                              /* Type of event */
        int subclass;                                   /* Subclass data (event specific) */
-       unsigned int ts;                                /* Timestamp */
+       time_in_ms_t ts;                                /* Timestamp */
        struct iax_session *session;    /* Applicable session */
        int datalen;                                    /* Length of raw data */
        struct iax_ies ies;                             /* IE's for IAX2 frames */
@@ -133,7 +133,7 @@ extern int iax_shutdown(void);
 extern int iax_get_fd(void);
 
 /* Find out how many milliseconds until the next scheduled event */
-extern int iax_time_to_next_event(void);
+extern time_in_ms_t iax_time_to_next_event(void);
 
 /* Generate a new IAX session */
 extern struct iax_session *iax_session_new(void);
@@ -196,16 +196,16 @@ extern void iax_disable_debug(void);
 extern int iax_setup_transfer(struct iax_session *s0, struct iax_session *s1);
 
 struct iax_netstat {
-       int jitter;
+       time_in_ms_t jitter;
        int losspct;
        int losscnt;
        int packets;
-       int delay;
+       time_in_ms_t delay;
        int dropped;
        int ooo;
 };
 /* fills in rtt, and an iax_netstat structure for each of local/remote directions of call */
-extern int iax_get_netstats(struct iax_session *s, int *rtt, struct iax_netstat *local, struct iax_netstat *remote);
+extern int iax_get_netstats(struct iax_session *s, time_in_ms_t *rtt, struct iax_netstat *local, struct iax_netstat *remote);
 
 
 extern void iax_set_private(struct iax_session *s, void *pvt);
index 69e29a8d988edf59f99525a53fdd73ef00a37ffe..fc59f4369a9a6c21cb33929c8e346ea91b730c92 100644 (file)
@@ -61,16 +61,16 @@ void gettimeofday(struct timeval *tv, void /*struct timezone*/ *tz);
 #include <arpa/inet.h>
 #include <time.h>
 
-#endif
-#ifdef NEWJB
-#include "jitterbuf.h"
 #endif
 
-typedef long long time_in_ms_t;
-
+#include "iax2.h"
 #include "iax-client.h"
 #include "md5.h"
 
+#ifdef NEWJB
+#include "jitterbuf.h"
+#endif
+
 /*
        work around jitter-buffer shrinking in asterisk:
        channels/chan_iax2.c:schedule_delivery() shrinks jitter buffer by 2.
@@ -172,17 +172,17 @@ struct iax_session {
        /* Per session capability */
        int capability;
        /* Last received timestamp */
-       unsigned int last_ts;
+       time_in_ms_t last_ts;
        /* Last transmitted timestamp */
-       unsigned int lastsent;
+       time_in_ms_t lastsent;
        /* Last transmitted voice timestamp */
        unsigned int lastvoicets;
        /* Next predicted voice ts */
-       unsigned int nextpred;
+       time_in_ms_t nextpred;
        /* True if the last voice we transmitted was not silence/CNG */
        int notsilenttx;
        /* Our last measured ping time */
-       unsigned int pingtime;
+       time_in_ms_t pingtime;
        /* Address of peer */
        struct sockaddr_in peeraddr;
        /* Our call number */
@@ -403,7 +403,7 @@ static int inaddrcmp(struct sockaddr_in *sin1, struct sockaddr_in *sin2)
        return (sin1->sin_addr.s_addr != sin2->sin_addr.s_addr) || (sin1->sin_port != sin2->sin_port);
 }
 
-static int iax_sched_add(struct iax_event *event, struct iax_frame *frame, sched_func func, void *arg, int ms)
+static int iax_sched_add(struct iax_event *event, struct iax_frame *frame, sched_func func, void *arg, time_in_ms_t ms)
 {
 
        /* Schedule event to be delivered to the client
@@ -469,27 +469,27 @@ static int iax_sched_del(struct iax_event *event, struct iax_frame *frame, sched
 }
 
 
-int iax_time_to_next_event(void)
+time_in_ms_t iax_time_to_next_event(void)
 {
        struct iax_sched *cur = schedq;
-       int min = 999999999;
+       time_in_ms_t minimum = 999999999;
        
        /* If there are no pending events, we don't need to timeout */
        if (!cur)
                return -1;
 
        while(cur) {
-               if (cur->when < min) {
-                       min = cur->when;
+               if (cur->when < minimum) {
+                       minimum = cur->when;
                }
                cur = cur->next;
        }
 
-       if (min <= 0) {
+       if (minimum <= 0) {
                return -1;
        }
 
-       return (int) (min - current_time_in_ms());
+       return minimum - current_time_in_ms();
 }
 
 struct iax_session *iax_session_new(void)
@@ -540,7 +540,7 @@ static int iax_session_valid(struct iax_session *session)
        return 0;
 }
 
-int iax_get_netstats(struct iax_session *session, int *rtt, struct iax_netstat *local, struct iax_netstat *remote) {
+int iax_get_netstats(struct iax_session *session, time_in_ms_t *rtt, struct iax_netstat *local, struct iax_netstat *remote) {
 
   if(!iax_session_valid(session)) return -1;
 
@@ -567,9 +567,9 @@ int iax_get_netstats(struct iax_session *session, int *rtt, struct iax_netstat *
   return 0;
 }
 
-static int calc_timestamp(struct iax_session *session, unsigned int ts, struct ast_frame *f)
+static time_in_ms_t calc_timestamp(struct iax_session *session, time_in_ms_t ts, struct ast_frame *f)
 {
-       unsigned int ms;
+       time_in_ms_t ms;
        time_in_ms_t time_in_ms;
        int voice = 0;
        int genuine = 0;
@@ -607,7 +607,7 @@ static int calc_timestamp(struct iax_session *session, unsigned int ts, struct a
 
                /* If we haven't most recently sent silence, and we're
                 * close in time, use predicted time */
-               if(session->notsilenttx && abs(ms - session->nextpred) <= 240) {
+               if(session->notsilenttx && iax_abs(ms - session->nextpred) <= 240) {
                    /* Adjust our txcore, keeping voice and non-voice
                     * synchronized */
                        session->offset += (int)(ms - session->nextpred)/10;
@@ -623,7 +623,7 @@ static int calc_timestamp(struct iax_session *session, unsigned int ts, struct a
                     * time.  Also, round ms to the next multiple of
                     * frame size (so our silent periods are multiples
                     * of frame size too) */
-                   int diff = ms % (f->samples / 8);
+                   time_in_ms_t diff = ms % (f->samples / 8);
                    if(diff)
                        ms += f->samples/8 - diff;
                    session->nextpred = ms; 
@@ -639,7 +639,7 @@ static int calc_timestamp(struct iax_session *session, unsigned int ts, struct a
                if (genuine) {
                        if (ms <= session->lastsent)
                                ms = session->lastsent + 3;
-               } else if (abs(ms - session->lastsent) <= 240) {
+               } else if (iax_abs(ms - session->lastsent) <= 240) {
                        ms = session->lastsent + 3;
                }
              
@@ -1014,7 +1014,7 @@ static unsigned char compress_subclass(int subclass)
        return power | IAX_FLAG_SC_LOG;
 }
 
-static int iax_send(struct iax_session *pvt, struct ast_frame *f, unsigned int ts, int seqno, int now, int transfer, int final) 
+static int iax_send(struct iax_session *pvt, struct ast_frame *f, time_in_ms_t ts, int seqno, int now, int transfer, int final) 
 {
        /* Queue a packet for delivery on a given private structure.  Use "ts" for
           timestamp, or calculate if ts is 0.  Send immediately without retransmission
@@ -1025,8 +1025,8 @@ static int iax_send(struct iax_session *pvt, struct ast_frame *f, unsigned int t
        struct iax_frame *fr;
        int res;
        int sendmini=0;
-       unsigned int lastsent;
-       unsigned int fts;
+       time_in_ms_t lastsent;
+       time_in_ms_t fts;
        
        if (!pvt) {
                IAXERROR "No private structure for packet?\n");
@@ -1084,7 +1084,7 @@ static int iax_send(struct iax_session *pvt, struct ast_frame *f, unsigned int t
                fr->iseqno = pvt->iseqno;
                fh = (struct ast_iax2_full_hdr *)(((char *)fr->af.data) - sizeof(struct ast_iax2_full_hdr));
                fh->scallno = htons(fr->callno | IAX_FLAG_FULL);
-               fh->ts = htonl(fr->ts);
+               fh->ts = htonl((u_long)(fr->ts));
                fh->oseqno = fr->oseqno;
                if (transfer) {
                        fh->iseqno = 0;
@@ -1125,7 +1125,7 @@ static int iax_send(struct iax_session *pvt, struct ast_frame *f, unsigned int t
                /* Mini frame will do */
                mh = (struct ast_iax2_mini_hdr *)(((char *)fr->af.data) - sizeof(struct ast_iax2_mini_hdr));
                mh->callno = htons(fr->callno);
-               mh->ts = htons(fr->ts & 0xFFFF);
+               mh->ts = htons((u_short)(fr->ts & 0xFFFF));
                fr->datalen = fr->af.datalen + sizeof(struct ast_iax2_mini_hdr);
                fr->data = mh;
                fr->retries = -1;
@@ -1162,7 +1162,7 @@ static int iax_predestroy(struct iax_session *pvt)
 }
 #endif
 
-static int __send_command(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno, 
+static int __send_command(struct iax_session *i, char type, int command, time_in_ms_t ts, unsigned char *data, int datalen, int seqno, 
                int now, int transfer, int final, int samples)
 {
        struct ast_frame f;
@@ -1181,7 +1181,7 @@ static int __send_command(struct iax_session *i, char type, int command, unsigne
        return iax_send(i, &f, ts, seqno, now, transfer, final);
 }
 
-static int send_command(struct iax_session *i, char type, int command, unsigned int ts, unsigned char *data, int datalen, int seqno)
+static int send_command(struct iax_session *i, char type, int command, time_in_ms_t ts, unsigned char *data, int datalen, int seqno)
 {
        return __send_command(i, type, command, ts, data, datalen, seqno, 0, 0, 0, 0);
 }
@@ -1483,8 +1483,8 @@ static void destroy_session(struct iax_session *session)
        }
 }
 
-static int iax_send_lagrp(struct iax_session *session, unsigned int ts);
-static int iax_send_pong(struct iax_session *session, unsigned int ts);
+static int iax_send_lagrp(struct iax_session *session, time_in_ms_t ts);
+static int iax_send_pong(struct iax_session *session, time_in_ms_t ts);
 
 static struct iax_event *handle_event(struct iax_event *event)
 {
@@ -1673,7 +1673,7 @@ int iax_send_link_reject(struct iax_session *session)
        return send_command(session, AST_FRAME_HTML, AST_HTML_LINKREJECT, 0, NULL, 0, -1);
 }
 
-static int iax_send_pong(struct iax_session *session, unsigned int ts)
+static int iax_send_pong(struct iax_session *session, time_in_ms_t ts)
 {
         struct iax_ie_data ied;
 
@@ -1683,7 +1683,7 @@ static int iax_send_pong(struct iax_session *session, unsigned int ts)
            jb_info stats;
            jb_getinfo(session->jb, &stats);
 
-           iax_ie_append_int(&ied,IAX_IE_RR_JITTER, stats.jitter);
+           iax_ie_append_int(&ied,IAX_IE_RR_JITTER, (int)stats.jitter);
            /* XXX: should be short-term loss pct.. */
            if(stats.frames_in == 0) stats.frames_in = 1;
            iax_ie_append_int(&ied,IAX_IE_RR_LOSS, 
@@ -1722,7 +1722,7 @@ static void send_ping(void *s)
        return;
 }
 
-static int iax_send_lagrp(struct iax_session *session, unsigned int ts)
+static int iax_send_lagrp(struct iax_session *session, time_in_ms_t ts)
 {
        return send_command(session, AST_FRAME_IAX, IAX_COMMAND_LAGRP, ts, NULL, 0, -1);
 }
@@ -1997,7 +1997,7 @@ int iax_call(struct iax_session *session, char *cidnum, char *cidname, char *ich
        return res;
 }
 
-static int calc_rxstamp(struct iax_session *session)
+static time_in_ms_t calc_rxstamp(struct iax_session *session)
 {
        time_in_ms_t time_in_ms;
 
@@ -2139,7 +2139,7 @@ static int display_time(int ms)
 /* From chan_iax2/steve davies:  need to get permission from steve or digium, I guess */
 static time_in_ms_t unwrap_timestamp(time_in_ms_t ts, time_in_ms_t last)
 {
-        int x;
+        time_in_ms_t x;
 
         if ( (ts & 0xFFFF0000) == (last & 0xFFFF0000) ) {
                 x = ts - last;
@@ -2165,7 +2165,7 @@ static time_in_ms_t unwrap_timestamp(time_in_ms_t ts, time_in_ms_t last)
 #endif
 
 
-static struct iax_event *schedule_delivery(struct iax_event *e, unsigned int ts, int updatehistory)
+static struct iax_event *schedule_delivery(struct iax_event *e, time_in_ms_t ts, int updatehistory)
 {
        /* 
         * This is the core of the IAX jitterbuffer delivery mechanism: 
@@ -2397,7 +2397,7 @@ static struct iax_event *iax_header_to_event(struct iax_session *session,
        struct iax_sched *sch;
        unsigned int ts;
        int subclass = uncompress_subclass(fh->csub);
-       int nowts;
+       time_in_ms_t nowts;
        int updatehistory = 1;
        ts = ntohl(fh->ts);
        /* don't run last_ts backwards; i.e. for retransmits and the like */
@@ -2824,7 +2824,7 @@ static struct iax_event *iax_miniheader_to_event(struct iax_session *session,
                                                int datalen)
 {
        struct iax_event *e;
-       unsigned int ts;
+       time_in_ms_t ts;
        int updatehistory = 1;
        e = (struct iax_event *)malloc(sizeof(struct iax_event) + datalen);
        if (e) {
@@ -3120,7 +3120,7 @@ struct iax_event *iax_get_event(int blocking)
        if (blocking) {
                /* Block until there is data if desired */
                fd_set fds;
-               int nextEventTime;
+               time_in_ms_t nextEventTime;
                
                FD_ZERO(&fds);
                FD_SET(netfd, &fds);
@@ -3135,8 +3135,8 @@ struct iax_event *iax_get_event(int blocking)
                { 
                        struct timeval nextEvent; 
 
-                       nextEvent.tv_sec = nextEventTime / 1000
-                       nextEvent.tv_usec = (nextEventTime % 1000) * 1000;
+                       nextEvent.tv_sec = (long)(nextEventTime / 1000)
+                       nextEvent.tv_usec = (long)((nextEventTime % 1000) * 1000);
 
                        select(netfd + 1, &fds, NULL, NULL, &nextEvent); 
                } 
index 666042a18dd49ecac402001a36dc6a1a9bdba76b..5dfaefc3267764dd63332b1d572506337ba66ae6 100644 (file)
@@ -86,9 +86,9 @@ struct iax_frame {
        /* How many retries so far? */
        int retries;
        /* Outgoing relative timestamp (ms) */
-       unsigned int ts;
+       time_in_ms_t ts;
        /* How long to wait before retrying */
-       int retrytime;
+       time_in_ms_t retrytime;
        /* Are we received out of order?  */
        int outoforder;
        /* Have we been sent at all yet? */
index cd212f60db87d925bfb2f3b2a0770676d4b7f10d..f2717320fdf73480b3a317745f41d90a05dc5c5c 100644 (file)
@@ -14,6 +14,9 @@
 #ifndef _IAX2_H
 #define _IAX2_H
 
+typedef long long time_in_ms_t;
+#define iax_abs(x) ((x) >= 0 ? (x) : -(x))
+
 /* Max version of IAX protocol we support */
 #define IAX_PROTO_VERSION 2
 
index 750148137159e1ae1e914f500e624829b797273e..025c8fe8a61b9803140d354862dd9c3e2bbe8996 100644 (file)
@@ -13,6 +13,7 @@
  * Copyright on this file is disclaimed to Digium for inclusion in Asterisk
  */
 
+#include "iax2.h"
 #include "jitterbuf.h"
 #include <stdio.h>
 #include <stdlib.h>
@@ -123,11 +124,11 @@ static int longcmp(const void *a, const void *b)
 }
 #endif
 
-static int history_put(jitterbuf *jb, long ts, long now, long ms) 
+static int history_put(jitterbuf *jb, time_in_ms_t ts, time_in_ms_t now, long ms) 
 {
-       long delay = now - (ts - jb->info.resync_offset);
-       long threshold = 2 * jb->info.jitter + jb->info.conf.resync_threshold;
-       long kicked;
+       time_in_ms_t delay = now - (ts - jb->info.resync_offset);
+       time_in_ms_t threshold = 2 * jb->info.jitter + jb->info.conf.resync_threshold;
+       time_in_ms_t kicked;
 
        /* don't add special/negative times to history */
        if (ts <= 0) 
@@ -135,7 +136,7 @@ static int history_put(jitterbuf *jb, long ts, long now, long ms)
 
        /* check for drastic change in delay */
        if (jb->info.conf.resync_threshold != -1) {
-               if (abs(delay - jb->info.last_delay) > threshold) {
+               if (iax_abs(delay - jb->info.last_delay) > threshold) {
                        jb->info.cnt_delay_discont++;
                        if (jb->info.cnt_delay_discont > 3) {
                                /* resync the jitterbuffer */
@@ -222,7 +223,7 @@ static void history_calc_maxbuf(jitterbuf *jb)
     i = (jb->hist_ptr > JB_HISTORY_SZ) ? (jb->hist_ptr - JB_HISTORY_SZ) : 0; 
 
     for(;i<jb->hist_ptr;i++) {
-       long toins = jb->history[i % JB_HISTORY_SZ];
+       time_in_ms_t toins = jb->history[i % JB_HISTORY_SZ];
 
        /* if the maxbuf should get this */
        if(toins > jb->hist_maxbuf[JB_HISTORY_MAXBUF_SZ-1])  {
@@ -276,7 +277,7 @@ static void history_calc_maxbuf(jitterbuf *jb)
 
 static void history_get(jitterbuf *jb) 
 {
-    long max, min, jitter;
+    time_in_ms_t max, min, jitter;
     int index;
     int count;
 
@@ -316,12 +317,12 @@ static void history_get(jitterbuf *jb)
 }
 
 /* returns 1 if frame was inserted into head of queue, 0 otherwise */
-static int queue_put(jitterbuf *jb, void *data, int type, long ms, long ts) 
+static int queue_put(jitterbuf *jb, void *data, int type, long ms, time_in_ms_t ts) 
 {
     jb_frame *frame;
     jb_frame *p;
        int head = 0;
-       long resync_ts = ts - jb->info.resync_offset;
+       time_in_ms_t resync_ts = ts - jb->info.resync_offset;
 
     frame = jb->free;
     if(frame) {
@@ -382,19 +383,19 @@ static int queue_put(jitterbuf *jb, void *data, int type, long ms, long ts)
        return head;
 }
 
-static long queue_next(jitterbuf *jb) 
+static time_in_ms_t queue_next(jitterbuf *jb) 
 {
     if(jb->frames) return jb->frames->ts;
     else return -1;
 }
 
-static long queue_last(jitterbuf *jb) 
+static time_in_ms_t queue_last(jitterbuf *jb) 
 {
     if(jb->frames) return jb->frames->prev->ts;
     else return -1;
 }
 
-static jb_frame *_queue_get(jitterbuf *jb, long ts, int all) 
+static jb_frame *_queue_get(jitterbuf *jb, time_in_ms_t ts, int all) 
 {
     jb_frame *frame;
     frame = jb->frames;
@@ -429,7 +430,7 @@ static jb_frame *_queue_get(jitterbuf *jb, long ts, int all)
     return NULL;
 }
 
-static jb_frame *queue_get(jitterbuf *jb, long ts) 
+static jb_frame *queue_get(jitterbuf *jb, time_in_ms_t ts) 
 {
     return _queue_get(jb,ts,0);
 }
@@ -504,7 +505,7 @@ static void jb_dbgqueue(jitterbuf *jb)
 }
 #endif
 
-int jb_put(jitterbuf *jb, void *data, int type, long ms, long ts, long now) 
+int jb_put(jitterbuf *jb, void *data, int type, long ms, time_in_ms_t ts, time_in_ms_t now) 
 {
     jb_dbg2("jb_put(%x,%x,%ld,%ld,%ld)\n", jb, data, ms, ts, now);
 
@@ -526,10 +527,10 @@ int jb_put(jitterbuf *jb, void *data, int type, long ms, long ts, long now)
 }
 
 
-static int _jb_get(jitterbuf *jb, jb_frame *frameout, long now, long interpl) 
+static int _jb_get(jitterbuf *jb, jb_frame *frameout, time_in_ms_t now, long interpl) 
 {
     jb_frame *frame;
-    long diff;
+    time_in_ms_t diff;
 
     /*if((now - jb_next(jb)) > 2 * jb->info.last_voice_ms) jb_warn("SCHED: %ld", (now - jb_next(jb))); */
     /* get jitter info */
@@ -742,10 +743,10 @@ static int _jb_get(jitterbuf *jb, jb_frame *frameout, long now, long interpl)
   }
 }
 
-long jb_next(jitterbuf *jb) 
+time_in_ms_t jb_next(jitterbuf *jb) 
 {
     if(jb->info.silence_begin_ts) {
-      long next = queue_next(jb);
+      time_in_ms_t next = queue_next(jb);
       if(next > 0) { 
         /* shrink during silence */
         if (jb->info.target - jb->info.current < -JB_TARGET_EXTRA)
@@ -758,7 +759,7 @@ long jb_next(jitterbuf *jb)
     }
 }
 
-int jb_get(jitterbuf *jb, jb_frame *frameout, long now, long interpl) 
+int jb_get(jitterbuf *jb, jb_frame *frameout, time_in_ms_t now, long interpl) 
 {
     int ret = _jb_get(jb,frameout,now,interpl);
 #if 0
index 0160383af6cd6611d583d6fea0f6fa218c357472..300cb5a4c659553778684e917d5a209f9e914d43 100644 (file)
@@ -69,24 +69,24 @@ typedef struct jb_info {
        long frames_dropped;    /* number of frames dropped (shrinkage) */
        long frames_ooo;        /* number of frames received out-of-order */
        long frames_cur;        /* number of frames presently in jb, awaiting delivery.*/
-       long jitter;            /* jitter measured within current history interval*/
-       long min;               /* minimum lateness within current history interval */
-       long current;           /* the present jitterbuffer adjustment */
-       long target;            /* the target jitterbuffer adjustment */
+       time_in_ms_t jitter;            /* jitter measured within current history interval*/
+       time_in_ms_t min;               /* minimum lateness within current history interval */
+       time_in_ms_t current;           /* the present jitterbuffer adjustment */
+       time_in_ms_t target;            /* the target jitterbuffer adjustment */
        long losspct;           /* recent lost frame percentage (* 1000) */
-       long next_voice_ts;     /* the ts of the next frame to be read from the jb - in receiver's time */
+       time_in_ms_t next_voice_ts;     /* the ts of the next frame to be read from the jb - in receiver's time */
        long last_voice_ms;     /* the duration of the last voice frame */
-       long silence_begin_ts;  /* the time of the last CNG frame, when in silence */
-       long last_adjustment;   /* the time of the last adjustment */
-       long last_delay;        /* the last now added to history */
+       time_in_ms_t silence_begin_ts;  /* the time of the last CNG frame, when in silence */
+       time_in_ms_t last_adjustment;   /* the time of the last adjustment */
+       time_in_ms_t last_delay;        /* the last now added to history */
        long cnt_delay_discont; /* the count of discontinuous delays */
-       long resync_offset;     /* the amount to offset ts to support resyncs */
+       time_in_ms_t resync_offset;     /* the amount to offset ts to support resyncs */
        long cnt_contig_interp; /* the number of contiguous interp frames returned */
 } jb_info;
 
 typedef struct jb_frame {
        void *data;             /* the frame data */
-       long ts;        /* the relative delivery time expected */
+       time_in_ms_t ts;        /* the relative delivery time expected */
        long ms;        /* the time covered by this frame, in sec/8000 */
        int  type;      /* the type of frame */
        struct jb_frame *next, *prev;
@@ -96,10 +96,10 @@ typedef struct jitterbuf {
        jb_info info;
 
        /* history */
-       long history[JB_HISTORY_SZ];            /* history */
+       time_in_ms_t history[JB_HISTORY_SZ];            /* history */
        int  hist_ptr;                          /* points to index in history for next entry */
-       long hist_maxbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the max delays (highest first) */
-       long hist_minbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the min delays (lowest first) */
+       time_in_ms_t hist_maxbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the max delays (highest first) */
+       time_in_ms_t hist_minbuf[JB_HISTORY_MAXBUF_SZ]; /* a sorted buffer of the min delays (lowest first) */
        int  hist_maxbuf_valid;                 /* are the "maxbuf"/minbuf valid? */
 
 
@@ -125,7 +125,7 @@ extern void                 jb_reset(jitterbuf *jb);
  * JB_DROP: Drop this frame immediately
  * JB_SCHED: Frame added. Call jb_next() to get a new time for the next frame
  */
-extern int                     jb_put(jitterbuf *jb, void *data, int type, long ms, long ts, long now);
+extern int                     jb_put(jitterbuf *jb, void *data, int type, long ms, time_in_ms_t ts, time_in_ms_t now);
 
 /* get a frame for time now (receiver's time)  return value is one of
  * JB_OK:  You've got frame!
@@ -134,14 +134,14 @@ extern int                        jb_put(jitterbuf *jb, void *data, int type, long ms, long ts, long
  * JB_INTERP: Please interpolate an interpl-length frame for this time (either we need to grow, or there was a lost frame) 
  * JB_EMPTY: The jb is empty.
  */
-extern int                     jb_get(jitterbuf *jb, jb_frame *frame, long now, long interpl);
+extern int                     jb_get(jitterbuf *jb, jb_frame *frame, time_in_ms_t now, long interpl);
 
 /* unconditionally get frames from jitterbuf until empty */
 extern int jb_getall(jitterbuf *jb, jb_frame *frameout);
 
 /* when is the next frame due out, in receiver's time (0=EMPTY) 
  * This value may change as frames are added (esp non-audio frames) */
-extern long                    jb_next(jitterbuf *jb);
+extern time_in_ms_t            jb_next(jitterbuf *jb);
 
 /* get jitterbuf info: only "statistics" may be valid */
 extern int                     jb_getinfo(jitterbuf *jb, jb_info *stats);