diff --git a/main/channel.c b/main/channel.c index 4f8471743e7156cbd18f81ee062e92b75ba8589c..d916b7c05f07e623533afac2ccfae4e036ef7f0c 100644 --- a/main/channel.c +++ b/main/channel.c @@ -4887,16 +4887,18 @@ int ast_sendtext(struct ast_channel *chan, const char *text) if (ast_channel_tech(chan)->write_text && (ast_format_cap_has_type(ast_channel_nativeformats(chan), AST_MEDIA_TYPE_TEXT))) { struct ast_frame f; + memset(&f, 0, sizeof(f)); f.frametype = AST_FRAME_TEXT; f.src = "DIALPLAN"; f.mallocd = AST_MALLOCD_DATA; f.datalen = strlen(text); f.data.ptr = ast_strdup(text); - f.offset = 0; - f.seqno = 0; - f.subclass.format = ast_format_t140; - res = ast_channel_tech(chan)->write_text(chan, &f); + + if (f.data.ptr) { + res = ast_channel_tech(chan)->write_text(chan, &f); + ast_frfree(&f); + } } else if (ast_channel_tech(chan)->send_text) { res = ast_channel_tech(chan)->send_text(chan, text); } diff --git a/main/format_compatibility.c b/main/format_compatibility.c index 84514ac8cdc14b2d25b73df21980e7e83a6d6bfc..256d3a53cbb7db530fd4dcde0912bc88600c5782 100644 --- a/main/format_compatibility.c +++ b/main/format_compatibility.c @@ -262,10 +262,10 @@ struct ast_format *ast_format_compatibility_bitfield2format(uint64_t bitfield) /*! T.140 RED Text format RFC 4103 */ case AST_FORMAT_T140_RED: - return ast_format_t140; + return ast_format_t140_red; /*! T.140 Text format - ITU T.140, RFC 4103 */ case AST_FORMAT_T140: - return ast_format_t140_red; + return ast_format_t140; } return NULL; } diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c index 4c79f8f5b5a37f297657ac114bea47b405088076..c88c7b58e78de128858e25618801619842b114ea 100644 --- a/res/res_rtp_asterisk.c +++ b/res/res_rtp_asterisk.c @@ -230,6 +230,7 @@ struct dtls_details { /*! \brief RTP session description */ struct ast_rtp { int s; + /*! \note The f.subclass.format holds a ref. */ struct ast_frame f; unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET]; unsigned int ssrc; /*!< Synchronization source, RFC 3550, page 10. */ @@ -2765,6 +2766,7 @@ static int ast_rtp_destroy(struct ast_rtp_instance *instance) if (rtp->red) { AST_SCHED_DEL(rtp->sched, rtp->red->schedid); ast_free(rtp->red); + rtp->red = NULL; } #ifdef HAVE_PJPROJECT @@ -3485,7 +3487,8 @@ static int ast_rtp_raw_write(struct ast_rtp_instance *instance, struct ast_frame return 0; } -static struct ast_frame *red_t140_to_red(struct rtp_red *red) { +static struct ast_frame *red_t140_to_red(struct rtp_red *red) +{ unsigned char *data = red->t140red.data.ptr; int len = 0; int i; @@ -5059,22 +5062,21 @@ static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int struct ast_rtp *rtp = ast_rtp_instance_get_data(instance); int x; - if (!(rtp->red = ast_calloc(1, sizeof(*rtp->red)))) { + rtp->red = ast_calloc(1, sizeof(*rtp->red)); + if (!rtp->red) { return -1; } rtp->red->t140.frametype = AST_FRAME_TEXT; - ao2_replace(rtp->red->t140.subclass.format, ast_format_t140_red); + rtp->red->t140.subclass.format = ast_format_t140_red; rtp->red->t140.data.ptr = &rtp->red->buf_data; - rtp->red->t140.ts = 0; rtp->red->t140red = rtp->red->t140; rtp->red->t140red.data.ptr = &rtp->red->t140red_data; - rtp->red->t140red.datalen = 0; + rtp->red->ti = buffer_time; rtp->red->num_gen = generations; rtp->red->hdrlen = generations * 4 + 1; - rtp->red->prev_ts = 0; for (x = 0; x < generations; x++) { rtp->red->pt[x] = payloads[x]; @@ -5084,8 +5086,6 @@ static int rtp_red_init(struct ast_rtp_instance *instance, int buffer_time, int rtp->red->t140red_data[x*4] = rtp->red->pt[x] = payloads[x]; /* primary pt */ rtp->red->schedid = ast_sched_add(rtp->sched, generations, red_write, instance); - rtp->red->t140.datalen = 0; - return 0; }