diff --git a/daemon/jitter_buffer.c b/daemon/jitter_buffer.c index 3e92387a9..8efda0ad1 100644 --- a/daemon/jitter_buffer.c +++ b/daemon/jitter_buffer.c @@ -8,9 +8,10 @@ #include #define INITIAL_PACKETS 0x1E -#define CONT_SEQ_COUNT 0x64 +#define CONT_SEQ_COUNT 0x1F4 #define CONT_MISS_COUNT 0x0A #define CLOCK_DRIFT_MULT 0x14 +#define ONE_MS 0x64 static struct timerthread jitter_buffer_thread; @@ -135,6 +136,7 @@ static int queue_packet(struct media_packet *mp, struct jb_packet *p) { (long long) (ts_diff + (jb->rtptime_delta * jb->buffer_len))* 1000000 / clockrate; ts_diff_us += (jb->clock_drift_val * seq_diff); + ts_diff_us += (jb->dtmf_mult_factor * ONE_MS); if(jb->buf_decremented) { ts_diff_us += 5000; //add 5ms delta when 2 packets are scheduled around same time @@ -144,7 +146,7 @@ static int queue_packet(struct media_packet *mp, struct jb_packet *p) { ts_diff_us = timeval_diff(&p->ttq_entry.when, &rtpe_now); - if (ts_diff_us > 1000000 || ts_diff_us < -1000000) { // more/less than one second, can't be right + if (ts_diff_us > 1000000) { // more than one second, can't be right ilog(LOG_DEBUG, "Partial reset due to timestamp"); jb->first_send.tv_sec = 0; return 1; @@ -216,6 +218,10 @@ int buffer_packet(struct media_packet *mp, const str *s) { if(rtp_pt) { if(rtp_pt->codec_def && !rtp_pt->codec_def->dtmf) jb->first_send.tv_sec = 0; + if(rtp_pt->codec_def->dtmf) + jb->dtmf_mult_factor++; + else + jb->dtmf_mult_factor=0; } } @@ -291,7 +297,6 @@ static void set_jitter_values(struct media_packet *mp) { } else if(curr_seq < jb->next_exp_seq) { //Might be duplicate or sequence already crossed jb->cont_frames = 0; - jb->cont_miss++; } else { jb->cont_frames++; diff --git a/include/jitter_buffer.h b/include/jitter_buffer.h index d56ce8d5a..9fe3260c9 100644 --- a/include/jitter_buffer.h +++ b/include/jitter_buffer.h @@ -33,6 +33,7 @@ struct jitter_buffer { unsigned int initial_pkts; unsigned int drift_mult_factor; unsigned int ssrc; + unsigned int dtmf_mult_factor; int buffer_len; int clock_drift_val; int buf_decremented;