Commit a68852a1 authored by smorlat's avatar smorlat

- fix various bugs in bandwith management (again)



git-svn-id: svn+ssh://svn.savannah.nongnu.org/linphone/trunk@160 3f6dc0c8-ddfe-455d-9043-3cd528dc4637
parent d8a9c7d1
......@@ -595,8 +595,6 @@ SupportLevel linphone_payload_is_supported(LinphoneCore *lc, sdp_payload_t *payl
/*limit to upload bandwidth if exist, else no limit*/
rtppayload->normal_bitrate=(ubw>0)? 1000*ubw : -1;
}
/* but anyway give our download bandwidth constraint*/
payload->b_as_bandwidth=(dbw>0) ? dbw : 0;
if (payload->a_fmtp!=NULL){
payload_type_set_send_fmtp(rtppayload,payload->a_fmtp);
}
......@@ -657,7 +655,9 @@ int linphone_accept_audio_offer(sdp_context_t *ctx,sdp_payload_t *payload)
}
params->initialized=1;
/* we can now update the allocated bandwidth for audio, and then video*/
linphone_core_update_allocated_audio_bandwidth(lc,lpt);
linphone_core_update_allocated_audio_bandwidth_in_call(lc,lpt);
/* give our download bandwidth constraint*/
payload->b_as_bandwidth=(lc->dw_audio_bw>0) ? lc->dw_audio_bw : 0;
}else{
/* refuse all other audio lines*/
if(params->line!=payload->line) return -1;
......@@ -710,6 +710,7 @@ int linphone_accept_video_offer(sdp_context_t *ctx,sdp_payload_t *payload)
params->remotertcpport=params->remoteport+1;
}
params->initialized=1;
payload->b_as_bandwidth=(lc->dw_video_bw>0) ? lc->dw_video_bw : 0;
}else{
/* refuse all other video lines*/
if(params->line!=payload->line) return -1;
......@@ -752,7 +753,7 @@ int linphone_read_audio_answer(sdp_context_t *ctx,sdp_payload_t *payload)
}
params->initialized=1;
/* we can now update the allocated bandwidth for audio, and then video*/
linphone_core_update_allocated_audio_bandwidth(lc,lpt);
linphone_core_update_allocated_audio_bandwidth_in_call(lc,lpt);
}
}
return 0;
......
......@@ -153,6 +153,7 @@ void linphone_call_destroy(LinphoneCall *obj)
{
linphone_core_notify_all_friends(obj->core,obj->core->prev_mode);
linphone_call_log_completed(obj->log,obj);
linphone_core_update_allocated_audio_bandwidth(obj->core);
if (obj->profile!=NULL && obj->profile!=obj->core->local_profile) rtp_profile_destroy(obj->profile);
if (obj->sdpctx!=NULL) sdp_context_free(obj->sdpctx);
ms_free(obj);
......@@ -595,17 +596,8 @@ void linphone_core_set_download_bandwidth(LinphoneCore *lc, int bw){
lc->dw_audio_bw=-1;
lc->dw_video_bw=-1;
}else {
if (bw>=256){
lc->dw_audio_bw=80;
}else if (bw>=128){
if (linphone_core_video_enabled(lc))
lc->dw_audio_bw=30;
else
lc->dw_audio_bw=bw;
}else{
lc->dw_audio_bw=bw;
}
lc->dw_video_bw=bw-lc->dw_audio_bw;
lc->dw_audio_bw=MIN(lc->audio_bw,bw);
lc->dw_video_bw=MAX(bw-lc->dw_audio_bw-10,0);/*-10: security margin*/
}
}
......@@ -614,16 +606,10 @@ void linphone_core_set_upload_bandwidth(LinphoneCore *lc, int bw){
if (bw==0){ /*infinite*/
lc->up_audio_bw=-1;
lc->up_video_bw=-1;
return;
}else if (bw>=128){
if (linphone_core_video_enabled(lc))
lc->up_audio_bw=lc->audio_bw;
else
lc->up_audio_bw=bw;
}else{
lc->up_audio_bw=bw;
lc->up_audio_bw=MIN(lc->audio_bw,bw);
lc->up_video_bw=MAX(bw-lc->up_audio_bw-10,0);/*-10: security margin*/
}
lc->up_video_bw=bw-lc->up_audio_bw-10;/*-10: security margin*/
}
int linphone_core_get_download_bandwidth(const LinphoneCore *lc){
......@@ -2006,9 +1992,11 @@ const char *linphone_core_get_video_device(const LinphoneCore *lc){
}
static MSVideoSizeDef supported_resolutions[]={
{ MS_VIDEO_SIZE_SVGA , "svga" },
{ MS_VIDEO_SIZE_4CIF , "4cif" },
{ MS_VIDEO_SIZE_VGA , "vga" },
{ MS_VIDEO_SIZE_CIF , "cif" },
{ MS_VIDEO_SIZE_QVGA , "qvga" },
{ MS_VIDEO_SIZE_QCIF , "qcif" },
{ {0,0} , NULL }
};
......
......@@ -195,13 +195,14 @@ static double get_audio_payload_bandwidth(const PayloadType *pt){
return packet_size*8.0*npacket;
}
void linphone_core_update_allocated_audio_bandwidth(LinphoneCore *lc, const PayloadType *pt){
void linphone_core_update_allocated_audio_bandwidth_in_call(LinphoneCore *lc, const PayloadType *pt){
lc->audio_bw=(int)(get_audio_payload_bandwidth(pt)/1000.0);
/*update*/
linphone_core_set_download_bandwidth(lc,lc->net_conf.download_bw);
linphone_core_set_upload_bandwidth(lc,lc->net_conf.upload_bw);
}
static void update_allocated_audio_bandwidth(LinphoneCore *lc){
void linphone_core_update_allocated_audio_bandwidth(LinphoneCore *lc){
const MSList *elem;
PayloadType *max=NULL;
for(elem=linphone_core_get_audio_codecs(lc);elem!=NULL;elem=elem->next){
......@@ -214,7 +215,7 @@ static void update_allocated_audio_bandwidth(LinphoneCore *lc){
}
}
if (max) {
linphone_core_update_allocated_audio_bandwidth(lc,max);
linphone_core_update_allocated_audio_bandwidth_in_call(lc,max);
}
}
......@@ -230,7 +231,7 @@ bool_t linphone_core_check_payload_type_usability(LinphoneCore *lc, PayloadType
This must be done outside calls, because after sdp negociation
the audio bandwidth is refined to the selected codec
*/
if (!linphone_core_in_call(lc)) update_allocated_audio_bandwidth(lc);
if (!linphone_core_in_call(lc)) linphone_core_update_allocated_audio_bandwidth(lc);
min_audio_bw=get_min_bandwidth(linphone_core_get_download_bandwidth(lc),
linphone_core_get_upload_bandwidth(lc));
if (min_audio_bw==0) min_audio_bw=-1;
......@@ -249,7 +250,7 @@ bool_t linphone_core_check_payload_type_usability(LinphoneCore *lc, PayloadType
if (min_video_bw>0)
pt->normal_bitrate=min_video_bw*1000;
else
pt->normal_bitrate=512000;
pt->normal_bitrate=1500000; /*around 1.5 Mbit/s*/
ret=TRUE;
}
else ret=FALSE;
......@@ -389,6 +390,7 @@ void linphone_core_setup_local_rtp_profile(LinphoneCore *lc)
/* set the fixed lists instead:*/
lc->codecs_conf.audio_codecs=audiopt;
lc->codecs_conf.video_codecs=videopt;
linphone_core_update_allocated_audio_bandwidth(lc);
}
int from_2char_without_params(osip_from_t *from,char **str)
......
......@@ -118,7 +118,8 @@ MSList *find_friend(MSList *fl, const osip_from_t *friend, LinphoneFriend **lf);
LinphoneFriend *linphone_find_friend_by_nid(MSList *l, int nid);
LinphoneFriend *linphone_find_friend_by_sid(MSList *l, int sid);
void linphone_core_update_allocated_audio_bandwidth(LinphoneCore *lc, const PayloadType *pt);
void linphone_core_update_allocated_audio_bandwidth(LinphoneCore *lc);
void linphone_core_update_allocated_audio_bandwidth_in_call(LinphoneCore *lc, const PayloadType *pt);
void linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call);
#endif /* _PRIVATE_H */
......@@ -310,6 +310,7 @@ sdp_context_get_answer ( sdp_context_t *ctx,sdp_message_t *remote)
int i, j, ncodec, m_lines_accepted = 0;
int err;
sdp_payload_t payload;
sdp_payload_t init_payload;
sdp_handler_t *sdph=ctx->handler;
sdp_bandwidth_t *sbw=NULL;
char *relay;
......@@ -327,29 +328,28 @@ sdp_context_get_answer ( sdp_context_t *ctx,sdp_message_t *remote)
answer = sdp_context_generate_template (ctx);
/* for each m= line */
for (i = 0; !sdp_message_endof_media (remote, i); i++)
{
sdp_payload_init(&payload);
for (i = 0; !sdp_message_endof_media (remote, i); i++){
sdp_payload_init(&init_payload);
mtype = sdp_message_m_media_get (remote, i);
proto = sdp_message_m_proto_get (remote, i);
port = sdp_message_m_port_get (remote, i);
payload.remoteport = osip_atoi (port);
payload.proto = proto;
payload.line = i;
payload.c_addr = sdp_message_c_addr_get (remote, i, 0);
if (payload.c_addr == NULL)
payload.c_addr = sdp_message_c_addr_get (remote, -1, 0);
init_payload.remoteport = osip_atoi (port);
init_payload.proto = proto;
init_payload.line = i;
init_payload.c_addr = sdp_message_c_addr_get (remote, i, 0);
if (init_payload.c_addr == NULL)
init_payload.c_addr = sdp_message_c_addr_get (remote, -1, 0);
/*parse relay address if given*/
relay=sdp_message_a_attr_value_get(remote,i,"relay-addr");
if (relay){
payload.relay_host=parse_relay_addr(relay,&payload.relay_port);
init_payload.relay_host=parse_relay_addr(relay,&init_payload.relay_port);
}
payload.relay_session_id=sdp_message_a_attr_value_get(remote,i,"relay-session-id");
init_payload.relay_session_id=sdp_message_a_attr_value_get(remote,i,"relay-session-id");
/* get application specific bandwidth, if any */
for(j=0;(sbw=sdp_message_bandwidth_get(remote,i,j))!=NULL;j++){
if (strcasecmp(sbw->b_bwtype,"AS")==0) payload.b_as_bandwidth=atoi(sbw->b_bandwidth);
if (strcasecmp(sbw->b_bwtype,"AS")==0) init_payload.b_as_bandwidth=atoi(sbw->b_bandwidth);
}
payload.a_ptime=_sdp_message_get_a_ptime(remote,i);
init_payload.a_ptime=_sdp_message_get_a_ptime(remote,i);
if (keywordcmp ("audio", mtype) == 0)
{
if (sdph->accept_audio_codecs != NULL)
......@@ -361,6 +361,7 @@ sdp_context_get_answer ( sdp_context_t *ctx,sdp_message_t *remote)
sdp_message_m_payload_get (remote, i,
j)) != NULL); j++)
{
memcpy(&payload,&init_payload,sizeof(payload));
payload.pt = osip_atoi (pt);
/* get the rtpmap associated to this codec, if any */
payload.a_rtpmap =
......@@ -469,6 +470,7 @@ sdp_context_get_answer ( sdp_context_t *ctx,sdp_message_t *remote)
sdp_message_m_payload_get (remote, i,
j)) != NULL); j++)
{
memcpy(&payload,&init_payload,sizeof(payload));
payload.pt = osip_atoi (pt);
/* get the rtpmap associated to this codec, if any */
payload.a_rtpmap =
......
......@@ -45,15 +45,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define MS_VIDEO_SIZE_NS1_W 324
#define MS_VIDEO_SIZE_NS1_H 248
#define MS_VIDEO_SIZE_1024_W 1024
#define MS_VIDEO_SIZE_1024_H 768
#define MS_VIDEO_SIZE_SVGA_W 800
#define MS_VIDEO_SIZE_SVGA_H 600
#define MS_VIDEO_SIZE_800X600_W 800
#define MS_VIDEO_SIZE_800X600_H 600
#define MS_VIDEO_SIZE_XGA_W 1024
#define MS_VIDEO_SIZE_XGA_H 768
#define MS_VIDEO_SIZE_MAX_W MS_VIDEO_SIZE_1024_W
#define MS_VIDEO_SIZE_MAX_H MS_VIDEO_SIZE_1024_H
/* those structs are part of the ABI: don't change their size otherwise binary plugins will be broken*/
typedef struct MSVideoSize{
......@@ -76,10 +77,18 @@ typedef struct MSRect{
#define MS_VIDEO_SIZE_NS1 (MSVideoSize){MS_VIDEO_SIZE_NS1_W,MS_VIDEO_SIZE_NS1_H}
#define MS_VIDEO_SIZE_1024 (MSVideoSize){MS_VIDEO_SIZE_1024_W, MS_VIDEO_SIZE_1024_H}
#define MS_VIDEO_SIZE_XGA (MSVideoSize){MS_VIDEO_SIZE_XGA_W, MS_VIDEO_SIZE_XGA_H}
#define MS_VIDEO_SIZE_800X600 (MSVideoSize){MS_VIDEO_SIZE_800X600_W, MS_VIDEO_SIZE_800X600_H}
#define MS_VIDEO_SIZE_SVGA (MSVideoSize){MS_VIDEO_SIZE_SVGA_W, MS_VIDEO_SIZE_SVGA_H}
/*deprecated: use MS_VIDEO_SIZE_SVGA*/
#define MS_VIDEO_SIZE_800X600_W MS_VIDEO_SIZE_SVGA_W
#define MS_VIDEO_SIZE_800X600_H MS_VIDEO_SIZE_SVGA_H
#define MS_VIDEO_SIZE_800X600 MS_VIDEO_SIZE_SVGA
/*deprecated use MS_VIDEO_SIZE_XGA*/
#define MS_VIDEO_SIZE_1024_W 1024
#define MS_VIDEO_SIZE_1024_H 768
#define MS_VIDEO_SIZE_1024 MS_VIDEO_SIZE_XGA
typedef enum{
MS_YUV420P,
......
......@@ -251,6 +251,7 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
/* give the encoder/decoder some parameters*/
ms_filter_call_method(stream->encoder,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate);
ms_message("Payload's bitrate is %i",pt->normal_bitrate);
if (pt->normal_bitrate>0){
ms_message("Setting audio encoder network bitrate to %i",pt->normal_bitrate);
ms_filter_call_method(stream->encoder,MS_FILTER_SET_BITRATE,&pt->normal_bitrate);
......
......@@ -88,6 +88,7 @@ static bool_t v4lv2_try_format(V4l2State *s, int fmtid){
fmt.fmt.pix.field = V4L2_FIELD_ANY;
if (ioctl (s->fd, VIDIOC_S_FMT, &fmt)<0){
ms_message("VIDIOC_S_FMT: %s",strerror(errno));
return FALSE;
}
return TRUE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment