diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 2e5c78f36..328671adf 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -63,12 +63,12 @@ int lc_callback_obj_invoke(LCCallbackObj *obj, LinphoneCore *lc){ } -static MSList *make_codec_list(const MSList *codecs, bool_t only_one_codec){ +static MSList *make_codec_list(LinphoneCore *lc, const MSList *codecs, bool_t only_one_codec){ MSList *l=NULL; const MSList *it; for(it=codecs;it!=NULL;it=it->next){ PayloadType *pt=(PayloadType*)it->data; - if (pt->flags & PAYLOAD_TYPE_ENABLED){ + if ((pt->flags & PAYLOAD_TYPE_ENABLED) && linphone_core_check_payload_type_usability(lc,pt)){ l=ms_list_append(l,payload_type_clone(pt)); if (only_one_codec) break; } @@ -90,7 +90,7 @@ static SalMediaDescription *create_local_media_description(LinphoneCore *lc, md->streams[0].proto=SalProtoRtpAvp; md->streams[0].type=SalAudio; md->streams[0].ptime=lc->net_conf.down_ptime; - l=make_codec_list(lc->codecs_conf.audio_codecs,only_one_codec); + l=make_codec_list(lc,lc->codecs_conf.audio_codecs,only_one_codec); pt=payload_type_clone(rtp_profile_get_payload_from_mime(&av_profile,"telephone-event")); l=ms_list_append(l,pt); md->streams[0].payloads=l; @@ -103,7 +103,7 @@ static SalMediaDescription *create_local_media_description(LinphoneCore *lc, md->streams[1].port=linphone_core_get_video_port(lc); md->streams[1].proto=SalProtoRtpAvp; md->streams[1].type=SalVideo; - l=make_codec_list(lc->codecs_conf.video_codecs,only_one_codec); + l=make_codec_list(lc,lc->codecs_conf.video_codecs,only_one_codec); md->streams[1].payloads=l; if (lc->dw_video_bw) md->streams[1].bandwidth=lc->dw_video_bw; diff --git a/coreapi/misc.c b/coreapi/misc.c index 70c75d82a..c6e673547 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -276,6 +276,12 @@ bool_t linphone_core_check_payload_type_usability(LinphoneCore *lc, PayloadType case PAYLOAD_AUDIO_PACKETIZED: codec_band=get_audio_payload_bandwidth(lc,pt); ret=bandwidth_is_greater(min_audio_bw*1000,codec_band); + /*hack to avoid using uwb codecs when having low bitrate and video*/ + if (bandwidth_is_greater(199,min_audio_bw)){ + if (linphone_core_video_enabled(lc) && pt->clock_rate>16000){ + ret=FALSE; + } + } //ms_message("Payload %s: %g",pt->mime_type,codec_band); break; case PAYLOAD_VIDEO: diff --git a/coreapi/sal_eXosip2.c b/coreapi/sal_eXosip2.c index ecd5bd24f..8e1a4bbfd 100644 --- a/coreapi/sal_eXosip2.c +++ b/coreapi/sal_eXosip2.c @@ -593,6 +593,16 @@ static void set_network_origin(SalOp *op, osip_message_t *req){ __sal_op_set_network_origin(op,origin); } +static SalOp *find_op(Sal *sal, eXosip_event_t *ev){ + if (ev->cid>0) + return (SalOp*)eXosip_call_get_reference(ev->cid);; + if (ev->rid>0){ + return sal_find_register(sal,ev->rid); + } + if (ev->response) return sal_find_other(sal,ev->response); + return NULL; +} + static void inc_new_call(Sal *sal, eXosip_event_t *ev){ SalOp *op=sal_op_new(sal); osip_from_t *from,*to; @@ -626,7 +636,7 @@ static void inc_new_call(Sal *sal, eXosip_event_t *ev){ } static void handle_reinvite(Sal *sal, eXosip_event_t *ev){ - SalOp *op=(SalOp*)ev->external_reference; + SalOp *op=find_op(sal,ev); sdp_message_t *sdp; osip_message_t *msg=NULL; @@ -669,7 +679,7 @@ static void handle_reinvite(Sal *sal, eXosip_event_t *ev){ } static void handle_ack(Sal *sal, eXosip_event_t *ev){ - SalOp *op=(SalOp*)ev->external_reference; + SalOp *op=find_op(sal,ev); sdp_message_t *sdp; if (op==NULL) { @@ -714,7 +724,7 @@ static void update_contact_from_response(SalOp *op, osip_message_t *response){ } static int call_proceeding(Sal *sal, eXosip_event_t *ev){ - SalOp *op=(SalOp*)ev->external_reference; + SalOp *op=find_op(sal,ev); if (op==NULL) { ms_warning("This call has been canceled."); @@ -750,10 +760,9 @@ static void call_ringing(Sal *sal, eXosip_event_t *ev){ static void call_accepted(Sal *sal, eXosip_event_t *ev){ sdp_message_t *sdp; osip_message_t *msg=NULL; - SalOp *op; + SalOp *op=find_op(sal,ev); const char *contact; - op=(SalOp*)ev->external_reference; if (op==NULL){ ms_error("A closed call is accepted ?"); return; @@ -778,9 +787,8 @@ static void call_accepted(Sal *sal, eXosip_event_t *ev){ } static void call_terminated(Sal *sal, eXosip_event_t *ev){ - SalOp *op; char *from; - op=(SalOp*)ev->external_reference; + SalOp *op=find_op(sal,ev); if (op==NULL){ ms_warning("Call terminated for already closed call ?"); return; @@ -793,8 +801,7 @@ static void call_terminated(Sal *sal, eXosip_event_t *ev){ } static void call_released(Sal *sal, eXosip_event_t *ev){ - SalOp *op; - op=(SalOp*)ev->external_reference; + SalOp *op=find_op(sal,ev); if (op==NULL){ return; } @@ -857,16 +864,6 @@ int sal_op_get_auth_requested(SalOp *op, const char **realm, const char **userna return -1; } -static SalOp *find_op(Sal *sal, eXosip_event_t *ev){ - if (ev->external_reference) - return (SalOp*)ev->external_reference; - if (ev->rid>0){ - return sal_find_register(sal,ev->rid); - } - if (ev->response) return sal_find_other(sal,ev->response); - return NULL; -} - static bool_t process_authentication(Sal *sal, eXosip_event_t *ev){ SalOp *op; const char *username,*realm;