]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
RTP: need to reset DTMF last seqno/timestamp on voice packet with marker bit
authorAlexei Gradinari <alex2grad@gmail.com>
Mon, 12 Nov 2018 23:12:56 +0000 (18:12 -0500)
committerAlexei Gradinari <alex2grad@gmail.com>
Mon, 12 Nov 2018 23:12:56 +0000 (18:12 -0500)
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

index 7b006cec9ded9056b2760a7406ae1772fc90db0a..972058e9f79e5505d98d5e48854741d6ea9477e9 100644 (file)
@@ -5725,6 +5725,16 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc
        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;