]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_rtp_asterisk: Avoid merging command and regular T.140 text packets
authorneutrino88 <emmanuel.buu@ives.fr>
Wed, 18 Jul 2018 14:32:34 +0000 (10:32 -0400)
committerRichard Mudgett <rmudgett@digium.com>
Thu, 26 Jul 2018 18:57:59 +0000 (13:57 -0500)
When realtime text packets are to be sent, the text is accumulated in a
buffer and sent regularly by a timer.  It can happen that commands such as
a backspace, CR, or LF get merged with regular text.  This breaks some
UAs.

The proposed change:
* We test if the current packet contains a command.  If so we send the
buffer immediately.
* We test if the buffer contained a command.  If so we send the buffer
immediately.
* We accumulate the text (or the command) in the buffer.

ASTERISK-27970

Change-Id: Ifbe993311410fa855cb8aa4a12084db75f413462

res/res_rtp_asterisk.c

index 36b9cb9a41a277d49d58b0c86bb8c2d8d0c23432..074bcea6cbff055a5635fb622fd7ca2ba54fef35 100644 (file)
@@ -7414,9 +7414,29 @@ static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int
 static int rtp_red_buffer(struct ast_rtp_instance *instance, struct ast_frame *frame)
 {
        struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
+       struct rtp_red *red = rtp->red;
+
+       if (!red) {
+               return 0;
+       }
+
+       if (frame->datalen > 0) {
+               if (red->t140.datalen > 0) {
+                       const unsigned char *primary = red->buf_data;
+
+                       /* There is something already in the T.140 buffer */
+                       if (primary[0] == 0x08 || primary[0] == 0x0a || primary[0] == 0x0d) {
+                               /* Flush the previous T.140 packet if it is a command */
+                               ast_rtp_write(instance, &rtp->red->t140);
+                       } else {
+                               primary = frame->data.ptr;
+                               if (primary[0] == 0x08 || primary[0] == 0x0a || primary[0] == 0x0d) {
+                                       /* Flush the previous T.140 packet if we are buffering a command now */
+                                       ast_rtp_write(instance, &rtp->red->t140);
+                               }
+                       }
+               }
 
-       if (frame->datalen > -1) {
-               struct rtp_red *red = rtp->red;
                memcpy(&red->buf_data[red->t140.datalen], frame->data.ptr, frame->datalen);
                red->t140.datalen += frame->datalen;
                red->t140.ts = frame->ts;