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
This commit is contained in:
parent
798f049e82
commit
d3809d61cb
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue