diff -ur org/linphone-1.1.0pre2/exosip/udp.c tmp/linphone-1.1.0pre2/exosip/udp.c --- org/linphone-1.1.0pre2/exosip/udp.c 2005-07-25 18:43:23.000000000 +0200 +++ tmp/linphone-1.1.0pre2/exosip/udp.c 2005-08-12 10:28:29.000000000 +0200 @@ -802,7 +802,7 @@ ADD_ELEMENT(eXosip.j_calls, jc); - i = _eXosip_build_response_default(&answer, NULL, 101, evt->sip); + i = _eXosip_build_response_default(&answer, NULL, 180, evt->sip); if (i!=0) { OSIP_TRACE (osip_trace @@ -1068,7 +1068,7 @@ eXosip_notify_init(&jn, evt->sip); _eXosip_notify_set_refresh_interval(jn, evt->sip); - i = _eXosip_build_response_default(&answer, NULL, 101, evt->sip); + i = _eXosip_build_response_default(&answer, NULL, 180, evt->sip); if (i!=0) { OSIP_TRACE (osip_trace diff -ur org/linphone-1.1.0pre2/mediastreamer/msfilter.h tmp/linphone-1.1.0pre2/mediastreamer/msfilter.h --- org/linphone-1.1.0pre2/mediastreamer/msfilter.h 2005-07-29 14:16:13.000000000 +0200 +++ tmp/linphone-1.1.0pre2/mediastreamer/msfilter.h 2005-08-16 16:31:09.000000000 +0200 @@ -53,6 +53,7 @@ gint min_fifo_size; /* set when linking*/ gint r_mingran; /* read minimum granularity (for fifos). It can be zero so that the filter can accept any size of reading data*/ + gint bytes_per_compressed_frame; /* for dynamic codec like iLBC */ MSFifo **infifos; /*pointer to a table of pointer to input fifos*/ MSFifo **outfifos; /*pointer to a table of pointer to output fifos*/ MSQueue **inqueues; /*pointer to a table of pointer to input queues*/ diff -ur org/linphone-1.1.0pre2/mediastreamer/msilbcenc.c tmp/linphone-1.1.0pre2/mediastreamer/msilbcenc.c --- org/linphone-1.1.0pre2/mediastreamer/msilbcenc.c 2005-07-29 15:40:54.000000000 +0200 +++ tmp/linphone-1.1.0pre2/mediastreamer/msilbcenc.c 2005-08-17 13:42:19.000000000 +0200 @@ -159,11 +159,11 @@ switch (r->ms_per_frame) { case 20: r->samples_per_frame = BLOCKL_20MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_20MS; + MS_FILTER(r)->bytes_per_compressed_frame = NO_OF_BYTES_20MS; break; case 30: r->samples_per_frame = BLOCKL_30MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_30MS; + MS_FILTER(r)->bytes_per_compressed_frame = NO_OF_BYTES_30MS; break; default: g_error("Bad bitrate value (%i) for ilbc encoder!", r->ms_per_frame); @@ -181,7 +181,7 @@ r->bitrate = 15200; r->ms_per_frame = 20; r->samples_per_frame = BLOCKL_20MS; - r->bytes_per_compressed_frame = NO_OF_BYTES_20MS; + MS_FILTER(r)->bytes_per_compressed_frame = NO_OF_BYTES_20MS; ms_filter_init(MS_FILTER(r)); MS_FILTER(r)->infifos=r->f_inputs; @@ -223,7 +223,7 @@ g_warning( "src=%p\n", src); return; } - m=ms_message_new(r->bytes_per_compressed_frame); + m=ms_message_new(MS_FILTER(r)->bytes_per_compressed_frame); ilbc_read_16bit_samples((gint16*)src, speech, r->samples_per_frame); iLBC_encode((unsigned char *)m->data, speech, &r->ilbc_enc); diff -ur org/linphone-1.1.0pre2/mediastreamer/msilbcenc.h tmp/linphone-1.1.0pre2/mediastreamer/msilbcenc.h --- org/linphone-1.1.0pre2/mediastreamer/msilbcenc.h 2005-07-29 15:41:05.000000000 +0200 +++ tmp/linphone-1.1.0pre2/mediastreamer/msilbcenc.h 2005-08-16 16:32:08.000000000 +0200 @@ -57,7 +57,6 @@ int bitrate; int ms_per_frame; int samples_per_frame; - int bytes_per_compressed_frame; } MSILBCEncoder; typedef struct _MSILBCEncoderClass diff -ur org/linphone-1.1.0pre2/mediastreamer/msossread.c tmp/linphone-1.1.0pre2/mediastreamer/msossread.c --- org/linphone-1.1.0pre2/mediastreamer/msossread.c 2005-03-04 17:39:31.000000000 +0100 +++ tmp/linphone-1.1.0pre2/mediastreamer/msossread.c 2005-08-18 11:03:21.000000000 +0200 @@ -104,7 +104,7 @@ g_return_if_fail(f->sndcard!=NULL); g_return_if_fail(f->gran>0); - if (snd_card_can_read(f->sndcard)){ + while(snd_card_can_read(f->sndcard)){ int got; ms_fifo_get_write_ptr(fifo,f->gran,(void**)&p); g_return_if_fail(p!=NULL); diff -ur org/linphone-1.1.0pre2/mediastreamer/msrtpsend.c tmp/linphone-1.1.0pre2/mediastreamer/msrtpsend.c --- org/linphone-1.1.0pre2/mediastreamer/msrtpsend.c 2005-07-14 16:45:45.000000000 +0200 +++ tmp/linphone-1.1.0pre2/mediastreamer/msrtpsend.c 2005-08-18 10:52:46.000000000 +0200 @@ -57,6 +57,8 @@ r->ts_inc=0; r->flags=0; r->delay=0; + r->frames_per_packet=2; + r->ptr = r->payload; } void ms_rtp_send_class_init(MSRtpSendClass *klass) @@ -112,7 +114,7 @@ guint skip; guint32 synctime=sync->time; - g_return_if_fail(gran>0); + g_return_if_fail(gran>0 && r->packet_sizertpsession==NULL) return; ms_filter_lock(MS_FILTER(r)); @@ -135,14 +139,34 @@ { MSMessage *msg; /* read a MSMessage and send it through the network*/ - while ( (msg=ms_queue_get(qi))!=NULL){ - ts=get_new_timestamp(r,synctime); - if (!skip) { - /*g_message("Sending packet with ts=%u",ts);*/ - rtp_session_send_with_ts(r->rtpsession,msg->data,msg->size,ts); - + if((msg=ms_queue_get(qi))!=NULL) + { + if(r->ptr+msg->sizepayload+MAX_RTP_PAYLOAD) + { + if(!skip) + { + memcpy(r->ptr,msg->data,msg->size); + r->ptr+=msg->size; + } + } + else + { + // something went wrong, reset + r->ptr = r->payload; } ms_message_destroy(msg); + if((r->ptr - r->payload) >= r->packet_size) + { + if((r->ptr - r->payload) == r->packet_size) + { + ts=get_new_timestamp(r,synctime); + //printf("Sending packet %d:%d\n",r->packet_size,ts); + rtp_session_send_with_ts(r->rtpsession,r->payload,r->packet_size,ts); + } + // else + // printf("Invalid framing: %d != %d\n",r->ptr-r->payload,r->packet_size); + r->ptr = r->payload; + } } } ms_filter_unlock(MS_FILTER(r)); @@ -167,6 +191,7 @@ MSFilter *codec; MSCodecInfo *info; r->sync=sync; + r->ptr = r->payload; codec=ms_filter_search_upstream_by_type(MS_FILTER(r),MS_FILTER_AUDIO_CODEC); if (codec==NULL) codec=ms_filter_search_upstream_by_type(MS_FILTER(r),MS_FILTER_VIDEO_CODEC); if (codec==NULL){ @@ -181,9 +206,9 @@ /* dont'use the normal frame size: this is a variable frame size codec */ /* use the MS_FILTER(codec)->r_mingran */ ts_inc=MS_FILTER(codec)->r_mingran/2; - psize=0; + psize=codec->bytes_per_compressed_frame; } - ms_rtp_send_set_timing(r,ts_inc,psize); + ms_rtp_send_set_timing(r,r->frames_per_packet*ts_inc,r->frames_per_packet*psize); } } diff -ur org/linphone-1.1.0pre2/mediastreamer/msrtpsend.h tmp/linphone-1.1.0pre2/mediastreamer/msrtpsend.h --- org/linphone-1.1.0pre2/mediastreamer/msrtpsend.h 2005-03-04 17:05:14.000000000 +0100 +++ tmp/linphone-1.1.0pre2/mediastreamer/msrtpsend.h 2005-08-18 10:22:03.000000000 +0200 @@ -36,6 +36,8 @@ #define MSRTPSEND_DEF_GRAN 4096/* the default granularity*/ +#define MAX_RTP_PAYLOAD 1400 + struct _MSRtpSend { /* the MSCopy derivates from MSFilter, so the MSFilter object MUST be the first of the MSCopy object @@ -50,6 +52,9 @@ gint packet_size; guint flags; guint delay; /* number of _proccess call which must be skipped */ + guint frames_per_packet; + gchar payload[MAX_RTP_PAYLOAD]; + gchar *ptr; #define RTPSEND_CONFIGURED (1) }; diff -ur org/linphone-1.1.0pre2/mediastreamer/mstimer.c tmp/linphone-1.1.0pre2/mediastreamer/mstimer.c --- org/linphone-1.1.0pre2/mediastreamer/mstimer.c 2005-03-03 13:14:26.000000000 +0100 +++ tmp/linphone-1.1.0pre2/mediastreamer/mstimer.c 2005-08-18 11:04:11.000000000 +0200 @@ -33,7 +33,6 @@ ms_sync_init(MS_SYNC(sync)); MS_SYNC(sync)->attached_filters=sync->filters; memset(sync->filters,0,MSTIMER_MAX_FILTERS*sizeof(MSFilter*)); - MS_SYNC(sync)->samples_per_tick=160; ms_timer_set_interval(sync,20); sync->state=MS_TIMER_STOPPED; } @@ -106,6 +105,7 @@ MS_SYNC(timer)->ticks=0; MS_SYNC(timer)->interval=milisec; + MS_SYNC(timer)->samples_per_tick=8*milisec; timer->interval.tv_sec=milisec/1000; timer->interval.tv_usec=(milisec % 1000)*1000; timer->milisec=milisec;