Browse Source

MT#56521 split out SDP media replacement function

Functional no-op

Change-Id: I723bb1da39743db7bc9f7b99bd9caa52be48c7dd
pull/1614/head
Richard Fuchs 3 years ago
parent
commit
78ffaa33fd
1 changed files with 69 additions and 52 deletions
  1. +69
    -52
      daemon/sdp.c

+ 69
- 52
daemon/sdp.c View File

@ -1558,12 +1558,12 @@ static void sp_free(void *p) {
// associating offer/answer media sections directly with each other, instead of requiring // associating offer/answer media sections directly with each other, instead of requiring
// the indexing to be in order and instead of requiring all sections between monologue and sdp_media // the indexing to be in order and instead of requiring all sections between monologue and sdp_media
// lists to be matching. // lists to be matching.
static void legacy_osrtp_accept(struct stream_params *sp, GQueue *streams, GList *prev_media_link,
static void legacy_osrtp_accept(struct stream_params *sp, GQueue *streams, GList *media_link,
struct sdp_ng_flags *flags, unsigned int *num) struct sdp_ng_flags *flags, unsigned int *num)
{ {
if (!streams->tail) if (!streams->tail)
return; return;
if (!prev_media_link)
if (!media_link || !media_link->prev)
return; return;
struct stream_params *last = streams->tail->data; struct stream_params *last = streams->tail->data;
@ -1598,7 +1598,7 @@ static void legacy_osrtp_accept(struct stream_params *sp, GQueue *streams, GList
sp_free(last); sp_free(last);
SP_SET(sp, LEGACY_OSRTP); SP_SET(sp, LEGACY_OSRTP);
struct sdp_media *prev_media = prev_media_link->data;
struct sdp_media *prev_media = media_link->prev->data;
prev_media->legacy_osrtp = 1; prev_media->legacy_osrtp = 1;
sp->index--; sp->index--;
(*num)--; (*num)--;
@ -1730,7 +1730,7 @@ int sdp_streams(const GQueue *sessions, GQueue *streams, struct sdp_ng_flags *fl
sp->protocol = &transport_protocols[sp->protocol->osrtp_proto]; sp->protocol = &transport_protocols[sp->protocol->osrtp_proto];
} }
legacy_osrtp_accept(sp, streams, k->prev, flags, &num);
legacy_osrtp_accept(sp, streams, k, flags, &num);
// a=mid // a=mid
attr = attr_get_by_id(&media->attributes, ATTR_MID); attr = attr_get_by_id(&media->attributes, ATTR_MID);
@ -2738,6 +2738,68 @@ static struct packet_stream *print_sdp_media_section(GString *s, struct call_med
} }
static const char *replace_sdp_media_section(struct sdp_chopper *chop, struct call_media *call_media,
struct sdp_media *sdp_media, GList *rtp_ps_link, struct sdp_ng_flags *flags,
const bool keep_zero_address)
{
const char *err = NULL;
struct packet_stream *ps = rtp_ps_link->data;
bool is_active = true;
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, rtp_ps_link))
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, keep_zero_address))
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;
// leave everything untouched
is_active = false;
goto next;
}
err = "failed to process media attributes";
if (process_media_attributes(chop, sdp_media, flags, call_media))
goto error;
copy_up_to_end_of(chop, &sdp_media->s);
if (!sdp_media->port_num || !ps->selected_sfd)
is_active = false;
next:
print_sdp_media_section(chop->output, call_media, sdp_media,flags, rtp_ps_link, is_active,
attr_get_by_id(&sdp_media->attributes, ATTR_END_OF_CANDIDATES));
return NULL;
error:
return err;
}
/* called with call->master_lock held in W */ /* called with call->master_lock held in W */
int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologue *monologue, int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologue *monologue,
struct sdp_ng_flags *flags) struct sdp_ng_flags *flags)
@ -2877,7 +2939,6 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
rtp_ps_link = call_media->streams.head; rtp_ps_link = call_media->streams.head;
if (!rtp_ps_link) if (!rtp_ps_link)
goto error; goto error;
ps = rtp_ps_link->data;
// generate rejected m= line for accepted legacy OSRTP // generate rejected m= line for accepted legacy OSRTP
if (MEDIA_ISSET(call_media, LEGACY_OSRTP) if (MEDIA_ISSET(call_media, LEGACY_OSRTP)
@ -2895,55 +2956,11 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu
chopper_append_c(chop, "\r\n"); chopper_append_c(chop, "\r\n");
} }
bool is_active = true;
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, rtp_ps_link))
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, keep_zero_address))
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;
// leave everything untouched
is_active = false;
goto next;
}
err = "failed to process media attributes";
if (process_media_attributes(chop, sdp_media, flags, call_media))
err = replace_sdp_media_section(chop, call_media, sdp_media, rtp_ps_link, flags,
keep_zero_address);
if (err)
goto error; goto error;
copy_up_to_end_of(chop, &sdp_media->s);
if (!sdp_media->port_num || !ps->selected_sfd)
is_active = false;
next:
print_sdp_media_section(chop->output, call_media, sdp_media,flags, rtp_ps_link, is_active,
attr_get_by_id(&sdp_media->attributes, ATTR_END_OF_CANDIDATES));
media_index++; media_index++;
m = m->next; m = m->next;
} }


Loading…
Cancel
Save