From 91f63591f7a71e6a10467103981bf59912782a0a Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Mon, 7 Dec 2015 15:19:29 +0100 Subject: [PATCH] Added boolean parameter implicit_rtcp_fb in LinphoneCallParams and SalStreamDescription to enable or disable the forcing of AVPF messages feature in AVP. By default, the feature is enabled and RTCP feedback messages PLI, SLI, RPSI and FIR are supported. --- coreapi/bellesip_sal/sal_sdp.c | 2 +- coreapi/linphonecall.c | 22 ++++++++++++++-------- coreapi/linphonecore.c | 1 + coreapi/private.h | 1 + coreapi/sal.c | 6 ++++++ include/sal/sal.h | 4 +++- tester/call_tester.c | 18 ++++++++++++++++-- 7 files changed, 42 insertions(+), 12 deletions(-) diff --git a/coreapi/bellesip_sal/sal_sdp.c b/coreapi/bellesip_sal/sal_sdp.c index 3d5934f1c..462316a26 100644 --- a/coreapi/bellesip_sal/sal_sdp.c +++ b/coreapi/bellesip_sal/sal_sdp.c @@ -335,7 +335,7 @@ static void stream_description_to_sdp ( belle_sdp_session_description_t *session } } - if ((rtp_port != 0) && sal_stream_description_has_avpf(stream)) { + if ((rtp_port != 0) && (sal_stream_description_has_avpf(stream) || sal_stream_description_has_implicit_avpf(stream))) { add_rtcp_fb_attributes(media_desc, md, stream); } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index 76621ab7c..b02d07e86 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -528,14 +528,18 @@ static void setup_rtcp_fb(LinphoneCall *call, SalMediaDescription *md) { md->streams[i].rtcp_fb.tmmbr_enabled = lp_config_get_int(lc->config, "rtp", "rtcp_fb_tmmbr_enabled", 0); for (pt_it = md->streams[i].payloads; pt_it != NULL; pt_it = pt_it->next) { pt = (PayloadType *)pt_it->data; - if (call->params->avpf_enabled == TRUE) { - payload_type_set_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); - avpf_params = payload_type_get_avpf_params(pt); - avpf_params.trr_interval = call->params->avpf_rr_interval; - } else { - payload_type_unset_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); - memset(&avpf_params, 0, sizeof(avpf_params)); - } + + if (call->params->avpf_enabled == FALSE && call->params->implicit_rtcp_fb == FALSE) { + payload_type_unset_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); + memset(&avpf_params, 0, sizeof(avpf_params)); + } + else { + payload_type_set_flag(pt, PAYLOAD_TYPE_RTCP_FEEDBACK_ENABLED); + avpf_params = payload_type_get_avpf_params(pt); + avpf_params.trr_interval = call->params->avpf_rr_interval; + + } + payload_type_set_avpf_params(pt, avpf_params); } } @@ -820,6 +824,8 @@ void linphone_call_make_local_media_description(LinphoneCall *call) { } setup_encryption_keys(call,md); setup_dtls_keys(call,md); + + if (params->implicit_rtcp_fb) md->streams[call->main_video_stream_index].implicit_rtcp_fb = TRUE; setup_rtcp_fb(call, md); setup_rtcp_xr(call, md); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 7eb42fb17..9b52e7fcf 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -7023,6 +7023,7 @@ void linphone_core_init_default_params(LinphoneCore*lc, LinphoneCallParams *para params->realtimetext_enabled = linphone_core_realtime_text_enabled(lc); params->privacy=LinphonePrivacyDefault; params->avpf_enabled=linphone_core_get_avpf_mode(lc); + params->implicit_rtcp_fb = lp_config_get_int(lc->config,"rtp","rtcp_fb_implicit_rtcp_fb",TRUE); params->audio_dir=LinphoneMediaDirectionSendRecv; params->video_dir=LinphoneMediaDirectionSendRecv; params->real_early_media=lp_config_get_int(lc->config,"misc","real_early_media",FALSE); diff --git a/coreapi/private.h b/coreapi/private.h index 1a10bed92..b0c73003a 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -138,6 +138,7 @@ struct _LinphoneCallParams{ bool_t has_audio; bool_t has_video; bool_t avpf_enabled; /* RTCP feedback messages are enabled */ + bool_t implicit_rtcp_fb; bool_t real_early_media; /*send real media even during early media (for outgoing calls)*/ bool_t in_conference; /*in conference mode */ diff --git a/coreapi/sal.c b/coreapi/sal.c index 2c858298a..32466c9a7 100644 --- a/coreapi/sal.c +++ b/coreapi/sal.c @@ -219,6 +219,12 @@ bool_t sal_stream_description_has_avpf(const SalStreamDescription *sd) { return FALSE; } +bool_t sal_stream_description_has_implicit_avpf(const SalStreamDescription *sd){ + if (sd->implicit_rtcp_fb){ + return TRUE; + } + return FALSE; +} /*these are switch case, so that when a new proto is added we can't forget to modify this function*/ bool_t sal_stream_description_has_srtp(const SalStreamDescription *sd) { switch (sd->proto){ diff --git a/include/sal/sal.h b/include/sal/sal.h index 6e1c4d068..9a06711d0 100644 --- a/include/sal/sal.h +++ b/include/sal/sal.h @@ -236,7 +236,8 @@ typedef struct SalStreamDescription{ SalSrtpCryptoAlgo crypto[SAL_CRYPTO_ALGO_MAX]; unsigned int crypto_local_tag; int max_rate; - OrtpRtcpFbConfiguration rtcp_fb; + bool_t implicit_rtcp_fb; + OrtpRtcpFbConfiguration rtcp_fb; OrtpRtcpXrConfiguration rtcp_xr; SalCustomSdpAttribute *custom_sdp_attributes; SalIceCandidate ice_candidates[SAL_MEDIA_DESCRIPTION_MAX_ICE_CANDIDATES]; @@ -309,6 +310,7 @@ SalStreamDescription * sal_media_description_find_best_stream(SalMediaDescriptio void sal_media_description_set_dir(SalMediaDescription *md, SalStreamDir stream_dir); bool_t sal_stream_description_active(const SalStreamDescription *sd); bool_t sal_stream_description_has_avpf(const SalStreamDescription *sd); +bool_t sal_stream_description_has_implicit_avpf(const SalStreamDescription *sd); bool_t sal_stream_description_has_srtp(const SalStreamDescription *sd); bool_t sal_stream_description_has_dtls(const SalStreamDescription *sd); bool_t sal_media_description_has_avpf(const SalMediaDescription *md); diff --git a/tester/call_tester.c b/tester/call_tester.c index 723dbdff3..f667f71d1 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -2041,7 +2041,6 @@ void video_call_base_3(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, LinphoneCall* pauline_call; LinphoneVideoPolicy marie_policy, pauline_policy; - if (using_policy) { marie_policy.automatically_initiate=FALSE; marie_policy.automatically_accept=TRUE; @@ -2070,7 +2069,7 @@ void video_call_base_3(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, /* Create call params */ caller_test_params.base=linphone_core_create_call_params(pauline->lc, NULL); - + if (!using_policy) linphone_call_params_enable_video(caller_test_params.base,TRUE); @@ -2140,6 +2139,20 @@ static void video_call(void) { linphone_core_manager_destroy(pauline); } +static void video_call_disable_implicit_AVPF_on_rcv(void) { + LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); + LpConfig *pauline_lp; + pauline_lp = linphone_core_get_config(pauline->lc); + lp_config_set_int(pauline_lp,"rtp","rtcp_fb_implicit_rtcp_fb",0); + + video_call_base_3(marie,pauline,FALSE,LinphoneMediaEncryptionNone,TRUE,TRUE); + end_call(pauline, marie); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + + +} static void video_call_base_avpf(LinphoneCoreManager* pauline,LinphoneCoreManager* marie, bool_t using_policy,LinphoneMediaEncryption mode, bool_t callee_video_enabled, bool_t caller_video_enabled) { linphone_core_set_avpf_mode(pauline->lc,LinphoneAVPFEnabled); linphone_core_set_avpf_mode(marie->lc,LinphoneAVPFEnabled); @@ -5699,6 +5712,7 @@ test_t call_tests[] = { { "Audio call with ICE no matching audio codecs", audio_call_with_ice_no_matching_audio_codecs }, #ifdef VIDEO_ENABLED { "Simple video call AVPF",video_call_avpf}, + { "Simple video call disable implicit",video_call_disable_implicit_AVPF_on_rcv}, { "Simple video call",video_call}, { "Simple ZRTP video call",video_call_zrtp}, { "Simple DTLS video call",video_call_dtls},