bool_t linphone_core_is_payload_type_usable_for_bandwidth(LinphoneCore *lc, PayloadType *pt, int bandwidth_limit) { double codec_band; bool_t ret=FALSE; switch (pt->type){ case PAYLOAD_AUDIO_CONTINUOUS: case PAYLOAD_AUDIO_PACKETIZED: codec_band=get_audio_payload_bandwidth(lc,pt); ret=bandwidth_is_greater(bandwidth_limit*1000,codec_band); /*hack to avoid using uwb codecs when having low bitrate and video*/ if (bandwidth_is_greater(199,bandwidth_limit)){ 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 (bandwidth_limit!=0) {/* infinite (-1) or strictly positive*/ ret=TRUE; } else ret=FALSE; break; } return ret; }
/*this function makes a special case for speex/8000. This codec is variable bitrate. The 8kbit/s mode is interesting when having a low upload bandwidth, but its quality is not very good. We 'd better use its 15kbt/s mode when we have enough bandwidth*/ static int get_codec_bitrate(LinphoneCore *lc, const PayloadType *pt){ int upload_bw=linphone_core_get_upload_bandwidth(lc); if (bandwidth_is_greater(upload_bw,129) || (bandwidth_is_greater(upload_bw,33) && !linphone_core_video_enabled(lc)) ) { if (strcmp(pt->mime_type,"speex")==0 && pt->clock_rate==8000){ return 15000; } } return pt->normal_bitrate; }
/* 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; }
/* return TRUE if codec can be used with bandwidth, FALSE else*/ bool_t linphone_core_check_payload_type_usability(const LinphoneCore *lc, PayloadType *pt) { double codec_band; double npacket; double packet_size; int bitrate; int min_audio_bw=get_min_bandwidth(lc->dw_audio_bw,lc->up_audio_bw); int min_video_bw=get_min_bandwidth(lc->dw_video_bw,lc->up_video_bw); bool_t ret=FALSE; switch (pt->type){ case PAYLOAD_AUDIO_CONTINUOUS: case PAYLOAD_AUDIO_PACKETIZED: if (strcmp(pt->mime_type,"speex")==0 && (pt->clock_rate==8000)){ /*speex can go down to 8kbit/s */ bitrate=8000; }else bitrate=pt->normal_bitrate; /* very approximative estimation... revisit*/ npacket=50; packet_size=(double)(bitrate/(50*8))+UDP_HDR_SZ+RTP_HDR_SZ+IP4_HDR_SZ; codec_band=packet_size*8.0*npacket; ret=bandwidth_is_greater(min_audio_bw*1000,codec_band); //ms_message("Payload %s: %g",pt->mime_type,codec_band); break; case PAYLOAD_VIDEO: if (min_video_bw!=0) {/* infinite (-1) or strictly positive*/ if (strcmp(pt->mime_type,"H263-1998")==0){ payload_type_set_recv_fmtp(pt,"CIF=1;QCIF=1"); } /*let the video use all the bandwidth minus the maximum bandwidth used by audio */ if (min_video_bw>0) pt->normal_bitrate=min_video_bw*1000; else pt->normal_bitrate=512000; ret=TRUE; } else ret=FALSE; break; } /*if (!ret) ms_warning("Payload %s is not usable with your internet connection.",pt->mime_type);*/ return ret; }