|
|
|
@ -2928,30 +2928,40 @@ static void media_copy_type(struct call_media *dst, struct call_media *src) { |
|
|
|
dst->type_id = src->type_id; |
|
|
|
} |
|
|
|
|
|
|
|
__attribute__((nonnull(1, 2))) |
|
|
|
static void media_update_flags(struct call_media *media, struct stream_params *sp) { |
|
|
|
if (!sp->rtp_endpoint.port) |
|
|
|
return; |
|
|
|
|
|
|
|
/* copy parameters advertised by the sender of this message */ |
|
|
|
bf_copy_same(&media->media_flags, &sp->sp_flags, |
|
|
|
SHARED_FLAG_RTCP_MUX | SHARED_FLAG_ASYMMETRIC | SHARED_FLAG_UNIDIRECTIONAL | |
|
|
|
SHARED_FLAG_ICE | SHARED_FLAG_TRICKLE_ICE | SHARED_FLAG_ICE_LITE_PEER | |
|
|
|
SHARED_FLAG_END_OF_CANDIDATES | |
|
|
|
SHARED_FLAG_RTCP_FB | SHARED_FLAG_LEGACY_OSRTP | SHARED_FLAG_LEGACY_OSRTP_REV); |
|
|
|
} |
|
|
|
|
|
|
|
__attribute__((nonnull(1, 2, 3))) |
|
|
|
static void media_update_crypto(struct call_media *media, struct stream_params *sp, sdp_ng_flags *flags) { |
|
|
|
if (!sp->rtp_endpoint.port) |
|
|
|
return; |
|
|
|
|
|
|
|
// duplicate the entire queue of offered crypto params |
|
|
|
crypto_params_sdes_queue_clear(&media->sdes_in); |
|
|
|
crypto_params_sdes_queue_copy(&media->sdes_in, &sp->sdes_params); |
|
|
|
|
|
|
|
if (media->sdes_in.length) { |
|
|
|
MEDIA_SET(media, SDES); |
|
|
|
__sdes_accept(media, flags); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// `media` can be NULL |
|
|
|
__attribute__((nonnull(1, 3, 4))) |
|
|
|
static void __media_init_from_flags(struct call_media *other_media, struct call_media *media, |
|
|
|
struct stream_params *sp, sdp_ng_flags *flags) |
|
|
|
{ |
|
|
|
if (sp->rtp_endpoint.port) { |
|
|
|
/* copy parameters advertised by the sender of this message */ |
|
|
|
bf_copy_same(&other_media->media_flags, &sp->sp_flags, |
|
|
|
SHARED_FLAG_RTCP_MUX | SHARED_FLAG_ASYMMETRIC | SHARED_FLAG_UNIDIRECTIONAL | |
|
|
|
SHARED_FLAG_ICE | SHARED_FLAG_TRICKLE_ICE | SHARED_FLAG_ICE_LITE_PEER | |
|
|
|
SHARED_FLAG_END_OF_CANDIDATES | |
|
|
|
SHARED_FLAG_RTCP_FB | SHARED_FLAG_LEGACY_OSRTP | SHARED_FLAG_LEGACY_OSRTP_REV); |
|
|
|
|
|
|
|
// duplicate the entire queue of offered crypto params |
|
|
|
crypto_params_sdes_queue_clear(&other_media->sdes_in); |
|
|
|
crypto_params_sdes_queue_copy(&other_media->sdes_in, &sp->sdes_params); |
|
|
|
|
|
|
|
if (other_media->sdes_in.length) { |
|
|
|
MEDIA_SET(other_media, SDES); |
|
|
|
__sdes_accept(other_media, flags); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (flags->opmode == OP_OFFER || flags->opmode == OP_ANSWER || flags->opmode == OP_PUBLISH) { |
|
|
|
/* moved as plain text attributes, required later by sdp_create() |
|
|
|
* extmap |
|
|
|
@ -3079,6 +3089,8 @@ static struct call_media * monologue_add_zero_media(struct call_monologue *sende |
|
|
|
media_update_protocol(sender_media, sp); |
|
|
|
media_update_media_id(sender_media, sp); |
|
|
|
media_loop_protect(sp, sender_media); |
|
|
|
media_update_flags(sender_media, sp); |
|
|
|
media_update_crypto(sender_media, sp, flags); |
|
|
|
__media_init_from_flags(sender_media, NULL, sp, flags); |
|
|
|
*num_ports_other = proto_num_ports(sp->num_ports, sender_media, flags, |
|
|
|
(flags->rtcp_mux_demux || flags->rtcp_mux_accept) ? true : false); |
|
|
|
@ -3202,6 +3214,8 @@ int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q * |
|
|
|
else |
|
|
|
media_answer_media_id(sender_media, sp); |
|
|
|
media_loop_protect(sp, sender_media); |
|
|
|
media_update_flags(sender_media, sp); |
|
|
|
media_update_crypto(sender_media, sp, flags); |
|
|
|
__media_init_from_flags(sender_media, receiver_media, sp, flags); |
|
|
|
|
|
|
|
codecs_offer_answer(receiver_media, sender_media, sp, flags); |
|
|
|
@ -3608,6 +3622,8 @@ int monologue_publish(struct call_monologue *ml, sdp_streams_q *streams, sdp_ng_ |
|
|
|
media_update_protocol(media, sp); |
|
|
|
media_update_media_id(media, sp); |
|
|
|
media_loop_protect(sp, media); |
|
|
|
media_update_flags(media, sp); |
|
|
|
media_update_crypto(media, sp, flags); |
|
|
|
__media_init_from_flags(media, NULL, sp, flags); |
|
|
|
|
|
|
|
codec_store_populate(&media->codecs, &sp->codecs, |
|
|
|
@ -3699,6 +3715,8 @@ static int monologue_subscribe_request1(struct call_monologue *src_ml, struct ca |
|
|
|
media_set_protocol(dst_media, src_media, sp, flags); |
|
|
|
media_update_media_id(src_media, sp); |
|
|
|
media_copy_media_id(dst_media, src_media, flags); |
|
|
|
media_update_flags(dst_media, sp); |
|
|
|
media_update_crypto(dst_media, sp, flags); |
|
|
|
__media_init_from_flags(src_media, dst_media, sp, flags); |
|
|
|
|
|
|
|
codec_store_populate(&dst_media->codecs, &src_media->codecs, |
|
|
|
@ -3805,6 +3823,8 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flag |
|
|
|
media_update_protocol(dst_media, sp); |
|
|
|
media_answer_media_id(dst_media, sp); |
|
|
|
media_loop_protect(sp, dst_media); |
|
|
|
media_update_flags(dst_media, sp); |
|
|
|
media_update_crypto(dst_media, sp, flags); |
|
|
|
__media_init_from_flags(dst_media, NULL, sp, flags); |
|
|
|
|
|
|
|
if (flags->allow_transcoding) { |
|
|
|
|