TT#107565 fix support for multi-session SDPs

also add better SDP error log output

closes #1182

Change-Id: I20ab77163a502793f63157fbafd0807c629a1ede
pull/1194/head
Richard Fuchs 5 years ago
parent 95aabe5434
commit 01112f27ca

@ -2373,16 +2373,21 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
int media_index, sess_conn;
struct call_media *call_media;
struct packet_stream *ps, *ps_rtcp;
const char *err = NULL;
m = monologue->medias.head;
media_index = 1;
for (l = sessions->head; l; l = l->next) {
session = l->data;
err = "no matching session media";
if (!m)
goto error;
call_media = m->data;
if (call_media->index != 1)
err = "mismatched session media index";
if (call_media->index != media_index)
goto error;
err = "no matching session media stream";
j = call_media->streams.head;
if (!j)
goto error;
@ -2403,16 +2408,19 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
if (session->origin.parsed && flags->replace_origin &&
flags->ice_option != ICE_FORCE_RELAY) {
err = "failed to replace network address";
if (replace_network_address(chop, &session->origin.address, ps, flags, 0))
goto error;
}
if (session->connection.parsed && sess_conn &&
flags->ice_option != ICE_FORCE_RELAY) {
err = "failed to replace network address";
if (replace_network_address(chop, &session->connection.address, ps, flags, 1))
goto error;
}
if (!MEDIA_ISSET(call_media, PASSTHRU)) {
err = "failed to process session attributes";
if (process_session_attributes(chop, &session->attributes, flags))
goto error;
}
@ -2428,39 +2436,48 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
if (MEDIA_ISSET(call_media, ICE) && MEDIA_ISSET(call_media, ICE_LITE_SELF))
chopper_append_c(chop, "a=ice-lite\r\n");
media_index = 1;
for (k = session->media_streams.head; k; k = k->next) {
sdp_media = k->data;
err = "no matching media";
if (!m)
goto error;
call_media = m->data;
err = "media index mismatched";
if (call_media->index != media_index)
goto error;
err = "no matching media stream";
j = call_media->streams.head;
if (!j)
goto error;
ps = j->data;
if (flags->ice_option != ICE_FORCE_RELAY && call_media->type_id != MT_MESSAGE) {
err = "failed to replace media type";
if (replace_media_type(chop, sdp_media, call_media))
goto error;
err = "failed to replace media port";
if (replace_media_port(chop, sdp_media, ps))
goto error;
err = "failed to replace media port count";
if (replace_consecutive_port_count(chop, sdp_media, ps, j))
goto error;
err = "failed to replace media protocol";
if (replace_transport_protocol(chop, sdp_media, call_media))
goto error;
err = "failed to replace media formats";
if (replace_codec_list(chop, sdp_media, call_media))
goto error;
if (sdp_media->connection.parsed) {
err = "failed to replace media network address";
if (replace_network_address(chop, &sdp_media->connection.address, ps,
flags, 1))
goto error;
}
}
else if (call_media->type_id == MT_MESSAGE) {
err = "failed to generate connection line";
if (!sdp_media->connection.parsed)
if (synth_session_connection(chop, sdp_media))
goto error;
@ -2468,6 +2485,7 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
goto next;
}
err = "failed to process media attributes";
if (process_media_attributes(chop, sdp_media, flags, call_media))
goto error;
@ -2491,6 +2509,7 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
if (ps->rtcp_sibling) {
ps_rtcp = ps->rtcp_sibling;
j = j->next;
err = "no RTCP sibling";
if (!j)
goto error;
assert(j->data == ps_rtcp);
@ -2560,7 +2579,7 @@ next:
return 0;
error:
ilog(LOG_ERROR, "Error rewriting SDP");
ilog(LOG_ERROR, "Error rewriting SDP: %s", err);
return -1;
}

Loading…
Cancel
Save