From 0e439d9196841566c576d6bde4c8f9a08db9d869 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 22 Sep 2015 10:47:43 +0200 Subject: [PATCH] Fix and test for multiple mlines of same type in sdp --- coreapi/linphonecall.c | 52 +++++-- tester/complex_sip_call.c | 39 ++++++ .../call_with_multiple_audio_mline_in_sdp.xml | 132 ++++++++++++++++++ 3 files changed, 208 insertions(+), 15 deletions(-) create mode 100644 tester/sipp/call_with_multiple_audio_mline_in_sdp.xml diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 3b482be9b..43153a0cb 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -1088,16 +1088,23 @@ void linphone_call_set_compatible_incoming_call_parameters(LinphoneCall *call, c static void linphone_call_compute_streams_indexes(LinphoneCall *call, SalMediaDescription *md) { int i, j; + bool_t audio_found = FALSE, video_found = FALSE, text_found = FALSE; for (i = 0; i < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; i++) { if (!sal_stream_description_active(&md->streams[i])) continue; - if (md->streams[i].type == SalAudio && i != call->main_audio_stream_index) { - call->main_audio_stream_index = i; - ms_message("audio stream index updated: %i", i); + if (md->streams[i].type == SalAudio) { + if (!audio_found) { + call->main_audio_stream_index = i; + audio_found = TRUE; + ms_message("audio stream index found: %i, updating main audio stream index", i); + } else { + ms_message("audio stream index found: %i, but main audio stream already set to %i", i, call->main_audio_stream_index); + } // Check that the default value of a another stream doesn't match the new one if (i == call->main_video_stream_index) { for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; j++) { + if (sal_stream_description_active(&md->streams[j])) continue; if (j != call->main_video_stream_index && j != call->main_text_stream_index) { ms_message("%i was used for video stream ; now using %i", i, j); call->main_video_stream_index = j; @@ -1107,6 +1114,7 @@ static void linphone_call_compute_streams_indexes(LinphoneCall *call, SalMediaDe } if (i == call->main_text_stream_index) { for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; j++) { + if (sal_stream_description_active(&md->streams[j])) continue; if (j != call->main_video_stream_index && j != call->main_text_stream_index) { ms_message("%i was used for text stream ; now using %i", i, j); call->main_text_stream_index = j; @@ -1114,13 +1122,19 @@ static void linphone_call_compute_streams_indexes(LinphoneCall *call, SalMediaDe } } } - } else if (md->streams[i].type == SalVideo && i != call->main_video_stream_index) { - call->main_video_stream_index = i; - ms_message("video stream index updated: %i", i); + } else if (md->streams[i].type == SalVideo) { + if (!video_found) { + call->main_video_stream_index = i; + video_found = TRUE; + ms_message("video stream index found: %i, updating main video stream index", i); + } else { + ms_message("video stream index found: %i, but main video stream already set to %i", i, call->main_video_stream_index); + } // Check that the default value of a another stream doesn't match the new one if (i == call->main_audio_stream_index) { for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; j++) { + if (sal_stream_description_active(&md->streams[j])) continue; if (j != call->main_audio_stream_index && j != call->main_text_stream_index) { ms_message("%i was used for audio stream ; now using %i", i, j); call->main_audio_stream_index = j; @@ -1130,6 +1144,7 @@ static void linphone_call_compute_streams_indexes(LinphoneCall *call, SalMediaDe } if (i == call->main_text_stream_index) { for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; j++) { + if (sal_stream_description_active(&md->streams[j])) continue; if (j != call->main_audio_stream_index && j != call->main_text_stream_index) { ms_message("%i was used for text stream ; now using %i", i, j); call->main_text_stream_index = j; @@ -1137,25 +1152,32 @@ static void linphone_call_compute_streams_indexes(LinphoneCall *call, SalMediaDe } } } - } else if (md->streams[i].type == SalText && i != call->main_text_stream_index) { - call->main_text_stream_index = i; - ms_message("text stream index updated: %i", i); + } else if (md->streams[i].type == SalText) { + if (!text_found) { + call->main_text_stream_index = i; + text_found = TRUE; + ms_message("text stream index found: %i, updating main text stream index", i); + } else { + ms_message("text stream index found: %i, but main text stream already set to %i", i, call->main_text_stream_index); + } // Check that the default value of a another stream doesn't match the new one - if (i == call->main_video_stream_index) { + if (i == call->main_audio_stream_index) { for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; j++) { + if (sal_stream_description_active(&md->streams[j])) continue; if (j != call->main_video_stream_index && j != call->main_audio_stream_index) { - ms_message("%i was used for video stream ; now using %i", i, j); - call->main_video_stream_index = j; + ms_message("%i was used for audio stream ; now using %i", i, j); + call->main_audio_stream_index = j; break; } } } - if (i == call->main_audio_stream_index) { + if (i == call->main_video_stream_index) { for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; j++) { + if (sal_stream_description_active(&md->streams[j])) continue; if (j != call->main_video_stream_index && j != call->main_audio_stream_index) { - ms_message("%i was used for audio stream ; now using %i", i, j); - call->main_audio_stream_index = j; + ms_message("%i was used for video stream ; now using %i", i, j); + call->main_video_stream_index = j; break; } } diff --git a/tester/complex_sip_call.c b/tester/complex_sip_call.c index beeb62cdb..da9a68165 100644 --- a/tester/complex_sip_call.c +++ b/tester/complex_sip_call.c @@ -190,10 +190,49 @@ static void call_with_video_mline_before_audio_in_sdp() { linphone_core_manager_destroy(mgr); } +static void call_with_multiple_audio_mline_in_sdp() { + LinphoneCoreManager *mgr; + char *identity_char; + char *scen; + FILE * sipp_out; + LinphoneCall *call = NULL; + + /*currently we use direct connection because sipp do not properly set ACK request uri*/ + mgr= linphone_core_manager_new2( "empty_rc", FALSE); + mgr->identity = linphone_core_get_primary_contact_parsed(mgr->lc); + linphone_address_set_username(mgr->identity,"marie"); + identity_char = linphone_address_as_string(mgr->identity); + linphone_core_set_primary_contact(mgr->lc,identity_char); + + linphone_core_iterate(mgr->lc); + + scen = bc_tester_res("sipp/call_with_multiple_audio_mline_in_sdp.xml"); + + sipp_out = sip_start(scen, linphone_address_get_username(mgr->identity), mgr->identity); + + if (sipp_out) { + BC_ASSERT_TRUE(wait_for(mgr->lc, mgr->lc, &mgr->stat.number_of_LinphoneCallIncomingReceived, 1)); + call = linphone_core_get_current_call(mgr->lc); + linphone_core_accept_call(mgr->lc, call); + BC_ASSERT_TRUE(wait_for(mgr->lc, mgr->lc, &mgr->stat.number_of_LinphoneCallStreamsRunning, 1)); + BC_ASSERT_EQUAL(call->main_audio_stream_index, 0, int, "%d"); + BC_ASSERT_EQUAL(call->main_video_stream_index, 2, int, "%d"); + BC_ASSERT_TRUE(call->main_text_stream_index > 2); + BC_ASSERT_TRUE(linphone_call_log_video_enabled(linphone_call_get_call_log(call))); + + check_rtcp(call); + + BC_ASSERT_TRUE(wait_for(mgr->lc, mgr->lc, &mgr->stat.number_of_LinphoneCallEnd, 1)); + pclose(sipp_out); + } + linphone_core_manager_destroy(mgr); +} + static test_t tests[] = { { "SIP UPDATE within incoming reinvite without sdp", sip_update_within_icoming_reinvite_with_no_sdp }, { "Call with audio mline before video in sdp", call_with_audio_mline_before_video_in_sdp }, { "Call with video mline before audio in sdp", call_with_video_mline_before_audio_in_sdp }, + { "Call with multiple audio mline in sdp", call_with_multiple_audio_mline_in_sdp }, }; test_suite_t complex_sip_call_test_suite = { diff --git a/tester/sipp/call_with_multiple_audio_mline_in_sdp.xml b/tester/sipp/call_with_multiple_audio_mline_in_sdp.xml new file mode 100644 index 000000000..a47e3cc0c --- /dev/null +++ b/tester/sipp/call_with_multiple_audio_mline_in_sdp.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + ;tag=[pid]SIPpTag00[call_number] + To: sut + Call-ID: [call_id] + CSeq: 1 INVITE + Contact: sip:sipp@[local_ip]:[local_port] + Max-Forwards: 70 + Subject: Performance Test + Content-Type: application/sdp + Content-Length: [len] + + v=0 + o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip] + s=- + c=IN IP[media_ip_type] [media_ip] + t=0 0 + m=audio [media_port] RTP/AVP 96 97 0 8 101 98 + a=rtpmap:96 speex/16000 + a=fmtp:96 vbr=on + a=rtpmap:97 speex/8000 + a=fmtp:97 vbr=on + a=rtpmap:101 telephone-event/16000 + a=rtpmap:98 telephone-event/8000 + m=audio [media_port+1] RTP/AVP 96 97 0 8 101 98 + a=rtpmap:96 speex/16000 + a=fmtp:96 vbr=on + a=rtpmap:97 speex/8000 + a=fmtp:97 vbr=on + a=rtpmap:101 telephone-event/16000 + a=rtpmap:98 telephone-event/8000 + m=video [media_port+2] RTP/AVP 96 + a=rtpmap:96 VP8/90000 + + ]]> + + + + + + + + + + + + + + + + + + + + + ;tag=[pid]SIPpTag00[call_number] + To: sut [peer_tag_param] + Call-ID: [call_id] + CSeq: 1 ACK + Contact: sip:sipp@[local_ip]:[local_port] + Max-Forwards: 70 + Subject: Performance Test + Content-Length: 0 + + ]]> + + + + + + + + + ;tag=[pid]SIPpTag00[call_number] + To: sut [peer_tag_param] + Call-ID: [call_id] + CSeq: 2 BYE + Contact: sip:sipp@[local_ip]:[local_port] + Max-Forwards: 70 + Subject: Performance Test + Content-Length: 0 + + ]]> + + + + + + + + + + + + +