MT#60476 convert sdp_address to object

Use an object with local storage for sdp_address instead of just setting
a pointer. This makes it possible to put a different address.

Change-Id: I92e69b6a9eba9d0caa3853b3dcb134951d76b145
pull/1897/head
Richard Fuchs 12 months ago
parent f4e149328f
commit a733a8c83a

@ -309,7 +309,7 @@ static void attr_insert(struct sdp_attributes *attrs, struct sdp_attribute *attr
static struct call_media *sdp_out_set_source_media_address(struct call_media *media,
struct packet_stream *rtp_ps,
struct sdp_ng_flags *flags,
const endpoint_t **sdp_address);
endpoint_t *sdp_address);
static void sdp_out_add_bandwidth(GString *out, struct call_monologue *monologue,
struct call_media *media, sdp_ng_flags *flags);
@ -2645,7 +2645,7 @@ static void print_sdp_media_section(GString *s, struct call_media *media,
{
struct call_monologue *monologue = media->monologue;
struct packet_stream *ps_rtcp = NULL;
bool inactive_media = (!address || !address->port || !rtp_ps->selected_sfd); /* audio is accepted? */
bool inactive_media = (!address->port || !rtp_ps->selected_sfd); /* audio is accepted? */
if (source_media) {
/* just print out all original values and attributes */
@ -2886,8 +2886,8 @@ static void sdp_out_add_media_connection(GString *out, struct call_media *media,
const char *media_conn_address_type = NULL;
/* print zeroed address */
if (!address || (PS_ISSET(rtp_ps, ZERO_ADDR) && !MEDIA_ISSET(media, ICE))) {
if (!address) {
if (!address || !address->family || (PS_ISSET(rtp_ps, ZERO_ADDR) && !MEDIA_ISSET(media, ICE))) {
if (!address || !address->family) {
const struct intf_address *ifa_addr;
const struct local_intf *ifa;
if (rtp_ps->selected_sfd)
@ -3018,11 +3018,12 @@ static void sdp_out_original_media_attributes(GString *out, struct call_media *m
static struct call_media *sdp_out_set_source_media_address(struct call_media *media,
struct packet_stream *rtp_ps,
struct sdp_ng_flags *flags,
const endpoint_t **sdp_address)
endpoint_t *sdp_address)
{
struct call_media *source_media = NULL;
/* the port and address that goes into the SDP also depends on this */
*sdp_address = rtp_ps->selected_sfd ? &rtp_ps->selected_sfd->socket.local : NULL;
if (rtp_ps->selected_sfd)
*sdp_address = rtp_ps->selected_sfd->socket.local;
struct media_subscription *ms = call_media_get_top_ms(media);
if (ms && ms->media) {
@ -3031,7 +3032,7 @@ static struct call_media *sdp_out_set_source_media_address(struct call_media *me
if (media->type_id == MT_MESSAGE || flags->ice_option == ICE_FORCE_RELAY || MEDIA_ISSET(media, PASSTHRU)) {
if (source_media->streams.head) {
__auto_type sub_ps = source_media->streams.head->data;
*sdp_address = &sub_ps->advertised_endpoint;
*sdp_address = sub_ps->advertised_endpoint;
}
return source_media;
}
@ -3048,7 +3049,7 @@ static struct call_media *sdp_out_set_source_media_address(struct call_media *me
&& proto_is_rtp(media->protocol))
{
// convert to rejected/removed stream
*sdp_address = NULL;
*sdp_address = (endpoint_t) {0};
}
return NULL;
@ -3131,17 +3132,17 @@ int sdp_create(str *out, struct call_monologue *monologue, sdp_ng_flags *flags)
__auto_type rtp_ps_link = media->streams.head;
struct packet_stream *rtp_ps = rtp_ps_link->data;
const endpoint_t *sdp_address;
endpoint_t sdp_address = {0};
struct call_media *source_media = sdp_out_set_source_media_address(media, rtp_ps, flags,
&sdp_address);
unsigned int port = sdp_address ? sdp_address->port : 0;
unsigned int port = sdp_address.port;
prtp = NULL;
if (media->protocol && media->protocol->srtp)
prtp = &transport_protocols[media->protocol->rtp_proto];
/* handle first OSRTP part */
sdp_out_handle_osrtp1(s, media, sdp_address, prtp, rtp_ps, rtp_ps_link, flags);
sdp_out_handle_osrtp1(s, media, &sdp_address, prtp, rtp_ps, rtp_ps_link, flags);
/* set: media type, port, protocol (e.g. RTP/SAVP) */
err = "Unknown media protocol";
@ -3149,7 +3150,7 @@ int sdp_create(str *out, struct call_monologue *monologue, sdp_ng_flags *flags)
goto err;
/* print media level attributes */
print_sdp_media_section(s, media, sdp_address, source_media, rtp_ps, rtp_ps_link, flags);
print_sdp_media_section(s, media, &sdp_address, source_media, rtp_ps, rtp_ps_link, flags);
/* handle second OSRTP part */
sdp_out_handle_osrtp2(s, media, prtp);

Loading…
Cancel
Save