MT#60476 remove dependency on sdp_media

Remove print_sdp_media_section's dependency on sdp_media and instead use
a call_media object as source.

Change-Id: I0486b10590ae996da22822f57ec48110f4b88da1
rfuchs/test
Richard Fuchs 8 months ago
parent e143fa08ca
commit 082505a7c2

@ -2640,33 +2640,28 @@ strip_with_subst:
return 0; return 0;
} }
static void new_priority(struct sdp_media *media, enum ice_candidate_type type, unsigned int *tprefp, static void new_priority(struct call_media *media, enum ice_candidate_type type, unsigned int *tprefp,
unsigned int *lprefp) unsigned int *lprefp)
{ {
unsigned int lpref, tpref; unsigned int lpref, tpref;
uint32_t prio; uint32_t prio;
struct sdp_attribute *a;
struct attribute_candidate *c;
lpref = 0; lpref = 0;
tpref = ice_type_preference(type); tpref = ice_type_preference(type);
prio = ice_priority_pref(tpref, lpref, 1); prio = ice_priority_pref(tpref, lpref, 1);
attributes_q *cands = attr_list_get_by_id(&media->attributes, ATTR_CANDIDATE); candidate_q *cands = &media->ice_candidates;
if (!cands)
goto out;
for (__auto_type l = cands->head; l; l = l->next) { for (__auto_type l = cands->head; l; l = l->next) {
a = l->data; __auto_type c = l->data;
c = &a->candidate; if (c->priority <= prio && c->type == type
if (c->cand_parsed.priority <= prio && c->cand_parsed.type == type && c->component_id == 1)
&& c->cand_parsed.component_id == 1)
{ {
/* tpref should come out as 126 (if host) here, unless the client isn't following /* tpref should come out as 126 (if host) here, unless the client isn't following
* the RFC, in which case we must adapt */ * the RFC, in which case we must adapt */
tpref = ice_type_pref_from_prio(c->cand_parsed.priority); tpref = ice_type_pref_from_prio(c->priority);
lpref = ice_local_pref_from_prio(c->cand_parsed.priority); lpref = ice_local_pref_from_prio(c->priority);
if (lpref) if (lpref)
lpref--; lpref--;
else { else {
@ -2679,14 +2674,13 @@ static void new_priority(struct sdp_media *media, enum ice_candidate_type type,
} }
} }
out:
*tprefp = tpref; *tprefp = tpref;
*lprefp = lpref; *lprefp = lpref;
} }
static void insert_candidate(GString *s, stream_fd *sfd, static void insert_candidate(GString *s, stream_fd *sfd,
unsigned int type_pref, unsigned int local_pref, enum ice_candidate_type type, unsigned int type_pref, unsigned int local_pref, enum ice_candidate_type type,
const sdp_ng_flags *flags, struct sdp_media *sdp_media) const sdp_ng_flags *flags, struct call_media *media)
{ {
unsigned long priority; unsigned long priority;
struct packet_stream *ps = sfd->stream; struct packet_stream *ps = sfd->stream;
@ -2707,16 +2701,16 @@ static void insert_candidate(GString *s, stream_fd *sfd,
/* append to the chop->output */ /* append to the chop->output */
append_tagged_attr_to_gstring(s, "candidate", &ifa->ice_foundation, &STR_GS(s_dst), flags, append_tagged_attr_to_gstring(s, "candidate", &ifa->ice_foundation, &STR_GS(s_dst), flags,
(sdp_media ? sdp_media->media_type_id : MT_UNKNOWN)); (media ? media->type_id : MT_UNKNOWN));
} }
static void insert_sfd_candidates(GString *s, struct packet_stream *ps, static void insert_sfd_candidates(GString *s, struct packet_stream *ps,
unsigned int type_pref, unsigned int local_pref, enum ice_candidate_type type, unsigned int type_pref, unsigned int local_pref, enum ice_candidate_type type,
const sdp_ng_flags *flags, struct sdp_media *sdp_media) const sdp_ng_flags *flags)
{ {
for (__auto_type l = ps->sfds.head; l; l = l->next) { for (__auto_type l = ps->sfds.head; l; l = l->next) {
stream_fd *sfd = l->data; stream_fd *sfd = l->data;
insert_candidate(s, sfd, type_pref, local_pref, type, flags, sdp_media); insert_candidate(s, sfd, type_pref, local_pref, type, flags, ps->media);
if (local_pref != -1) if (local_pref != -1)
local_pref++; local_pref++;
@ -2724,7 +2718,7 @@ static void insert_sfd_candidates(GString *s, struct packet_stream *ps,
} }
static void insert_candidates(GString *s, struct packet_stream *rtp, struct packet_stream *rtcp, static void insert_candidates(GString *s, struct packet_stream *rtp, struct packet_stream *rtcp,
const sdp_ng_flags *flags, struct sdp_media *sdp_media) const sdp_ng_flags *flags, struct call_media *source_media)
{ {
const struct local_intf *ifa; const struct local_intf *ifa;
struct call_media *media; struct call_media *media;
@ -2738,8 +2732,8 @@ static void insert_candidates(GString *s, struct packet_stream *rtp, struct pack
cand_type = ICT_HOST; cand_type = ICT_HOST;
if (flags->ice_option == ICE_FORCE_RELAY) if (flags->ice_option == ICE_FORCE_RELAY)
cand_type = ICT_RELAY; cand_type = ICT_RELAY;
if (MEDIA_ISSET(media, PASSTHRU) && sdp_media) if (MEDIA_ISSET(media, PASSTHRU) && source_media)
new_priority(sdp_media, cand_type, &type_pref, &local_pref); new_priority(source_media, cand_type, &type_pref, &local_pref);
else { else {
type_pref = ice_type_preference(cand_type); type_pref = ice_type_preference(cand_type);
local_pref = -1; local_pref = -1;
@ -2749,9 +2743,10 @@ static void insert_candidates(GString *s, struct packet_stream *rtp, struct pack
if (ag && AGENT_ISSET(ag, COMPLETED)) { if (ag && AGENT_ISSET(ag, COMPLETED)) {
ifa = rtp->selected_sfd->local_intf; ifa = rtp->selected_sfd->local_intf;
insert_candidate(s, rtp->selected_sfd, type_pref, ifa->unique_id, cand_type, flags, sdp_media); insert_candidate(s, rtp->selected_sfd, type_pref, ifa->unique_id, cand_type, flags, rtp->media);
if (rtcp) /* rtcp-mux only possible in answer */ if (rtcp) /* rtcp-mux only possible in answer */
insert_candidate(s, rtcp->selected_sfd, type_pref, ifa->unique_id, cand_type, flags, sdp_media); insert_candidate(s, rtcp->selected_sfd, type_pref, ifa->unique_id, cand_type, flags,
rtp->media);
if (flags->opmode == OP_OFFER && AGENT_ISSET(ag, CONTROLLING)) { if (flags->opmode == OP_OFFER && AGENT_ISSET(ag, CONTROLLING)) {
g_auto(candidate_q) rc = TYPED_GQUEUE_INIT; g_auto(candidate_q) rc = TYPED_GQUEUE_INIT;
@ -2767,15 +2762,16 @@ static void insert_candidates(GString *s, struct packet_stream *rtp, struct pack
sockaddr_print_buf(&cand->endpoint.address), cand->endpoint.port); sockaddr_print_buf(&cand->endpoint.address), cand->endpoint.port);
} }
/* append to the chop->output */ /* append to the chop->output */
append_attr_to_gstring(s, "remote-candidates", &STR_GS(s_dst), flags, (sdp_media ? sdp_media->media_type_id : MT_UNKNOWN)); append_attr_to_gstring(s, "remote-candidates", &STR_GS(s_dst), flags,
rtp->media->type_id);
} }
return; return;
} }
insert_sfd_candidates(s, rtp, type_pref, local_pref, cand_type, flags, sdp_media); insert_sfd_candidates(s, rtp, type_pref, local_pref, cand_type, flags);
if (rtcp) /* rtcp-mux only possible in answer */ if (rtcp) /* rtcp-mux only possible in answer */
insert_sfd_candidates(s, rtcp, type_pref, local_pref, cand_type, flags, sdp_media); insert_sfd_candidates(s, rtcp, type_pref, local_pref, cand_type, flags);
} }
static void insert_setup(GString *out, struct call_media *media, const sdp_ng_flags *flags, static void insert_setup(GString *out, struct call_media *media, const sdp_ng_flags *flags,
@ -3192,7 +3188,6 @@ static void print_sdp_session_section(GString *s, sdp_ng_flags *flags,
/* TODO: rework an appending of parameters in terms of sdp attribute manipulations */ /* 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 call_media *source_media, struct call_media *source_media,
const sdp_ng_flags *flags, const sdp_ng_flags *flags,
packet_stream_list *rtp_ps_link, packet_stream_list *rtp_ps_link,
@ -3249,7 +3244,7 @@ static struct packet_stream *print_sdp_media_section(GString *s, struct call_med
media->type_id); media->type_id);
} }
if (MEDIA_ISSET(media, ICE)) { if (MEDIA_ISSET(media, ICE)) {
insert_candidates(s, rtp_ps, ps_rtcp, flags, sdp_media); insert_candidates(s, rtp_ps, ps_rtcp, flags, source_media);
} }
/* message media type. Cases like: "m=message 28000 TCP/MSRP *" */ /* message media type. Cases like: "m=message 28000 TCP/MSRP *" */
@ -3319,8 +3314,9 @@ static const char *replace_sdp_media_section(struct sdp_chopper *chop, struct ca
if (!sdp_media->port_num || !ps->selected_sfd) if (!sdp_media->port_num || !ps->selected_sfd)
is_active = false; is_active = false;
next: next:;
print_sdp_media_section(chop->output, call_media, sdp_media, NULL, flags, rtp_ps_link, is_active, struct call_media *source_media = sdp_out_set_source_media_address(call_media, ps, flags, NULL);
print_sdp_media_section(chop->output, call_media, source_media, flags, rtp_ps_link, is_active,
attr_get_by_id(&sdp_media->attributes, ATTR_END_OF_CANDIDATES), false); attr_get_by_id(&sdp_media->attributes, ATTR_END_OF_CANDIDATES), false);
return NULL; return NULL;
@ -3814,7 +3810,7 @@ void handle_sdp_media_attributes(GString *s, struct call_media *media,
// XXX is this a better or worse test than used in print_rtcp()? // XXX is this a better or worse test than used in print_rtcp()?
if (rtcp_ps && (!rtcp_ps->selected_sfd || rtcp_ps->selected_sfd->socket.local.port == 0)) if (rtcp_ps && (!rtcp_ps->selected_sfd || rtcp_ps->selected_sfd->socket.local.port == 0))
rtcp_ps = NULL; rtcp_ps = NULL;
insert_candidates(s, rtp_ps, rtcp_ps, flags, NULL); insert_candidates(s, rtp_ps, rtcp_ps, flags, source_media);
} }
return; return;
} }
@ -3839,7 +3835,7 @@ void handle_sdp_media_attributes(GString *s, struct call_media *media,
sdp_out_add_bandwidth(s, monologue, media); sdp_out_add_bandwidth(s, monologue, media);
/* print media level attributes */ /* print media level attributes */
print_sdp_media_section(s, media, NULL, source_media, flags, rtp_ps_link, true, false, true); print_sdp_media_section(s, media, source_media, flags, rtp_ps_link, true, false, true);
} }

Loading…
Cancel
Save