res_format_attr_opus: Fix fmtp generation.
authorMark Michelson <mmichelson@digium.com>
Wed, 16 Nov 2016 21:42:39 +0000 (15:42 -0600)
committerMark Michelson <mmichelson@digium.com>
Wed, 16 Nov 2016 21:49:04 +0000 (16:49 -0500)
res_format_attr_opus assumed that the string being passed into it was
empty. It tried to determine if the only thing it had written was

a=fmtp:<num>

And if it had, it would reset the string. Its calculation was off when
working with chan_sip, though. chan_sip passes the entire built SDP
rather than an empty string. This resulted in always putting an empty
fmtp line in the SDP.

ASTERISK-26520 #close
Reported by scgm11

Change-Id: Ib2e8712d26a47067e5f36d5973577added01dbb5

res/res_format_attr_opus.c

index a3e48e3..81a07a1 100644 (file)
@@ -156,7 +156,8 @@ static struct ast_format *opus_parse_sdp_fmtp(const struct ast_format *format, c
 static void opus_generate_sdp_fmtp(const struct ast_format *format, unsigned int payload, struct ast_str **str)
 {
        struct opus_attr *attr = ast_format_get_attribute_data(format);
-       int size;
+       int base_fmtp_size;
+       int original_size;
 
        if (!attr) {
                /*
@@ -167,7 +168,8 @@ static void opus_generate_sdp_fmtp(const struct ast_format *format, unsigned int
                attr = &default_opus_attr;
        }
 
-       size = ast_str_append(str, 0, "a=fmtp:%u ", payload);
+       original_size = ast_str_strlen(*str);
+       base_fmtp_size = ast_str_append(str, 0, "a=fmtp:%u ", payload);
 
        if (CODEC_OPUS_DEFAULT_SAMPLE_RATE != attr->maxplayrate) {
                ast_str_append(str, 0, "%s=%d;",
@@ -209,8 +211,8 @@ static void opus_generate_sdp_fmtp(const struct ast_format *format, unsigned int
                        CODEC_OPUS_ATTR_DTX, attr->dtx);
        }
 
-       if (size == ast_str_strlen(*str)) {
-               ast_str_reset(*str);
+       if (base_fmtp_size == ast_str_strlen(*str) - original_size) {
+               ast_str_truncate(*str, original_size);
        } else {
                ast_str_truncate(*str, -1);
                ast_str_append(str, 0, "\r\n");