From 331c906c4811df17612efa5c31e19df7186b1c81 Mon Sep 17 00:00:00 2001 From: Alexei Gradinari Date: Fri, 23 Nov 2018 10:40:50 -0500 Subject: [PATCH] RTP: need to reset DTMF last seqno/timestamp on voice packet with marker bit The marker bit set on the voice packet indicates the start of a new stream and a new time stamp. Need to reset the DTMF last sequence number and the timestamp of the last END packet. If the new time stamp is lower then the timestamp of the last DTMF END packet the asterisk drops all DTMF frames as out of order. This bug was caught using Cisco ip-phone SPA50X and codec g722. On SIP session update the SPA50X resets stream indicating it with market bit and a new timestamp is twice smaller then the previous. ASTERISK-28162 #close Change-Id: If9c5742158fa836ad549713a9814d46a5d2b1620 --- res/res_rtp_asterisk.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 465f9bc23a..ff8e453055 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -6438,6 +6438,16 @@ static struct ast_frame *ast_rtp_interpret(struct ast_rtp_instance *instance, st switch (ast_format_get_type(rtp->f.subclass.format)) { case AST_MEDIA_TYPE_AUDIO: rtp->f.frametype = AST_FRAME_VOICE; + + /* The marker bit set on the voice packet indicates the start + * of a new stream and a new time stamp. Need to reset the DTMF + * last sequence number and the timestamp of the last END packet. + */ + if (mark) { + rtp->last_seqno = 0; + rtp->last_end_timestamp = 0; + } + break; case AST_MEDIA_TYPE_VIDEO: rtp->f.frametype = AST_FRAME_VIDEO;