diff -r 4fcd26c88584 -r ae2cad2439a9 .hgsubstate --- a/.hgsubstate Fri Sep 03 14:11:06 2010 +0200 +++ b/.hgsubstate Tue Sep 07 12:06:15 2010 +0200 @@ -1,4 +1,4 @@ -569dd93a88d90cf5c9dfdb16a6e77b2221445109 csl +5b7be91febcadeec1fd2fa9c7052df51b56a2a16 csl 06e107af9a726a4679f8b7c2edba24320ba8e8ea libs/hlibpp f6418f65e4455af870608a9e63ccba6ca6e99e9d libs/miniini 895a8d04fc92fdb8efb30c1d7131ed9322047d44 mediastreamer2 diff -r 4fcd26c88584 -r ae2cad2439a9 oRTP/include/ortp/rtpsession.h --- a/oRTP/include/ortp/rtpsession.h Fri Sep 03 14:11:06 2010 +0200 +++ b/oRTP/include/ortp/rtpsession.h Tue Sep 07 12:06:15 2010 +0200 @@ -167,7 +167,14 @@ typedef struct _RtpSession RtpSession; typedef struct _RtpQosInfos { - int jitterGradient; + int curx; + struct { + uint32_t seqnum; + uint32_t interval_losses; + uint32_t remote_jitter; + uint32_t total_losses; + uint32_t interval_packets; + } data[2]; } RtpQosInfo; @@ -201,6 +208,8 @@ RtpSignalTable on_timestamp_jump; RtpSignalTable on_network_error; RtpSignalTable on_rtcp_bye; + RtpSignalTable on_qos_event; + struct _OList *signal_tables; struct _OList *eventqs; msgb_allocator_t allocator; @@ -224,6 +233,7 @@ bool_t permissive; /*use the permissive algorithm*/ bool_t use_connect; /* use connect() on the socket */ bool_t ssrc_set; + RtpQosInfo qos; }; diff -r 4fcd26c88584 -r ae2cad2439a9 oRTP/src/rtcpparse.c --- a/oRTP/src/rtcpparse.c Fri Sep 03 14:11:06 2010 +0200 +++ b/oRTP/src/rtcpparse.c Tue Sep 07 12:06:15 2010 +0200 @@ -287,54 +287,103 @@ } } +static int big_change(uint32_t v1, uint32_t v2, int big_thresold) +{ + int diff = v1 - v2; + uint32_t mean; + + mean = ((v1 + v2) / 2) ; + + if (diff < 0) + diff = -diff; + + diff = diff*100 / mean; + + return diff > big_thresold; + +} /*old functions: deprecated, but some useful code parts can be reused */ /* Start from now this source code file was written by Nicola Baldo as an extension of the oRTP library. Copyright (C) 2005 Nicola Baldo address@hidden/ void report_block_parse(RtpSession *session, report_block_t *rb, struct timeval rcv_time_tv) { - rb->ssrc = ntohl(rb->ssrc); + rb->ssrc = ntohl(rb->ssrc); - if ( rb->ssrc != session->snd.ssrc ) + if ( rb->ssrc != session->snd.ssrc ) - { - ortp_debug("Received rtcp report block related to unknown ssrc (not from us)... discarded"); - return; - } - - else - - { - uint32_t rcv_time_msw; - uint32_t rcv_time_lsw; - uint32_t rcv_time; - double rtt; - - rcv_time_msw = rcv_time_tv.tv_sec; -#if defined(_WIN32_WCE) - rcv_time_lsw = (uint32_t) ((double)rcv_time_tv.tv_usec*(double)(((uint64_t)1)<<32)*1.0e-6); -#else - rcv_time_lsw = (uint32_t) ((double)rcv_time_tv.tv_usec*(double)(1LL<<32)*1.0e-6); -#endif - rcv_time = (rcv_time_msw<<16) | (rcv_time_lsw >> 16); - -/* - rb->cum_num_packet_lost = ntoh24(rb->cum_num_packet_lost); - rb->ext_high_seq_num_rec = ntohl(rb->ext_high_seq_num_rec); - rb->interarrival_jitter = ntohl(rb->interarrival_jitter); - rb->lsr = ntohl(rb->lsr); - rb->delay_snc_last_sr = ntohl(rb->delay_snc_last_sr); -*/ - - /* calculating Round Trip Time*/ - if (rb->lsr != 0) { - rtt = (double) (rcv_time - rb->delay_snc_last_sr - rb->lsr); - rtt = rtt/65536; - //printf("RTT = %f s\n",rtt); + ortp_debug("Received rtcp report block related to unknown ssrc (not from us)... discarded"); + return; } - } + else + + { + uint32_t rcv_time_msw; + uint32_t rcv_time_lsw; + uint32_t rcv_time; + double rtt; + int newx,curx,generate_qos_event = 0; + + rcv_time_msw = rcv_time_tv.tv_sec; +#if defined(_WIN32_WCE) + rcv_time_lsw = (uint32_t) ((double)rcv_time_tv.tv_usec*(double)(((uint64_t)1)<<32)*1.0e-6); +#else + rcv_time_lsw = (uint32_t) ((double)rcv_time_tv.tv_usec*(double)(1LL<<32)*1.0e-6); +#endif + rcv_time = (rcv_time_msw<<16) | (rcv_time_lsw >> 16); + + + rb->fl_cnpl = ntohl(rb->fl_cnpl); + + rb->ext_high_seq_num_rec = ntohl(rb->ext_high_seq_num_rec); + rb->interarrival_jitter = ntohl(rb->interarrival_jitter); + rb->lsr = ntohl(rb->lsr); + rb->delay_snc_last_sr = ntohl(rb->delay_snc_last_sr); + + curx = session->qos.curx; + newx = (!session->qos.data[curx].seqnum) ? 0 : !curx; + session->qos.data[newx].seqnum = rb->ext_high_seq_num_rec; + session->qos.data[newx].total_losses = rb->fl_cnpl & 0x00FFFFFF; + session->qos.data[newx].remote_jitter = rb->interarrival_jitter; + if (newx != curx) { + session->qos.data[newx].interval_losses = + session->qos.data[newx].total_losses - session->qos.data[curx].total_losses; + + session->qos.data[newx].interval_packets = + session->qos.data[newx].seqnum - session->qos.data[curx].seqnum; + + + if (big_change(session->qos.data[newx].interval_losses, session->qos.data[curx].interval_losses, 10 )) + generate_qos_event++; + + if (big_change(session->qos.data[newx].remote_jitter, session->qos.data[curx].remote_jitter, 10 )) + generate_qos_event++; + + if (big_change(session->qos.data[newx].interval_packets, session->qos.data[curx].interval_packets, 10)) + generate_qos_event++; + + + + } + + + + /* calculating Round Trip Time*/ + if (rb->lsr != 0) + { + rtt = (double) (rcv_time - rb->delay_snc_last_sr - rb->lsr); + rtt = rtt/65536; + //printf("RTT = %f s\n",rtt); + } + + if (generate_qos_event) + rtp_signal_table_emit(&session->on_qos_event); + + session->qos.curx = newx; + + } } diff -r 4fcd26c88584 -r ae2cad2439a9 oRTP/src/rtpsession.c --- a/oRTP/src/rtpsession.c Fri Sep 03 14:11:06 2010 +0200 +++ b/oRTP/src/rtpsession.c Tue Sep 07 12:06:15 2010 +0200 @@ -263,6 +263,8 @@ rtp_signal_table_init (&session->on_timestamp_jump,session,"timestamp_jump"); rtp_signal_table_init (&session->on_network_error,session,"network_error"); rtp_signal_table_init (&session->on_rtcp_bye,session,"rtcp_bye"); + rtp_signal_table_init (&session->on_qos_event,session,"qos_event"); + wait_point_init(&session->snd.wp); wait_point_init(&session->rcv.wp); /*defaults send payload type to 0 (pcmu)*/ @@ -283,6 +285,7 @@ session->symmetric_rtp = FALSE; session->permissive=FALSE; msgb_allocator_init(&session->allocator); + rtp_qos_reset(&session->qos); } @@ -1355,6 +1358,7 @@ rtp_session_set_flag(session, RTP_SESSION_RECV_SYNC); rtp_session_unset_flag(session,RTP_SESSION_FIRST_PACKET_DELIVERED); jitter_control_init(&session->rtp.jittctl,-1,NULL); + rtp_qos_reset(&session->qos); } /** diff -r 4fcd26c88584 -r ae2cad2439a9 oRTP/src/rtpsession_priv.h --- a/oRTP/src/rtpsession_priv.h Fri Sep 03 14:11:06 2010 +0200 +++ b/oRTP/src/rtpsession_priv.h Tue Sep 07 12:06:15 2010 +0200 @@ -51,4 +51,6 @@ void rtp_session_dispatch_event(RtpSession *session, OrtpEvent *ev); +#define rtp_qos_reset(qos) { memset((qos), 0, sizeof(*(qos))); } + #endif diff -r 4fcd26c88584 -r ae2cad2439a9 phapi/phapi.c --- a/phapi/phapi.c Fri Sep 03 14:11:06 2010 +0200 +++ b/phapi/phapi.c Tue Sep 07 12:06:15 2010 +0200 @@ -2542,15 +2542,17 @@ DBG_SIP_NEGO("phCloseCall %d\n", cid); + if (cid < 0) + return -PH_BADCID; + eXosip_lock(); ca = ph_locate_call_by_cid(cid); if (!ca) { eXosip_unlock(); - return -PH_BADCID; - } - + + } clear(info); info.event = phCALLCLOSED; @@ -2570,7 +2572,6 @@ { osip_list_t *headers; i = phapi_csl_set_rtp_stats(ca, &headers); - i = eXosip_call_terminate2(cid, did, headers); osip_free(headers); @@ -2582,13 +2583,10 @@ #endif - ph_release_call(ca); eXosip_unlock(); - - if (i) return i; @@ -2597,13 +2595,11 @@ info.errorCode = 0; phcb->callProgress(cid, &info); - return i; } - PHAPI_EXPORT int phCallStartMedia(int cid, int streamFlags) { phcall_t *ca = ph_locate_call_by_cid(cid); @@ -5032,6 +5028,7 @@ i = acsl_rtpremoteconnectiondata(ca->csl_rtp_con_num, cert, strlen(cert), ISL_DATATYPE_FIRST_ELEMENT); if (i < 0) { + acsl_rtpclose(ca->csl_rtp_con_num); ph_answer_request(je->cid, je->tid, 421, vl->contact); return ; } @@ -5210,7 +5207,7 @@ { osip_message_t *ack; eXosip_call_build_ack(ca->did, &ack); - eXosip_call_send_ack(ca->did, ack); + // eXosip_call_send_ack(ca->did, ack); } } @@ -5510,6 +5507,10 @@ if (s == 407) return; +#ifdef HAVE_CSL + acsl_rtpclose(ca->csl_rtp_con_num); +#endif /*!HAVE_CSL*/ + ph_release_call(ca); info.localUri = from = ph_req_get_from(je->response); @@ -5525,6 +5526,7 @@ info.errorCode = s; } + phcb->callProgress(je->cid, &info); if (rca) { @@ -5709,6 +5711,7 @@ if (osip_message_header_get_byname(je->request, "X-CSL-Info2", 0, &csl_header) < 0) { + acsl_rtpclose(ca->csl_rtp_con_num); ph_answer_request(je->cid, je->tid, 421, 0); return; } @@ -5717,6 +5720,7 @@ i = acsl_rtpremoteconnectiondata(ca->csl_rtp_con_num, cert, strlen(cert), ISL_DATATYPE_SECOND_ELEMENT); if (i < 0) { + acsl_rtpclose(ca->csl_rtp_con_num); ph_answer_request(je->cid, je->tid, 421, 0); return; } diff -r 4fcd26c88584 -r ae2cad2439a9 phapi/phapi_csl.c --- a/phapi/phapi_csl.c Fri Sep 03 14:11:06 2010 +0200 +++ b/phapi/phapi_csl.c Tue Sep 07 12:06:15 2010 +0200 @@ -164,11 +164,12 @@ memset(&info, 0, sizeof(info)); info.event = phINCALLREADY; - phcb->callProgress(ca->cid, &info); - if (ca->state == PH_CALLEE_ACCEPTED) + if (ca->state == PH_CALLEE_RECEIVED) + phcb->callProgress(ca->cid, &info); + /* if (ca->state == PH_CALLEE_ACCEPTED) { phAcceptCall4(ca->cid, NULL, ca->user_mflags, ca->csl_localip_str, ca->csl_localip_str); - } + }*/ } } diff -r 4fcd26c88584 -r ae2cad2439a9 phapi/phms_audiostream.c --- a/phapi/phms_audiostream.c Fri Sep 03 14:11:06 2010 +0200 +++ b/phapi/phms_audiostream.c Tue Sep 07 12:06:15 2010 +0200 @@ -1066,6 +1066,7 @@ int device_num; const MSList *card_list = ms_snd_card_manager_get_list(ms_snd_card_manager_get()); int pos = 0; + int i = 0; device_num = ms_list_size(card_list); if (device_num == 0) @@ -1075,14 +1076,15 @@ { if (((MSSndCard *)(card_list->data))->capabilities & MS_SND_CARD_CAP_PLAYBACK) { - ((*device_tab)[pos]).idx = pos; - ((*device_tab)[pos]).id = osip_strdup(((MSSndCard *)(card_list->data))->id); - ((*device_tab)[pos]).name = osip_strdup(((MSSndCard *)(card_list->data))->name); - ((*device_tab)[pos]).capabilities = ((MSSndCard *)(card_list->data))->capabilities; + ((*device_tab)[i]).idx = pos; + ((*device_tab)[i]).id = osip_strdup(((MSSndCard *)(card_list->data))->id); + ((*device_tab)[i]).name = osip_strdup(((MSSndCard *)(card_list->data))->name); + ((*device_tab)[i]).capabilities = ((MSSndCard *)(card_list->data))->capabilities; + i++; } } - return pos; + return i; } int phms_audio_get_capture_sndcard_list(ph_audio_card_desc_t** device_tab) @@ -1090,6 +1092,7 @@ int device_num; const MSList *card_list = ms_snd_card_manager_get_list(ms_snd_card_manager_get()); int pos = 0; + int i = 0; device_num = ms_list_size(card_list); if (device_num == 0) @@ -1099,13 +1102,14 @@ { if (((MSSndCard *)(card_list->data))->capabilities & MS_SND_CARD_CAP_CAPTURE) { - ((*device_tab)[pos]).idx = pos; - ((*device_tab)[pos]).id = osip_strdup(((MSSndCard *)(card_list->data))->id); - ((*device_tab)[pos]).name = osip_strdup(((MSSndCard *)(card_list->data))->name); - ((*device_tab)[pos]).capabilities = ((MSSndCard *)(card_list->data))->capabilities; + ((*device_tab)[i]).idx = pos; + ((*device_tab)[i]).id = osip_strdup(((MSSndCard *)(card_list->data))->id); + ((*device_tab)[i]).name = osip_strdup(((MSSndCard *)(card_list->data))->name); + ((*device_tab)[i]).capabilities = ((MSSndCard *)(card_list->data))->capabilities; + i++; } } - return pos; + return i; } diff -r 4fcd26c88584 -r ae2cad2439a9 phcpp/phapipp.cpp --- a/phcpp/phapipp.cpp Fri Sep 03 14:11:06 2010 +0200 +++ b/phcpp/phapipp.cpp Tue Sep 07 12:06:15 2010 +0200 @@ -232,7 +232,7 @@ for (i = 0; i < pos; i++) { device_map->insert(std::pair(device_tab[i].idx, device_tab[i].id)); - //printf("MSSndCard idx:%d id:%s name:%s !!!!\n", device_tab[i].idx, device_tab[i].id, device_tab[i].name); + printf("MSSndCard idx:%d id:%s name:%s !!!!\n", device_tab[i].idx, device_tab[i].id, device_tab[i].name); } return *device_map; } diff -r 4fcd26c88584 -r ae2cad2439a9 phcpp/testphcpp.cpp --- a/phcpp/testphcpp.cpp Fri Sep 03 14:11:06 2010 +0200 +++ b/phcpp/testphcpp.cpp Tue Sep 07 12:06:15 2010 +0200 @@ -131,11 +131,12 @@ { printf("INCALL ACCEPT\n"); ringingCall(cid); - acceptCall(cid, 0, PH_STREAM_AUDIO); cid2 = cid; } break; + case phINCALLREADY: + acceptCall(cid, 0, PH_STREAM_AUDIO); case phCALLCLOSED: printf("CALLCLOSED cid=%d status=%d\n", cid, info->errorCode); @@ -429,6 +430,9 @@ if (role != NULL && !strcmp(role, "caller")) { cid1 = api.placeCall(vl1, callee, 0, 0, PH_STREAM_AUDIO); + sleep(5); + // pause(); + cid1 = api.placeCall(vl1, callee, 0, 0, PH_STREAM_AUDIO); sleep(150); api.closeCall(cid1); sleep(200);