From: neutrino88 Date: Wed, 18 Jul 2018 14:32:34 +0000 (-0400) Subject: res_rtp_asterisk: Avoid merging command and regular T.140 text packets X-Git-Tag: 15.6.0-rc1~47^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0860f70c793ac48013e9eae021f0052b1d7372ec;p=thirdparty%2Fasterisk.git res_rtp_asterisk: Avoid merging command and regular T.140 text packets 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 --- diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 36b9cb9a41..074bcea6cb 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -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;