void jitter_control_update_size(JitterControl *ctl, queue_t *q){ mblk_t *newest=qlast(q); mblk_t *oldest=qbegin(q); uint32_t newest_ts,oldest_ts; if (newest==NULL) return; newest_ts=rtp_get_timestamp(newest); oldest_ts=rtp_get_timestamp(oldest); ctl->cum_jitter_buffer_count++; ctl->cum_jitter_buffer_size+=(uint32_t)(newest_ts-oldest_ts); }
/* put an rtp packet in queue. It is called by rtp_parse()*/ void rtp_putq(queue_t *q, mblk_t *mp) { mblk_t *tmp; rtp_header_t *rtp=(rtp_header_t*)mp->b_rptr,*tmprtp; /* insert message block by increasing time stamp order : the last (at the bottom) message of the queue is the newest*/ ortp_debug("rtp_putq(): Enqueuing packet with ts=%i and seq=%i",rtp->timestamp,rtp->seq_number); if (qempty(q)) { putq(q,mp); return; } tmp=qlast(q); /* we look at the queue from bottom to top, because enqueued packets have a better chance to be enqueued at the bottom, since there are surely newer */ while (!qend(q,tmp)) { tmprtp=(rtp_header_t*)tmp->b_rptr; ortp_debug("rtp_putq(): Seeing packet with seq=%i",tmprtp->seq_number); if (rtp->seq_number == tmprtp->seq_number) { /* this is a duplicated packet. Don't queue it */ ortp_debug("rtp_putq: duplicated message."); freemsg(mp); return; }else if (RTP_SEQ_IS_GREATER(rtp->seq_number,tmprtp->seq_number)){ insq(q,tmp->b_next,mp); return; } tmp=tmp->b_prev; } /* this packet is the oldest, it has to be placed on top of the queue */ insq(q,qfirst(q),mp); }