diff --git a/daemon/call.c b/daemon/call.c index d885f03cf..94a78eb83 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -2362,8 +2362,14 @@ static void __t38_reset(struct call_media *media, struct call_media *other_media media->format_str = call_str_cpy(&other_media->format_str); } -__attribute__((nonnull(2, 3, 4))) -static void __update_media_protocol(struct call_media *media, struct call_media *other_media, +__attribute__((nonnull(1, 2))) +static void media_update_protocol(struct call_media *media, struct stream_params *sp) { + media->protocol_str = call_str_cpy(&sp->protocol_str); + media->protocol = sp->protocol; +} + +__attribute__((nonnull(1, 2, 3, 4))) +static void media_set_protocol(struct call_media *media, struct call_media *other_media, struct stream_params *sp, sdp_ng_flags *flags) { /* deduct protocol from stream parameters received */ @@ -2377,57 +2383,55 @@ static void __update_media_protocol(struct call_media *media, struct call_media * Answers are a special case: handle OSRTP answer/accept, but otherwise * answer with the same protocol that was offered, unless we're instructed * not to. */ - if (media) { - if (flags->opmode == OP_ANSWER) { - // OSRTP? - if (other_media->protocol && other_media->protocol->rtp - && !other_media->protocol->srtp - && media->protocol && media->protocol->osrtp) - { - // accept it? - if (flags->osrtp_accept_rfc) - ; - else - media->protocol = NULL; // reject - } - // pass through any other protocol change? - else if (!flags->protocol_accept) { - if (media->protocol && sp->protocol && !media->protocol->osrtp && sp->protocol->osrtp) { - ilog(LOG_WARNING, "Ignore OSRTP answer since this was not offered"); - other_media->protocol = media->protocol; - } - } + if (flags->opmode == OP_ANSWER) { + // OSRTP? + if (other_media->protocol && other_media->protocol->rtp + && !other_media->protocol->srtp + && media->protocol && media->protocol->osrtp) + { + // accept it? + if (flags->osrtp_accept_rfc) + ; else - media->protocol = NULL; + media->protocol = NULL; // reject + } + // pass through any other protocol change? + else if (!flags->protocol_accept) { + if (media->protocol && sp->protocol && !media->protocol->osrtp && sp->protocol->osrtp) { + ilog(LOG_WARNING, "Ignore OSRTP answer since this was not offered"); + other_media->protocol = media->protocol; + } } else media->protocol = NULL; } + else + media->protocol = NULL; } /* default is to leave the protocol unchanged */ - if (media && !media->protocol) + if (!media->protocol) media->protocol = other_media->protocol; - if (media && !media->protocol_str.s) + if (!media->protocol_str.s) media->protocol_str = call_str_cpy(&other_media->protocol_str); // handler overrides requested by the user /* allow override of outgoing protocol even if we know it already */ /* but only if this is an RTP-based protocol */ - if (media && flags->transport_protocol + if (flags->transport_protocol && proto_is_rtp(other_media->protocol)) media->protocol = flags->transport_protocol; // OSRTP offer requested? - if (media && media->protocol && media->protocol->rtp && !media->protocol->srtp + if (media->protocol && media->protocol->rtp && !media->protocol->srtp && media->protocol->osrtp_proto && flags->osrtp_offer && flags->opmode == OP_OFFER) { media->protocol = &transport_protocols[media->protocol->osrtp_proto]; } // T.38 decoder? - if (media && other_media->type_id == MT_IMAGE && proto_is(other_media->protocol, PROTO_UDPTL) + if (other_media->type_id == MT_IMAGE && proto_is(other_media->protocol, PROTO_UDPTL) && flags->t38_decode) { media->protocol = flags->transport_protocol; @@ -2439,7 +2443,7 @@ static void __update_media_protocol(struct call_media *media, struct call_media } // T.38 encoder? - if (media && other_media->type_id == MT_AUDIO && proto_is_rtp(other_media->protocol) + if (other_media->type_id == MT_AUDIO && proto_is_rtp(other_media->protocol) && flags->t38_force) { media->protocol = &transport_protocols[PROTO_UDPTL]; @@ -2450,7 +2454,7 @@ static void __update_media_protocol(struct call_media *media, struct call_media } // previous T.38 gateway but now stopping? - if (media && flags->t38_stop) { + if (flags->t38_stop) { if (other_media->type_id == MT_AUDIO && proto_is_rtp(other_media->protocol) && media->type_id == MT_IMAGE && proto_is(media->protocol, PROTO_UDPTL)) @@ -2459,7 +2463,6 @@ static void __update_media_protocol(struct call_media *media, struct call_media && other_media->type_id == MT_IMAGE && proto_is(other_media->protocol, PROTO_UDPTL)) __t38_reset(media, other_media); - // drop through for protocol override } } @@ -2930,7 +2933,6 @@ __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) { - __update_media_protocol(media, other_media, sp, flags); __update_media_id(media, other_media, sp, flags); __endpoint_loop_protect(sp, other_media); @@ -3076,6 +3078,7 @@ static struct call_media * monologue_add_zero_media(struct call_monologue *sende sender_media = __get_media(sender_ml, sp, flags, 0, tracker); sender_media->media_sdp_id = sp->media_sdp_id; media_update_type(sender_media, sp); + media_update_protocol(sender_media, sp); __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); @@ -3191,6 +3194,7 @@ int monologue_offer_answer(struct call_monologue *monologues[2], sdp_streams_q * media_set_echo_reverse(receiver_media, flags); if (media_update_type(sender_media, sp)) media_copy_type(receiver_media, sender_media); + media_set_protocol(receiver_media, sender_media, sp, flags); __media_init_from_flags(sender_media, receiver_media, sp, flags); codecs_offer_answer(receiver_media, sender_media, sp, flags); @@ -3594,6 +3598,7 @@ int monologue_publish(struct call_monologue *ml, sdp_streams_q *streams, sdp_ng_ media_init_from_flags(media, flags); media_update_type(media, sp); + media_update_protocol(media, sp); __media_init_from_flags(media, NULL, sp, flags); codec_store_populate(&media->codecs, &sp->codecs, @@ -3682,6 +3687,7 @@ static int monologue_subscribe_request1(struct call_monologue *src_ml, struct ca media_set_echo_reverse(dst_media, flags); media_set_siprec_label(src_media, dst_media, flags); media_update_type(dst_media, sp); + media_set_protocol(dst_media, src_media, sp, flags); __media_init_from_flags(src_media, dst_media, sp, flags); codec_store_populate(&dst_media->codecs, &src_media->codecs, @@ -3785,6 +3791,7 @@ int monologue_subscribe_answer(struct call_monologue *dst_ml, sdp_ng_flags *flag rev_ms->attrs.transcoding = false; media_init_from_flags(dst_media, flags); + media_update_protocol(dst_media, sp); __media_init_from_flags(dst_media, NULL, sp, flags); if (flags->allow_transcoding) {