diff --git a/daemon/call.c b/daemon/call.c index 75f5a9b7f..1312ffe6d 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2630,11 +2630,26 @@ static void __call_monologue_init_from_flags(struct call_monologue *ml, sdp_ng_f /* consume sdp session parts */ { /* origin (name, version etc.) */ + /* TODO: rework the whole SDP origin into one structure */ if (!ml->sdp_username && flags->session_sdp_orig.username.len) + { ml->sdp_username = call_strdup_len(call, flags->session_sdp_orig.username.s, flags->session_sdp_orig.username.len); + } if (!ml->sdp_session_id && flags->session_sdp_orig.session_id.len) + { ml->sdp_session_id = str_to_ui(&flags->session_sdp_orig.session_id, 0); + } + if (!ml->sdp_origin_ip && flags->session_sdp_orig.address.address.len) + { + ml->sdp_origin_ip = call_strdup_len(call, flags->session_sdp_orig.address.address.s, + flags->session_sdp_orig.address.address.len); + } + if (!ml->sdp_origin_ip_family && flags->session_sdp_orig.address.address_type.len) + { + ml->sdp_origin_ip_family = call_strdup_len(call, flags->session_sdp_orig.address.address_type.s, + flags->session_sdp_orig.address.address_type.len); + } ml->sdp_version = flags->session_sdp_orig.version_num; if (ml->sdp_version == ULLONG_MAX) ml->sdp_version = (unsigned int)ssl_random(); diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index e6d16be98..069abca62 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -3728,17 +3728,6 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out if (!srms.length) return "No call participants specified (no medias found)"; - /* special case with just one source: we can use the original SDP - * TODO: deprecate it, since initially added for monologue subscriptions. - */ - struct call_monologue *sdp_ml = NULL; - if (srms.length == 1) { - struct media_subscription *ms = srms.head->data; - sdp_ml = ms->monologue; - if (!sdp_ml->last_in_sdp.len || !sdp_ml->last_in_sdp_parsed.length) - sdp_ml = NULL; - } - /* the `label=` option was possibly used above to select the from-tag -- * switch it out with `to-label=` or `set-label=` for monologue_subscribe_request * below which sets the label based on `label` for a newly created monologue */ @@ -3752,34 +3741,20 @@ const char *call_subscribe_request_ng(bencode_item_t *input, bencode_item_t *out flags.to_tag = STR_CONST_INIT(rand_buf); rand_hex_str(flags.to_tag.s, flags.to_tag.len / 2); } - struct call_monologue *dest_ml = call_get_or_create_monologue(call, &flags.to_tag); - /* rewrite SDP, or create new? */ - struct sdp_chopper *chopper = NULL; - if (sdp_ml) { - chopper = sdp_chopper_new(&sdp_ml->last_in_sdp); - bencode_buffer_destroy_add(output->buffer, (free_func_t) sdp_chopper_destroy, chopper); - } + struct call_monologue *dest_ml = call_get_or_create_monologue(call, &flags.to_tag); int ret = monologue_subscribe_request(&srms, dest_ml, &flags); if (ret) return "Failed to request subscription"; - if (chopper && sdp_ml) { - ret = sdp_replace(chopper, &sdp_ml->last_in_sdp_parsed, dest_ml, &flags); - if (ret) - return "Failed to rewrite SDP"; - } else { - /* create new SDP */ - ret = sdp_create(&sdp_out, dest_ml, &flags); - } + /* create new SDP */ + ret = sdp_create(&sdp_out, dest_ml, &flags); + if (ret) + return "Failed to create SDP"; /* place return output SDP */ - if (chopper) { - if (chopper->output->len) - bencode_dictionary_add_string_len(output, "sdp", chopper->output->str, - chopper->output->len); - } else if (sdp_out.len) { + if (sdp_out.len) { bencode_buffer_destroy_add(output->buffer, g_free, sdp_out.s); bencode_dictionary_add_str(output, "sdp", &sdp_out); sdp_out = STR_NULL; /* ownership passed to output */ diff --git a/daemon/janus.c b/daemon/janus.c index 426ae8257..335f38411 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -630,6 +630,7 @@ static const char *janus_videoroom_join(struct websocket_message *wm, struct jan flags.generate_mid = 1; flags.rtcp_mirror = 1; + flags.replace_origin = 1; if (!plain_offer) ng_flags_webrtc(&flags); @@ -866,6 +867,7 @@ static const char *janus_videoroom_configure(struct websocket_message *wm, struc // accept unsupported codecs if necessary flags.accept_any = 1; + flags.replace_origin = 1; int ret = monologue_publish(ml, &streams, &flags); if (ret) diff --git a/daemon/sdp.c b/daemon/sdp.c index 59cf6f745..b0a41e529 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -3413,14 +3413,14 @@ static void sdp_out_add_origin(GString *out, struct call_monologue *monologue, if (ms && ms->monologue) { ml = ms->monologue; - if (flags->media_address.s && is_addr_unspecified(&flags->parsed_media_address)) - __parse_address(&flags->parsed_media_address, NULL, NULL, &flags->media_address); - if (flags->session_sdp_orig.parsed && - flags->replace_origin && - flags->ice_option != ICE_FORCE_RELAY && - !is_addr_unspecified(&flags->parsed_media_address)) + /* by default set to what's parsed from SDP + * but only if a replacement of origin isn't requested */ + if (!flags->replace_origin) { - origin_address = sockaddr_print_buf(&flags->parsed_media_address); + if (ml->sdp_origin_ip) + origin_address = ml->sdp_origin_ip; + if (ml->sdp_origin_ip_family) + origin_address_type = ml->sdp_origin_ip_family; } } diff --git a/include/call.h b/include/call.h index fa4ad5cc6..6a92c94ac 100644 --- a/include/call.h +++ b/include/call.h @@ -604,14 +604,17 @@ struct call_monologue { GHashTable *media_ids; struct media_player *player; struct media_player *rec_player; - unsigned long long sdp_session_id; - unsigned long long sdp_version; + /* TODO: cover all parts related to the SDP origin into one struct */ + unsigned long long sdp_session_id; /* sdp origin session id */ + unsigned long long sdp_version; /* sdp origin session ver */ int sdp_session_rr, sdp_session_rs; str last_in_sdp; sdp_sessions_q last_in_sdp_parsed; /* last parsed `sdp_session` */ sdp_streams_q last_in_sdp_streams; /* last parsed `stream_params` */ GString *last_out_sdp; - char *sdp_username; + char *sdp_username; /* sdp origin session name */ + char *sdp_origin_ip; /* sdp origin ip */ + char *sdp_origin_ip_family; /* sdp origin ip family */ char *sdp_session_name; char *sdp_session_timing; struct ssrc_hash *ssrc_hash; diff --git a/t/auto-daemon-tests-pubsub.pl b/t/auto-daemon-tests-pubsub.pl index 91a961d3c..511799640 100755 --- a/t/auto-daemon-tests-pubsub.pl +++ b/t/auto-daemon-tests-pubsub.pl @@ -105,9 +105,9 @@ snd($sock_a, $port_b, rtp(0, 4000, 7000, 0x6543, "\x00" x 160)); rcv_no($sock_c); (undef, $ttr, undef, undef, undef, $port_c) = subscribe_request('SIPREC pause/resume', - { 'from-tag' => ft(), flags => ['SIPREC'] }, < ft(), flags => ['SIPREC', 'replace-origin'] }, < ['all', 'SIPREC'] }, < ['all', 'SIPREC', 'replace-origin'] }, < ['all', 'SIPREC'] }, < ['all'] }, < [ft(), tt()] }, < ['from-tags-' . ft(), 'from-tags-' . tt()] }, < [tt(), ft()] }, < ['all', 'SIPREC'] }, < ['all', 'SIPREC'], 'to-tag' => $ttr }, < ['all', 'SIPREC'], 'to-tag' => $ttr }, < ['all', 'SIPREC'], 'to-tag' => $ttr }, < [ $ftr, $fts ] }, < [ft(), tt()] }, < [qw/SIPREC all/]}, <