diff --git a/daemon/sdp.c b/daemon/sdp.c index 45d66b9cc..2f1a7af7f 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -386,6 +386,8 @@ static void append_attr_int_to_gstring(GString *s, const char * value, const int sdp_ng_flags *flags, enum media_type media_type); static void append_tagged_attr_to_gstring(GString *s, const char * name, const str *tag, const str * value, sdp_ng_flags *flags, enum media_type media_type); +static void append_int_tagged_attr_to_gstring(GString *s, const char * name, unsigned int tag, const str * value, + sdp_ng_flags *flags, enum media_type media_type); INLINE struct sdp_attribute *attr_get_by_id(struct sdp_attributes *a, enum attr_id id) { return t_hash_table_lookup(a->id_hash, &id); @@ -2120,53 +2122,28 @@ static void insert_codec_parameters(GString *s, struct call_media *cm, if (!pt->encoding_with_params.len) continue; - g_autoptr(GString) s_dst = g_string_new(""); - /* rtpmap */ - { - g_string_append_printf(s_dst, "rtpmap:%u " STR_FORMAT, - pt->payload_type, - STR_FMT(&pt->encoding_with_params)); - /* append to the chop->output */ - append_attr_to_gstring(s, s_dst->str, NULL, flags, cm->type_id); - g_string_truncate(s_dst, 0); - } + append_int_tagged_attr_to_gstring(s, "rtpmap", pt->payload_type, &pt->encoding_with_params, + flags, cm->type_id); /* fmtp */ - { - bool check_format = true; - if (pt->codec_def && pt->codec_def->format_print) { - g_string_append_printf(s_dst, "fmtp:%u ", pt->payload_type); - gsize fmtp_len = s_dst->len; - bool added = pt->codec_def->format_print(s_dst, pt); /* try appending list of parameters */ - if (!added || fmtp_len == s_dst->len) - g_string_truncate(s_dst, 0); - else - check_format = false; - } - if (check_format && pt->format_parameters.len) { - g_string_append_printf(s_dst, "fmtp:%u " STR_FORMAT, - pt->payload_type, - STR_FMT(&pt->format_parameters)); - } - if (s_dst->len) { - /* append to the chop->output */ - append_attr_to_gstring(s, s_dst->str, NULL, flags, cm->type_id); - } - g_string_truncate(s_dst, 0); + bool added = false; + if (pt->codec_def && pt->codec_def->format_print) { + g_autoptr(GString) s_dst = g_string_new(""); + added = pt->codec_def->format_print(s_dst, pt); /* try appending list of parameters */ + if (s_dst->len) + append_int_tagged_attr_to_gstring(s, "fmtp", pt->payload_type, + &STR_INIT_GS(s_dst), flags, cm->type_id); } + if (!added && pt->format_parameters.len) + append_int_tagged_attr_to_gstring(s, "fmtp", pt->payload_type, + &pt->format_parameters, flags, cm->type_id); /* rtcp-fb */ - { - for (GList *k = pt->rtcp_fb.head; k; k = k->next) { - str *fb = k->data; - g_string_truncate(s_dst, 0); /* don't forget to clear for each cycle */ - g_string_append_printf(s_dst, "rtcp-fb:%u " STR_FORMAT, - pt->payload_type, - STR_FMT(fb)); - /* append to the chop->output */ - append_attr_to_gstring(s, s_dst->str, NULL, flags, cm->type_id); - } + for (GList *k = pt->rtcp_fb.head; k; k = k->next) { + str *fb = k->data; + append_int_tagged_attr_to_gstring(s, "rtcp-fb", pt->payload_type, fb, + flags, cm->type_id); } } } @@ -2810,7 +2787,6 @@ static void insert_crypto1(GString *s, struct call_media *media, struct crypto_p p--; } - g_string_append_printf(s_dst, "%u ", cps->tag); g_string_append(s_dst, cps->params.crypto_suite->name); g_string_append(s_dst, " inline:"); g_string_append_len(s_dst, b64_buf, p - b64_buf); @@ -2831,7 +2807,7 @@ static void insert_crypto1(GString *s, struct call_media *media, struct crypto_p g_string_append(s_dst, " UNAUTHENTICATED_SRTP"); /* append to the chop->output */ - append_attr_to_gstring(s, "crypto", &STR_INIT_GS(s_dst), flags, media->type_id); + append_int_tagged_attr_to_gstring(s, "crypto", cps->tag, &STR_INIT_GS(s_dst), flags, media->type_id); } static void insert_crypto(GString *s, struct call_media *media, sdp_ng_flags *flags) { @@ -2988,6 +2964,15 @@ static void append_tagged_attr_to_gstring(GString *s, const char * name, const s generic_append_attr_to_gstring(s, n->str, ' ', value, flags, media_type); } +/* A function used to append attributes (`a=name:uint value`) to the output chop */ +static void append_int_tagged_attr_to_gstring(GString *s, const char * name, unsigned int tag, const str * value, + sdp_ng_flags *flags, enum media_type media_type) +{ + g_autoptr(GString) n = g_string_new(name); + g_string_append_printf(n, ":%u", tag); + generic_append_attr_to_gstring(s, n->str, ' ', value, flags, media_type); +} + /* A function used to append attributes to the output chop */ static void append_attr_int_to_gstring(GString *s, const char * name, const int value, sdp_ng_flags *flags, enum media_type media_type)