static RtpProfile *make_profile(LinphoneCall *call, const SalMediaDescription *md, const SalStreamDescription *desc, int *used_pt){ int bw; const MSList *elem; RtpProfile *prof=rtp_profile_new("Call profile"); bool_t first=TRUE; int remote_bw=0; LinphoneCore *lc=call->core; int up_ptime=0; *used_pt=-1; for(elem=desc->payloads;elem!=NULL;elem=elem->next){ PayloadType *pt=(PayloadType*)elem->data; int number; if ((pt->flags & PAYLOAD_TYPE_FLAG_CAN_SEND) && first) { if (desc->type==SalAudio){ linphone_core_update_allocated_audio_bandwidth_in_call(call,pt); up_ptime=linphone_core_get_upload_ptime(lc); } *used_pt=payload_type_get_number(pt); first=FALSE; } if (desc->bandwidth>0) remote_bw=desc->bandwidth; else if (md->bandwidth>0) { /*case where b=AS is given globally, not per stream*/ remote_bw=md->bandwidth; if (desc->type==SalVideo){ remote_bw=get_video_bandwidth(remote_bw,call->audio_bw); } } if (desc->type==SalAudio){ bw=get_min_bandwidth(call->audio_bw,remote_bw); }else bw=get_min_bandwidth(get_video_bandwidth(linphone_core_get_upload_bandwidth (lc),call->audio_bw),remote_bw); if (bw>0) pt->normal_bitrate=bw*1000; else if (desc->type==SalAudio){ pt->normal_bitrate=-1; } if (desc->ptime>0){ up_ptime=desc->ptime; } if (up_ptime>0){ char tmp[40]; snprintf(tmp,sizeof(tmp),"ptime=%i",up_ptime); payload_type_append_send_fmtp(pt,tmp); } number=payload_type_get_number(pt); if (rtp_profile_get_payload(prof,number)!=NULL){ ms_warning("A payload type with number %i already exists in profile !",number); }else rtp_profile_set_payload(prof,number,pt); } return prof; }
/* return TRUE if codec can be used with bandwidth, FALSE else*/ bool_t linphone_core_check_payload_type_usability(LinphoneCore *lc, PayloadType *pt) { double codec_band; int allowed_bw,video_bw; bool_t ret=FALSE; linphone_core_update_allocated_audio_bandwidth(lc); allowed_bw=get_min_bandwidth(linphone_core_get_download_bandwidth(lc), linphone_core_get_upload_bandwidth(lc)); if (allowed_bw==0) { allowed_bw=-1; video_bw=1500; /*around 1.5 Mbit/s*/ }else video_bw=get_video_bandwidth(allowed_bw,lc->audio_bw); switch (pt->type){ case PAYLOAD_AUDIO_CONTINUOUS: case PAYLOAD_AUDIO_PACKETIZED: codec_band=get_audio_payload_bandwidth(lc,pt); ret=bandwidth_is_greater(allowed_bw*1000,codec_band); /*hack to avoid using uwb codecs when having low bitrate and video*/ if (bandwidth_is_greater(199,allowed_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: if (video_bw>0){ pt->normal_bitrate=video_bw*1000; ret=TRUE; } else ret=FALSE; break; } return ret; }