MT#58441 attribute lvl manipulations, fix fmtp processing

In order to be able to remove or substitute `fmtp` parameters,
we have to take care of that in `insert_codec_parameters()`,
since `fmtp` are additionally being printed already after
execution of `process_media_attributes()`.

Change-Id: I78547be13939e161b193beecd8693e22c534fd18
pull/1747/head
Donat Zenichev 2 years ago
parent 1725c92cb1
commit 1bf894cc9e

@ -2021,43 +2021,56 @@ static int replace_codec_list(struct sdp_chopper *chop,
return print_codec_list(chop->output, cm); return print_codec_list(chop->output, cm);
} }
static void insert_codec_parameters(GString *s, struct call_media *cm) { static void insert_codec_parameters(GString *s, struct call_media *cm,
for (GList *l = cm->codecs.codec_prefs.head; l; l = l->next) { struct sdp_ng_flags *flags)
{
for (GList *l = cm->codecs.codec_prefs.head; l; l = l->next)
{
struct rtp_payload_type *pt = l->data; struct rtp_payload_type *pt = l->data;
if (!pt->encoding_with_params.len) if (!pt->encoding_with_params.len)
continue; continue;
g_string_append_printf(s, "a=rtpmap:%u " STR_FORMAT "\r\n",
pt->payload_type, /* rtpmap */
STR_FMT(&pt->encoding_with_params)); {
g_string_append_printf(s, "a=rtpmap:%u " STR_FORMAT "\r\n",
bool check_format = true; pt->payload_type,
if (pt->codec_def && pt->codec_def->format_print) { STR_FMT(&pt->encoding_with_params));
gsize prev_len = s->len; }
g_string_append_printf(s, "a=fmtp:%u ", pt->payload_type);
gsize fmtp_len = s->len; /* fmtp */
bool success = pt->codec_def->format_print(s, pt); {
if (!success) bool check_format = true;
g_string_truncate(s, prev_len); // backtrack GString * s_dst = g_string_new("");
else { if (pt->codec_def && pt->codec_def->format_print) {
check_format = false; // done with this g_string_append_printf(s_dst, "a=fmtp:%u ", pt->payload_type);
// anything printed? gsize fmtp_len = s_dst->len;
if (s->len == fmtp_len) bool added = pt->codec_def->format_print(s_dst, pt); /* try appending list of parameters */
g_string_truncate(s, prev_len); // backtrack if (!added || fmtp_len == s_dst->len)
g_string_truncate(s_dst, 0);
else else
g_string_append(s, "\r\n"); check_format = false;
} }
} if (check_format && pt->format_parameters.len) {
if (check_format && pt->format_parameters.len) { g_string_append_printf(s_dst, "a=fmtp:%u " STR_FORMAT,
g_string_append_printf(s, "a=fmtp:%u " STR_FORMAT "\r\n", pt->payload_type,
pt->payload_type, STR_FMT(&pt->format_parameters));
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 ? cm->type_id : MT_UNKNOWN));
}
g_string_free(s_dst, TRUE);
} }
for (GList *k = pt->rtcp_fb.head; k; k = k->next) { /* rtcp-fb */
str *fb = k->data; {
g_string_append_printf(s, "a=rtcp-fb:%u " STR_FORMAT "\r\n", for (GList *k = pt->rtcp_fb.head; k; k = k->next) {
pt->payload_type, str *fb = k->data;
STR_FMT(fb)); g_string_append_printf(s, "a=rtcp-fb:%u " STR_FORMAT "\r\n",
pt->payload_type,
STR_FMT(fb));
}
} }
} }
} }
@ -2922,6 +2935,7 @@ static void print_sdp_session_section(GString *s, struct sdp_ng_flags *flags,
append_attr_to_gstring(s, "a=ice-lite", NULL, flags, MT_UNKNOWN); append_attr_to_gstring(s, "a=ice-lite", NULL, flags, MT_UNKNOWN);
} }
/* TODO: rework an appending of parameters in terms of sdp attribute manipulations */
static struct packet_stream *print_sdp_media_section(GString *s, struct call_media *media, static struct packet_stream *print_sdp_media_section(GString *s, struct call_media *media,
struct sdp_media *sdp_media, struct sdp_media *sdp_media,
struct sdp_ng_flags *flags, struct sdp_ng_flags *flags,
@ -2937,7 +2951,7 @@ static struct packet_stream *print_sdp_media_section(GString *s, struct call_med
if (is_active) { if (is_active) {
if (proto_is_rtp(media->protocol)) if (proto_is_rtp(media->protocol))
insert_codec_parameters(s, media); insert_codec_parameters(s, media, flags);
insert_sdp_attributes(s, media); insert_sdp_attributes(s, media);
@ -3210,7 +3224,8 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
} }
} }
err = replace_sdp_media_section(chop, call_media, sdp_media, rtp_ps_link, flags, err = replace_sdp_media_section(chop, call_media, sdp_media,
rtp_ps_link, flags,
keep_zero_address); keep_zero_address);
if (err) if (err)
goto error; goto error;

Loading…
Cancel
Save