[Pkg-voip-commits] r4701 - in /linphone/trunk/debian: changelog control patches/fix_segfault.dpatch
kilian at alioth.debian.org
kilian at alioth.debian.org
Sun Oct 7 00:01:01 UTC 2007
Author: kilian
Date: Sun Oct 7 00:01:01 2007
New Revision: 4701
URL: http://svn.debian.org/wsvn/pkg-voip/?sc=1&rev=4701
Log:
* Backport segfault fix from CVS. (Closes: #445462)
* High urgency due to fixing RC bug.
* Add myself to Uploaders to get rid of NMU nag.
* Fix "Long descriptions contains short description."
Modified:
linphone/trunk/debian/changelog
linphone/trunk/debian/control
linphone/trunk/debian/patches/fix_segfault.dpatch
Modified: linphone/trunk/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-voip/linphone/trunk/debian/changelog?rev=4701&op=diff
==============================================================================
--- linphone/trunk/debian/changelog (original)
+++ linphone/trunk/debian/changelog Sun Oct 7 00:01:01 2007
@@ -1,9 +1,12 @@
-linphone (1.99.0-3) UNRELEASED; urgency=low
-
+linphone (1.99.0-3) UNRELEASED; urgency=high
+
+ * Backport segfault fix from CVS. (Closes: #445462)
+ * High urgency due to fixing RC bug.
* Fix wrong menu section (Closes: #444898)
- * Backport segfault fix from CVS. (Closes: #445462)
-
- -- Kilian Krause <kilian at debian.org> Sun, 07 Oct 2007 01:46:24 +0200
+ * Add myself to Uploaders to get rid of NMU nag.
+ * Fix "Long descriptions contains short description."
+
+ -- Kilian Krause <kilian at debian.org> Sun, 07 Oct 2007 00:00:52 +0000
linphone (1.99.0-2) unstable; urgency=low
Modified: linphone/trunk/debian/control
URL: http://svn.debian.org/wsvn/pkg-voip/linphone/trunk/debian/control?rev=4701&op=diff
==============================================================================
--- linphone/trunk/debian/control (original)
+++ linphone/trunk/debian/control Sun Oct 7 00:01:01 2007
@@ -2,7 +2,7 @@
Section: sound
Priority: optional
Maintainer: Debian VoIP Team <pkg-voip-maintainers at lists.alioth.debian.org>
-Uploaders: Samuel Mimram <smimram at debian.org>
+Uploaders: Samuel Mimram <smimram at debian.org>, Kilian Krause <kilian at debian.org>
Build-Depends: debhelper (>= 4.0.0), dpkg-dev (>= 1.13.19), autoconf, automake1.9, autotools-dev, libtool, pkg-config, libglib2.0-dev, libosip2-dev (>= 3.0.3-2-1), libexosip2-dev (>= 3.0.3-2-1), libasound2-dev, libjack0.100.0-dev, libspeex-dev (>= 1.1.12), libsamplerate0-dev, libxml-parser-perl, gtk-doc-tools, docbook-utils, libgnomeui-dev, libgnome2-dev, gnome-applets, libpanel-applet2-dev, dpatch, libavcodec-dev, libvorbis-dev, libreadline5-dev, libsdl1.2-dev, libartsc0-dev
Standards-Version: 3.7.2
Homepage: http://www.linphone.org/
@@ -13,7 +13,7 @@
Architecture: any
Depends: ${shlibs:Depends}, linphone-nox (=${binary:Version})
Suggests: yelp
-Description: web phone
+Description: SIP softphone - graphical client
Linphone is a web phone: it lets you phone to your friends anywhere in the
whole world, freely, simply by using the internet. It is compatible with the
well known SIP protocol.
@@ -26,7 +26,7 @@
Package: linphone-nox
Architecture: any
Depends: ${shlibs:Depends}, linphone-common (=${source:Version})
-Description: web phone
+Description: SIP softphone - console-only client
Linphone is a web phone: it lets you phone to your friends anywhere in the
whole world, freely, simply by using the internet. It is compatible with the
well known SIP protocol.
@@ -41,7 +41,7 @@
Package: linphone-common
Architecture: all
Replaces: linphone-nox (<= 0.12.2-2)
-Description: web phone
+Description: Shared components of the linphone SIP softphone
Linphone is a web phone: it lets you phone to your friends anywhere in the
whole world, freely, simply by using the internet. It is compatible with the
well known SIP protocol.
@@ -57,7 +57,7 @@
Section: libs
Architecture: any
Depends: ${shlibs:Depends}
-Description: linphone web phone's library (supporting the SIP protocol)
+Description: linphone's shared library part (supporting the SIP protocol)
Linphone is a web phone: it lets you phone to your friends anywhere in the
whole world, freely, simply by using the internet. It is compatible with the
well known SIP protocol.
Modified: linphone/trunk/debian/patches/fix_segfault.dpatch
URL: http://svn.debian.org/wsvn/pkg-voip/linphone/trunk/debian/patches/fix_segfault.dpatch?rev=4701&op=diff
==============================================================================
--- linphone/trunk/debian/patches/fix_segfault.dpatch (original)
+++ linphone/trunk/debian/patches/fix_segfault.dpatch Sun Oct 7 00:01:01 2007
@@ -5,1059 +5,6 @@
## DP: No description.
@DPATCH@
-diff -urNad linphone-1.99.0~/ChangeLog linphone-1.99.0/ChangeLog
---- linphone-1.99.0~/ChangeLog 2007-08-04 22:13:18.000000000 +0200
-+++ linphone-1.99.0/ChangeLog 2007-10-07 01:42:50.000000000 +0200
-@@ -1,3 +1,15 @@
-+2007-09-26 Francois-Xavier Kowalski <fix at hp.com>
-+
-+ * m4/exosip.m4: 1.3
-+ make Linphone buildable with the eXosip/osip version that ships
-+ with Fedora.
-+
-+ * oRTP/include/ortp/stun_udp.h: 1.9
-+ * mediastreamer2/include/mediastreamer2/msvideo.h: 1.7
-+ * mediastreamer2/include/mediastreamer2/msticker.h: 1.6
-+ * mediastreamer2/include/mediastreamer2/msqueue.h: 1.3
-+ Clean ANSI/C vs. ANSI/C++ differences
-+
- 2007-08-01 Sandro Santilli <strk at keybit.net>
-
- * console/commands.c: Clean up commands 'nat', 'stun'
-diff -urNad linphone-1.99.0~/console/linphonec.c linphone-1.99.0/console/linphonec.c
---- linphone-1.99.0~/console/linphonec.c 2007-02-13 22:31:01.000000000 +0100
-+++ linphone-1.99.0/console/linphonec.c 2007-10-07 01:42:50.000000000 +0200
-@@ -1,6 +1,6 @@
- /****************************************************************************
- *
-- * $Id: linphonec.c,v 1.53 2007/02/13 21:31:01 smorlat Exp $
-+ * $Id: linphonec.c,v 1.56 2007/09/26 14:07:27 fixkowalski Exp $
- *
- * Copyright (C) 2006 Sandro Santilli <strk at keybit.net>
- * Copyright (C) 2002 Florian Winterstein <flox at gmx.net>
-@@ -93,6 +93,8 @@
- static void linphonec_text_received(LinphoneCore *lc, LinphoneChatRoom *cr,
- const char *from, const char *msg);
- static void linphonec_display_status (LinphoneCore * lc, const char *something);
-+static void linphonec_general_state (LinphoneCore * lc, LinphoneGeneralState *gstate);
-+static void print_prompt(LinphoneCore *opm);
-
- /***************************************************************************
- *
-@@ -108,6 +110,7 @@
- static bool_t auto_answer=FALSE;
- static bool_t answer_call=FALSE;
- static bool_t video_enabled=FALSE;
-+static bool_t show_general_state=FALSE;
- LPC_AUTH_STACK auth_stack;
- static int trace_level = 0;
- static char *logfile_name = NULL;
-@@ -130,9 +133,9 @@
- #endif
- display_warning:linphonec_display_warning,
- display_url:linphonec_display_url,
-- display_question:stub,
-+ display_question:(DisplayQuestionCb)stub,
- text_received:linphonec_text_received,
-- general_state:NULL
-+ general_state:linphonec_general_state
- };
-
- /***************************************************************************
-@@ -147,7 +150,8 @@
- static void
- linphonec_display_something (LinphoneCore * lc, const char *something)
- {
-- fprintf (stdout, "%s\n", something);
-+ fprintf (stdout, "%s\n%s", something,prompt);
-+ fflush(stdout);
- }
-
- /*
-@@ -156,7 +160,8 @@
- static void
- linphonec_display_status (LinphoneCore * lc, const char *something)
- {
-- fprintf (stdout, "%s\n", something);
-+ fprintf (stdout, "%s\n%s", something,prompt);
-+ fflush(stdout);
- }
-
- /*
-@@ -165,7 +170,8 @@
- static void
- linphonec_display_warning (LinphoneCore * lc, const char *something)
- {
-- fprintf (stdout, "Warning: %s\n", something);
-+ fprintf (stdout, "Warning: %s\n%s", something,prompt);
-+ fflush(stdout);
- }
-
- /*
-@@ -260,7 +266,60 @@
- }
-
-
--
-+static void
-+linphonec_general_state (LinphoneCore * lc, LinphoneGeneralState *gstate)
-+{
-+ if (show_general_state) {
-+ switch(gstate->new_state) {
-+ case GSTATE_POWER_OFF:
-+ printf("GSTATE_POWER_OFF");
-+ break;
-+ case GSTATE_POWER_STARTUP:
-+ printf("GSTATE_POWER_STARTUP");
-+ break;
-+ case GSTATE_POWER_ON:
-+ printf("GSTATE_POWER_ON");
-+ break;
-+ case GSTATE_POWER_SHUTDOWN:
-+ printf("GSTATE_POWER_SHUTDOWN");
-+ break;
-+ case GSTATE_REG_NONE:
-+ printf("GSTATE_REG_NONE");
-+ break;
-+ case GSTATE_REG_OK:
-+ printf("GSTATE_REG_OK");
-+ break;
-+ case GSTATE_REG_FAILED:
-+ printf("GSTATE_REG_FAILED");
-+ break;
-+ case GSTATE_CALL_IDLE:
-+ printf("GSTATE_CALL_IDLE");
-+ break;
-+ case GSTATE_CALL_OUT_INVITE:
-+ printf("GSTATE_CALL_OUT_INVITE");
-+ break;
-+ case GSTATE_CALL_OUT_CONNECTED:
-+ printf("GSTATE_CALL_OUT_CONNECTED");
-+ break;
-+ case GSTATE_CALL_IN_INVITE:
-+ printf("GSTATE_CALL_IN_INVITE");
-+ break;
-+ case GSTATE_CALL_IN_CONNECTED:
-+ printf("GSTATE_CALL_IN_CONNECTED");
-+ break;
-+ case GSTATE_CALL_END:
-+ printf("GSTATE_CALL_END");
-+ break;
-+ case GSTATE_CALL_ERROR:
-+ printf("GSTATE_CALL_ERROR");
-+ break;
-+ default:
-+ printf("GSTATE_UNKNOWN_%d",gstate->new_state);
-+ }
-+ if (gstate->message) printf(" %s", gstate->message);
-+ printf("\n");
-+ }
-+}
-
-
- /***************************************************************************/
-@@ -496,6 +555,7 @@
- -s sipaddress specify the sip call to do at startup\n\
- -a enable auto answering for incoming calls\n\
- -V enable video (disabled by default)\n\
-+ -S show general state messages (disabled by default)\n\
- -v or --version display version and exits.\n");
-
- exit(exit_status);
-@@ -579,7 +639,7 @@
- rl_attempted_completion_function = linephonec_readline_completion;
-
- /* printf("Readline initialized.\n"); */
--
-+ setlinebuf(stdout);
- return 0;
- }
-
-@@ -601,6 +661,15 @@
- return 0;
- }
-
-+static void print_prompt(LinphoneCore *opm){
-+#ifdef IDENTITY_AS_PROMPT
-+ snprintf(prompt, PROMPT_MAX_LEN, "%s> ",
-+ linphone_core_get_primary_contact(opm));
-+#else
-+ snprintf(prompt, PROMPT_MAX_LEN, "linphonec> ");
-+#endif
-+}
-+
- static int
- linphonec_main_loop (LinphoneCore * opm, char * sipAddr)
- {
-@@ -608,13 +677,8 @@
- bool_t run=TRUE;
- char *input;
-
-+ print_prompt(opm);
-
--#ifdef IDENTITY_AS_PROMPT
-- snprintf(prompt, PROMPT_MAX_LEN, "%s> ",
-- linphone_core_get_primary_contact(opm));
--#else
-- snprintf(prompt, PROMPT_MAX_LEN, "linphonec> ");
--#endif
-
- /* auto call handling */
- if (sipAddr != NULL )
-@@ -730,6 +794,10 @@
- printf ("version: " LINPHONE_VERSION "\n");
- exit (EXIT_SUCCESS);
- }
-+ else if (strncmp ("-S", argv[arg_num], 2) == 0)
-+ {
-+ show_general_state = TRUE;
-+ }
- else if (old_arg_num == arg_num)
- {
- fprintf (stderr, "ERROR: bad arguments\n");
-@@ -929,6 +997,17 @@
- /****************************************************************************
- *
- * $Log: linphonec.c,v $
-+ * Revision 1.56 2007/09/26 14:07:27 fixkowalski
-+ * - ANSI/C++ compilation issues with non-GCC compilers
-+ * - Faster epm-based packaging
-+ * - Ability to build & run on FC6's eXosip/osip
-+ *
-+ * Revision 1.55 2007/09/24 16:01:58 smorlat
-+ * fix bugs.
-+ *
-+ * Revision 1.54 2007/08/22 14:06:11 smorlat
-+ * authentication bugs fixed.
-+ *
- * Revision 1.53 2007/02/13 21:31:01 smorlat
- * added patch for general state.
- * new doxygen for oRTP
-diff -urNad linphone-1.99.0~/coreapi/authentication.c linphone-1.99.0/coreapi/authentication.c
---- linphone-1.99.0~/coreapi/authentication.c 2007-05-08 15:04:24.000000000 +0200
-+++ linphone-1.99.0/coreapi/authentication.c 2007-10-07 01:42:50.000000000 +0200
-@@ -41,6 +41,8 @@
- if (passwd!=NULL && (strlen(passwd)>0)) obj->passwd=ms_strdup(passwd);
- if (ha1!=NULL && (strlen(ha1)>0)) obj->ha1=ms_strdup(ha1);
- if (realm!=NULL && (strlen(realm)>0)) obj->realm=ms_strdup(realm);
-+ obj->works=FALSE;
-+ obj->first_time=TRUE;
- return obj;
- }
-
-@@ -190,41 +192,47 @@
- }
-
- void linphone_authentication_ok(LinphoneCore *lc, eXosip_event_t *ev){
-- AuthState *as=&lc->authstate;
-- if (as->tid==ev->tid){
-- as->tid=0;
-- if (as->username!=NULL)
-- ms_free(as->username);
-- as->username=NULL;
-- if (as->realm!=NULL)
-- ms_free(as->realm);
-- as->realm=NULL;
-- }
--}
-+ char *prx_realm=NULL,*www_realm=NULL;
-+ osip_proxy_authorization_t *prx_auth;
-+ osip_authorization_t *www_auth;
-+ osip_message_t *msg=ev->request;
-+ char *username;
-+ LinphoneAuthInfo *as=NULL;
-
--static bool_t last_auth_failed(AuthState *as, const char *username, const char *realm, int tid){
-- bool_t ret=FALSE;
-- if (as->username!=NULL && strcmp(as->username,username)==0
-- && as->realm!=NULL && strcmp(as->realm,realm)==0
-- && tid!=as->tid){
-- ret=TRUE;
-+ username=osip_uri_get_username(msg->from->url);
-+ osip_message_get_proxy_authorization(msg,0,&prx_auth);
-+ osip_message_get_authorization(msg,0,&www_auth);
-+ if (prx_auth!=NULL)
-+ prx_realm=osip_proxy_authorization_get_realm(prx_auth);
-+ if (www_auth!=NULL)
-+ www_realm=osip_authorization_get_realm(www_auth);
-+
-+ if (prx_realm==NULL && www_realm==NULL){
-+ ms_message("No authentication info in the request, ignoring");
-+ return;
-+ }
-+ /* see if we already have this auth information , not to ask it everytime to the user */
-+ if (prx_realm!=NULL)
-+ as=linphone_core_auth_info_find(lc,prx_realm,username);
-+ if (www_realm!=NULL)
-+ as=linphone_core_auth_info_find(lc,www_realm,username);
-+ if (as){
-+ ms_message("Authentication for user=%s realm=%s is working.",username,prx_realm ? prx_realm : www_realm);
-+ as->works=TRUE;
- }
-- if (as->username!=NULL)
-- ms_free(as->username);
-- as->username=ms_strdup(username);
-- if (as->realm!=NULL)
-- ms_free(as->realm);
-- as->realm=ms_strdup(realm);
-- return ret;
- }
-
-+
- void linphone_core_find_or_ask_for_auth_info(LinphoneCore *lc,const char *username,const char* realm, int tid)
- {
-- if (linphone_core_auth_info_find(lc,realm,username)==NULL ||
-- last_auth_failed(&lc->authstate,username,realm,tid)){
-+ LinphoneAuthInfo *as;
-+ if ((as=linphone_core_auth_info_find(lc,realm,username))==NULL ||
-+ (as->works==FALSE && as->first_time==FALSE) ) {
- if (lc->vtable.auth_info_requested!=NULL) {
- lc->vtable.auth_info_requested(lc,realm,username);
- lc->automatic_action++;/*suspends eXosip_automatic_action until the user supplies a password */
-+ }else{
-+ if (as) as->first_time=FALSE;
- }
- }
- }
-diff -urNad linphone-1.99.0~/coreapi/chat.c linphone-1.99.0/coreapi/chat.c
---- linphone-1.99.0~/coreapi/chat.c 2007-05-07 18:23:19.000000000 +0200
-+++ linphone-1.99.0/coreapi/chat.c 2007-10-07 01:42:50.000000000 +0200
-@@ -26,34 +26,35 @@
- #include "private.h"
- #include <eXosip2/eXosip.h>
-
-- LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to)
-- {
-- char *real_url=NULL;
-- osip_from_t *parsed_url=NULL;
-- if (linphone_core_interpret_url(lc,to,&real_url,&parsed_url)){
-- LinphoneChatRoom *cr=ms_new0(LinphoneChatRoom,1);
-- cr->lc=lc;
-- cr->peer=real_url;
-+ LinphoneChatRoom * linphone_core_create_chat_room(LinphoneCore *lc, const char *to){
-+ char *real_url=NULL;
-+ osip_from_t *parsed_url=NULL;
-+ char *route;
-+ if (linphone_core_interpret_url(lc,to,&real_url,&parsed_url,&route)){
-+ LinphoneChatRoom *cr=ms_new0(LinphoneChatRoom,1);
-+ cr->lc=lc;
-+ cr->peer=real_url;
- cr->peer_url=parsed_url;
-- lc->chatrooms=ms_list_append(lc->chatrooms,(void *)cr);
-- return cr;
-- }
-- return NULL;
-+ cr->route=route;
-+ lc->chatrooms=ms_list_append(lc->chatrooms,(void *)cr);
-+ return cr;
-+ }
-+ return NULL;
- }
-
-
- void linphone_chat_room_destroy(LinphoneChatRoom *cr){
-- LinphoneCore *lc=cr->lc;
-- lc->chatrooms=ms_list_remove(lc->chatrooms,(void *) cr);
-- osip_from_free(cr->peer_url);
-- ms_free(cr->peer);
-+ LinphoneCore *lc=cr->lc;
-+ lc->chatrooms=ms_list_remove(lc->chatrooms,(void *) cr);
-+ osip_from_free(cr->peer_url);
-+ ms_free(cr->peer);
-+ ms_free(cr->route);
- }
-
- void linphone_chat_room_send_message(LinphoneChatRoom *cr, const char *msg){
- const char *identity=linphone_core_get_identity(cr->lc);
- osip_message_t *sip=NULL;
-- eXosip_message_build_request(&sip,"MESSAGE",cr->peer,identity,
-- linphone_core_get_route(cr->lc));
-+ eXosip_message_build_request(&sip,"MESSAGE",cr->peer,identity,cr->route);
- osip_message_set_content_type(sip,"text/plain");
- osip_message_set_body(sip,msg,strlen(msg));
- eXosip_message_send_request(sip);
-diff -urNad linphone-1.99.0~/coreapi/exevents.c linphone-1.99.0/coreapi/exevents.c
---- linphone-1.99.0~/coreapi/exevents.c 2007-06-28 12:15:57.000000000 +0200
-+++ linphone-1.99.0/coreapi/exevents.c 2007-10-07 01:42:50.000000000 +0200
-@@ -24,38 +24,61 @@
- #include <eXosip2/eXosip.h>
- #include <osipparser2/osip_message.h>
-
-+int linphone_answer_sdp(LinphoneCore *lc, eXosip_event_t *ev, sdp_message_t *sdp);
-
-+static void linphone_connect_incoming(LinphoneCore *lc){
-+ lc->vtable.show(lc);
-+ lc->vtable.display_status(lc,_("Connected."));
-+ lc->call->state=LCStateAVRunning;
-+ if (lc->ringstream!=NULL){
-+ ring_stop(lc->ringstream);
-+ lc->ringstream=NULL;
-+ }
-+ if (lc->audiostream->ticker!=NULL){
-+ /*case where we accepted early media */
-+ linphone_core_stop_media_streams(lc);
-+ linphone_core_init_media_streams(lc);
-+ }
-+ linphone_core_start_media_streams(lc,lc->call);
-+}
-
--int linphone_call_accepted(LinphoneCore *lc,int id, sdp_message_t *sdpbody)
-+int linphone_call_accepted(LinphoneCore *lc, eXosip_event_t *ev)
- {
-- StreamParams *audio_params;
- LinphoneCall *call=lc->call;
-+ sdp_message_t *sdp=eXosip_get_sdp_info(ev->response);
-+ const char *sdpanswer=NULL;
-+ osip_message_t *msg=NULL;
-+ int err;
- if (call==NULL){
- ms_warning("No call to accept.");
- return 0;
- }
-- audio_params=&call->audio_params;
- call->auth_pending=FALSE;
- if (call->state==LCStateAVRunning){
- return 0; /*already accepted*/
- }
- linphone_call_init_media_params(call);
-- sdp_context_read_answer(call->sdpctx,sdpbody);
-- lc->vtable.show(lc);
-- lc->vtable.display_status(lc,_("Connected."));
-- gstate_new_state(lc, GSTATE_CALL_OUT_CONNECTED, NULL);
-- lc->call->state=LCStateAVRunning;
-- if (lc->ringstream!=NULL){
-- ring_stop(lc->ringstream);
-- lc->ringstream=NULL;
-+ if (!lc->sip_conf.sdp_200_ack){
-+ err=0;
-+ sdp_context_read_answer(call->sdpctx,sdp);
-+ }else{
-+ /*we receive a 200OK with an sdp offer*/
-+ err=linphone_answer_sdp(lc,ev,sdp);
-+ if (err==0) sdpanswer=call->sdpctx->answerstr;
- }
-- if (lc->audiostream->ticker!=NULL){
-- /*case where we accepted early media */
-- linphone_core_stop_media_streams(lc);
-- linphone_core_init_media_streams(lc);
-+ if (err==0){
-+ gstate_new_state(lc, GSTATE_CALL_OUT_CONNECTED, NULL);
-+ linphone_connect_incoming(lc);
-+ }
-+ /*send the ack once streams are started*/
-+ eXosip_call_build_ack(ev->did,&msg);
-+ if (sdpanswer!=NULL) linphone_set_sdp(msg,sdpanswer);
-+ eXosip_call_send_ack(ev->did,msg);
-+ if (err!=0){
-+ /*send a bye*/
-+ ms_error("Incompatible SDP offer received in 200Ok, need to abort the call");
-+ linphone_core_terminate_call(lc,NULL);
- }
-- linphone_core_start_media_streams(lc,call);
--
- return 0;
- }
-
-@@ -193,167 +216,126 @@
-
- extern sdp_handler_t linphone_sdphandler;
-
--int linphone_inc_new_call(LinphoneCore *lc, eXosip_event_t *ev)
--{
-- char *barmesg,*answer;
-+int linphone_answer_sdp(LinphoneCore *lc, eXosip_event_t *ev, sdp_message_t *sdp){
- int status=200;
- sdp_context_t *ctx=NULL;
-+
-+ ctx=lc->call->sdpctx;
-+ /* get the result of the negociation */
-+ sdp_context_get_answer(ctx,sdp);
-+ status=sdp_context_get_status(ctx);
-+
-+ if (status==200){
-+ linphone_core_init_media_streams(lc);
-+ return 0;
-+ }else{
-+ if (status==-1) status=415;
-+ }
-+ return -1;
-+}
-+
-+int linphone_inc_new_call(LinphoneCore *lc, eXosip_event_t *ev)
-+{
-+ sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
- osip_from_t *from_url=ev->request->from;
-- int cid=ev->cid;
-- int did=ev->did;
-- int tid=ev->tid;
-+ char *barmesg;
- char *from;
- char *to;
-- sdp_message_t *sdp=eXosip_get_remote_sdp(ev->did);
--#ifdef VINCENT_MAURY_RSVP
-- char *textinfo=ev->textinfo;
-- #endif
--
-+ int err;
-+
- osip_from_to_str(ev->request->from,&from);
-- osip_to_to_str(ev->request->to,&to);
-+ osip_to_to_str(ev->request->to,&to);
-+
- /* first check if we can answer successfully to this invite */
- if (lc->presence_mode!=LINPHONE_STATUS_ONLINE){
- ms_message("Not present !! presence mode : %d\n",lc->presence_mode);
- eXosip_lock();
- if (lc->presence_mode==LINPHONE_STATUS_BUSY)
-- eXosip_call_send_answer(tid,486,NULL);
-+ eXosip_call_send_answer(ev->tid,486,NULL);
- else if (lc->presence_mode==LINPHONE_STATUS_AWAY
- ||lc->presence_mode==LINPHONE_STATUS_BERIGHTBACK
- ||lc->presence_mode==LINPHONE_STATUS_ONTHEPHONE
- ||lc->presence_mode==LINPHONE_STATUS_OUTTOLUNCH
- ||lc->presence_mode==LINPHONE_STATUS_OFFLINE)
-- eXosip_call_send_answer(tid,480,NULL);
-+ eXosip_call_send_answer(ev->tid,480,NULL);
- else if (lc->presence_mode==LINPHONE_STATUS_NOT_DISTURB)
-- eXosip_call_send_answer(tid,480,NULL);
-+ eXosip_call_send_answer(ev->tid,480,NULL);
- else if (lc->alt_contact!=NULL && lc->presence_mode==LINPHONE_STATUS_MOVED)
- {
- osip_message_t *msg;
-- eXosip_call_build_answer(tid,302,&msg);
-+ eXosip_call_build_answer(ev->tid,302,&msg);
- osip_message_set_contact(msg,lc->alt_contact);
-- eXosip_call_send_answer(tid,302,msg);
-+ eXosip_call_send_answer(ev->tid,302,msg);
- }
- else if (lc->alt_contact!=NULL && lc->presence_mode==LINPHONE_STATUS_ALT_SERVICE)
- {
- osip_message_t *msg;
-- eXosip_call_build_answer(tid,380,&msg);
-+ eXosip_call_build_answer(ev->tid,380,&msg);
- osip_message_set_contact(msg,lc->alt_contact);
-- eXosip_call_send_answer(tid,380,msg);
-+ eXosip_call_send_answer(ev->tid,380,msg);
- }
- else
-- eXosip_call_send_answer(tid,486,NULL);
-+ eXosip_call_send_answer(ev->tid,486,NULL);
- eXosip_unlock();
- goto end;
- }
-- /* not busy */
--#ifdef VINCENT_MAURY_RSVP
-- /* in qos mode, call already exists at the end of resource reservation */
-- if (lc->call!=NULL && lc->rsvp_enable && strcmp(textinfo,"New Call")!=0){
--#else
-- if (lc->call!=NULL){
--#endif
-+ if (lc->call!=NULL){/*busy*/
- eXosip_lock();
-- eXosip_call_send_answer(tid,486,NULL);
-+ eXosip_call_send_answer(ev->tid,486,NULL);
- eXosip_unlock();
- goto end;
- }
-+ lc->call=linphone_call_new_incoming(lc,from,to,ev->cid,ev->did,ev->tid);
-+ gstate_new_state(lc, GSTATE_CALL_IN_INVITE, NULL);
- if (sdp==NULL){
-- ms_warning("No sdp body !");
-- eXosip_lock();
-- eXosip_call_send_answer(tid,603,NULL);
-- eXosip_unlock();
-- goto end;
-+ ms_message("No sdp body in invite, 200-ack scheme");
-+ err=0;
-+ }else{
-+ err=linphone_answer_sdp(lc,ev,sdp);
- }
--#ifdef VINCENT_MAURY_RSVP
-- /* make the negotiation only once at the first invite received */
-- if (strcmp(textinfo,"New Call")!=0)
-- {
-+ if (!err){
-+ char *tmp;
-+ if (from_2char_without_params(from_url,&tmp)!=0){
-+ tmp=ms_strdup("Unknown user");
-+ }
-+ barmesg=ortp_strdup_printf("%s %s",tmp,_("is contacting you."));
-+ lc->vtable.show(lc);
-+ lc->vtable.display_status(lc,barmesg);
-+ lc->vtable.inv_recv(lc,tmp);
-+ ms_free(barmesg);
-+ osip_free(tmp);
-
-- lc->call=linphone_call_new_incoming(lc,from,ev->local_uri,cid,did);
-- ctx=lc->call->sdpctx;
-- /* get the result of the negociation */
-- answer=sdp_context_get_answer(ctx,sdp_body);
-- status=sdp_context_get_status(ctx);
-- }
--#else
-- lc->call=linphone_call_new_incoming(lc,from,to,cid,did,ev->tid);
-- ctx=lc->call->sdpctx;
-- /* get the result of the negociation */
-- answer=sdp_context_get_answer(ctx,sdp);
-- status=sdp_context_get_status(ctx);
--
--#endif
-- switch(status)
-- {
-- case 200:
-- /* vérification de la qos */
--#ifdef VINCENT_MAURY_RSVP
-- if (strcmp(textinfo,"With QoS")==0 && !lc->rsvp_enable)
-- /* caller has QoS, we don't */
-- lc->vtable.display_yes_no(lc,strdup(textinfo));
-- else if (strcmp(textinfo,"Without QoS")==0 && lc->rsvp_enable)
-- /* caller doesn't have QoS, we do ! */
-- lc->vtable.display_yes_no(lc,strdup(textinfo));
-- else if (strcmp(textinfo,"With QoS")==0 && lc->rsvp_enable)
-- {
-- /* we agree on With QoS */
-- eXosip_lock();
-- eXosip_answer_call_with_body(did,183,"application/sdp",answer);
-- eXosip_unlock();
-- }
-- else if (strcmp(textinfo,"Without QoS")==0 && !lc->rsvp_enable ||
-- strcmp(textinfo,"New Call")==0)
-- {
-- /* we agree on Without QoS */
-- eXosip_lock();
-- eXosip_answer_call(did,180,NULL);
-- eXosip_unlock();
-- /* play the ring */
-- lc->ringstream=ring_start(lc->sound_conf.local_ring,
-- 2000,lc->sound_conf.ring_sndcard);
-- }
--#else
-- eXosip_lock();
-- eXosip_call_send_answer(tid,180,NULL);
-- eXosip_unlock();
-- /* play the ring */
-- if (lc->sound_conf.ring_sndcard!=NULL){
-- ms_message("Starting local ring...");
-- lc->ringstream=ring_start(lc->sound_conf.local_ring,2000,lc->sound_conf.ring_sndcard);
-- }
--#endif
-- linphone_call_set_state(lc->call,LCStateRinging);
-- {
-- char *tmp;
-- if (from_2char_without_params(from_url,&tmp)!=0){
-- tmp=ms_strdup("Unknown user");
-- }
-- linphone_core_init_media_streams(lc);
-- barmesg=ortp_strdup_printf("%s %s",tmp,_("is contacting you."));
-- lc->vtable.show(lc);
-- lc->vtable.display_status(lc,barmesg);
-- gstate_new_state(lc, GSTATE_CALL_IN_INVITE, tmp);
-- lc->vtable.inv_recv(lc,tmp);
-- ms_free(barmesg);
-- osip_free(tmp);
--
-- gstate_new_state(lc, GSTATE_CALL_IN_INVITE, NULL);
-- }
-- break;
-- default:
-- if (status==-1) status=415;
-- ms_warning("Error during sdp negociation. status : %d\n",status);
-- eXosip_lock();
-- eXosip_call_send_answer(tid,status,NULL);
-- eXosip_unlock();
-- linphone_call_destroy(lc->call);
-- lc->call=NULL;
-+ linphone_call_set_state(lc->call,LCStateRinging);
-+ eXosip_lock();
-+ eXosip_call_send_answer(ev->tid,180,NULL);
-+ eXosip_unlock();
-+ /* play the ring */
-+ if (lc->sound_conf.ring_sndcard!=NULL){
-+ ms_message("Starting local ring...");
-+ lc->ringstream=ring_start(lc->sound_conf.local_ring,2000,lc->sound_conf.ring_sndcard);
-+ }
-+ }else{
-+ ms_error("Error during sdp negociation. ");
-+ eXosip_lock();
-+ eXosip_call_send_answer(ev->tid,415,NULL);
-+ eXosip_unlock();
-+ linphone_call_destroy(lc->call);
-+ lc->call=NULL;
- }
- end:
-- osip_free(from);
-- osip_free(to);
-+ osip_free(from);
-+ osip_free(to);
- return 0;
- }
-
-+void linphone_handle_ack(LinphoneCore *lc, eXosip_event_t *ev){
-+ sdp_message_t *sdp=eXosip_get_sdp_info(ev->ack);
-+ if (sdp){
-+ sdp_context_read_answer(lc->call->sdpctx,sdp);
-+ linphone_connect_incoming(lc);
-+ }
-+}
-+
- void linphone_handle_reinvite(LinphoneCore *lc, eXosip_event_t *ev){
- sdp_message_t *sdp=eXosip_get_sdp_info(ev->request);
- sdp_context_t *ctx;
-@@ -823,16 +805,10 @@
-
- void linphone_core_process_event(LinphoneCore *lc,eXosip_event_t *ev)
- {
-- sdp_message_t *sdp=NULL;
-- osip_message_t *msg=NULL;
- switch(ev->type){
- case EXOSIP_CALL_ANSWERED:
- ms_message("CALL_ANSWERED\n");
-- sdp=eXosip_get_sdp_info(ev->response);
-- linphone_call_accepted(lc,ev->did,sdp);
-- /*send the ack once streams are started*/
-- eXosip_call_build_ack(ev->did,&msg);
-- eXosip_call_send_ack(ev->did,msg);
-+ linphone_call_accepted(lc,ev);
- linphone_authentication_ok(lc,ev);
- break;
- case EXOSIP_CALL_CLOSED:
-@@ -863,6 +839,7 @@
- break;
- case EXOSIP_CALL_ACK:
- ms_message("CALL_ACK");
-+ linphone_handle_ack(lc,ev);
- break;
- case EXOSIP_CALL_REDIRECTED:
- ms_message("CALL_REDIRECTED");
-@@ -916,6 +893,5 @@
- default:
- break;
- }
-- if (sdp) sdp_message_free(sdp);
- eXosip_event_free(ev);
- }
-diff -urNad linphone-1.99.0~/coreapi/linphonecore.c linphone-1.99.0/coreapi/linphonecore.c
---- linphone-1.99.0~/coreapi/linphonecore.c 2007-08-07 12:19:44.000000000 +0200
-+++ linphone-1.99.0/coreapi/linphonecore.c 2007-10-07 01:42:50.000000000 +0200
-@@ -98,7 +98,6 @@
- call->core=lc;
- linphone_core_get_local_ip(lc,to->url->host,localip);
- call->sdpctx=sdp_handler_create_context(&linphone_sdphandler,localip,from->url->username);
-- call->profile=lc->local_profile; /*use the readonly local profile*/
- osip_from_to_str(from,&fromstr);
- osip_to_to_str(to,&tostr);
- linphone_call_init_common(call,fromstr,tostr);
-@@ -433,6 +432,8 @@
- }
- }
-
-+ /*for test*/
-+ lc->sip_conf.sdp_200_ack=lp_config_get_int(lc->config,"sip","sdp_200_ack",0);
- }
-
- void rtp_config_read(LinphoneCore *lc)
-@@ -878,7 +879,13 @@
- eXosip_set_rsvp_mode (lc->rsvp_enable);
- eXosip_set_rpc_mode (lc->rpc_enable);
- #endif
-- snprintf(ua_string,sizeof(ua_string),"Linphone-%s/eXosip2-%s",LINPHONE_VERSION, eXosip_get_version());
-+ snprintf(ua_string,sizeof(ua_string),"Linphone-%s/eXosip2-%s",LINPHONE_VERSION,
-+#ifdef HAVE_EXOSIP_GET_VERSION
-+ eXosip_get_version()
-+#else
-+ "unknown"
-+#endif
-+);
- eXosip_set_user_agent(ua_string);
- exosip_running=TRUE;
- }
-@@ -976,15 +983,17 @@
- return ret;
- }
-
--bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **real_url, osip_to_t **real_parsed_url){
-+bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **real_url, osip_to_t **real_parsed_url, char **route){
- enum_lookup_res_t *enumres=NULL;
- osip_to_t *parsed_url=NULL;
- char *enum_domain=NULL;
- LinphoneProxyConfig *proxy;
- char *tmpurl;
--
-+ const char *tmproute;
- if (real_url!=NULL) *real_url=NULL;
- if (real_parsed_url!=NULL) *real_parsed_url=NULL;
-+ *route=NULL;
-+ tmproute=linphone_core_get_route(lc);
-
- if (is_enum(url,&enum_domain)){
- lc->vtable.display_status(lc,_("Looking for telephone number destination..."));
-@@ -998,6 +1007,7 @@
- if (real_url!=NULL) *real_url=ms_strdup(tmpurl);
- if (real_parsed_url!=NULL) *real_parsed_url=osip_to_create(tmpurl);
- enum_lookup_res_free(enumres);
-+ if (tmproute) *route=ms_strdup(tmproute);
- return TRUE;
- }
- /* check if we have a "sip:" */
-@@ -1005,22 +1015,25 @@
- /* this doesn't look like a true sip uri */
- proxy=lc->default_proxy;
- if (proxy!=NULL){
-- /* append the proxy suffix */
-- osip_uri_t *proxy_uri;
-+ /* append the proxy domain suffix */
-+ osip_from_t *uri;
- char *sipaddr;
-- const char *proxy_addr=linphone_proxy_config_get_addr(proxy);
-- osip_uri_init(&proxy_uri);
-- if (osip_uri_parse(proxy_uri,proxy_addr)<0){
-- osip_uri_free(proxy_uri);
-+ const char *identity=linphone_proxy_config_get_identity(proxy);
-+ osip_from_init(&uri);
-+ if (osip_from_parse(uri,identity)<0){
-+ osip_from_free(uri);
- return FALSE;
- }
-- if (proxy_uri->port!=NULL)
-- sipaddr=ortp_strdup_printf("sip:%s@%s:%s",url,proxy_uri->host,proxy_uri->port);
-- else
-- sipaddr=ortp_strdup_printf("sip:%s@%s",url,proxy_uri->host);
-+ sipaddr=ortp_strdup_printf("sip:%s@%s",url,uri->url->host);
- if (real_parsed_url!=NULL) *real_parsed_url=osip_to_create(sipaddr);
- if (real_url!=NULL) *real_url=sipaddr;
- else ms_free(sipaddr);
-+ /*if the prompted uri was auto-suffixed with proxy domain,
-+ then automatically set a route so that the request goes
-+ through the proxy*/
-+ if (tmproute==NULL)
-+ *route=ms_strdup(linphone_proxy_config_get_addr(proxy));
-+ else *route=ms_strdup(tmproute);
- return TRUE;
- }
- }
-@@ -1029,6 +1042,7 @@
- if (real_url!=NULL) *real_url=ms_strdup(url);
- if (real_parsed_url!=NULL) *real_parsed_url=parsed_url;
- else osip_to_free(parsed_url);
-+ if (tmproute) *route=ms_strdup(tmproute);
- return TRUE;
- }
- /* else we could not do anything with url given by user, so display an error */
-@@ -1083,11 +1097,12 @@
-
- if (lc->call!=NULL){
- lc->vtable.display_warning(lc,_("Sorry, having multiple simultaneous calls is not supported yet !"));
-+ return -1;
- }
-
- gstate_new_state(lc, GSTATE_CALL_OUT_INVITE, url);
- linphone_core_get_default_proxy(lc,&proxy);
-- if (!linphone_core_interpret_url(lc,url,&real_url,&real_parsed_url)){
-+ if (!linphone_core_interpret_url(lc,url,&real_url,&real_parsed_url,&route)){
- /* bad url */
- gstate_new_state(lc, GSTATE_CALL_ERROR, NULL);
- return -1;
-@@ -1096,8 +1111,8 @@
- lc->vtable.display_status(lc,barmsg);
- ms_free(barmsg);
- if (proxy!=NULL) {
-- route=linphone_proxy_config_get_route(proxy);
- from=linphone_proxy_config_get_identity(proxy);
-+
- }
- /* if no proxy or no identity defined for this proxy, default to primary contact*/
- if (from==NULL) from=linphone_core_get_primary_contact(lc);
-@@ -1109,16 +1124,20 @@
- ms_warning("Could not build initial invite");
- goto end;
- }
-+
- /* make sdp message */
-
- osip_from_init(&parsed_url2);
- osip_from_parse(parsed_url2,from);
-
- lc->call=linphone_call_new_outgoing(lc,parsed_url2,real_parsed_url);
-- ctx=lc->call->sdpctx;
-- sdpmesg=sdp_context_get_offer(ctx);
-- linphone_set_sdp(invite,sdpmesg);
-- linphone_core_init_media_streams(lc);
-+ if (!lc->sip_conf.sdp_200_ack){
-+ ctx=lc->call->sdpctx;
-+ lc->call->profile=lc->local_profile;
-+ sdpmesg=sdp_context_get_offer(ctx);
-+ linphone_set_sdp(invite,sdpmesg);
-+ linphone_core_init_media_streams(lc);
-+ }
- eXosip_lock();
- err=eXosip_call_send_initial_invite(invite);
- lc->call->cid=err;
-@@ -1138,6 +1157,7 @@
- if (parsed_url2!=NULL) osip_from_free(parsed_url2);
- if (err<0)
- gstate_new_state(lc, GSTATE_CALL_ERROR, NULL);
-+ if (route!=NULL) ms_free(route);
- return (err<0) ? -1 : 0;
- }
-
-@@ -1147,10 +1167,12 @@
- osip_to_t *real_parsed_url=NULL;
- LinphoneCall *call;
- osip_message_t *msg=NULL;
-- if (!linphone_core_interpret_url(lc,url,&real_url,&real_parsed_url)){
-+ char *route;
-+ if (!linphone_core_interpret_url(lc,url,&real_url,&real_parsed_url, &route)){
- /* bad url */
- return -1;
- }
-+ if (route!=NULL) ms_free(route);
- call=lc->call;
- if (call==NULL){
- ms_warning("No established call to refer.");
-@@ -1346,6 +1368,7 @@
- char *sdpmesg;
- osip_message_t *msg=NULL;
- LinphoneCall *call=lc->call;
-+ bool_t offering=FALSE;
- if (call==NULL){
- return -1;
- }
-@@ -1362,15 +1385,24 @@
- }
- /* sends a 200 OK */
- eXosip_call_build_answer(call->tid,200,&msg);
-- sdpmesg=call->sdpctx->answerstr; /* takes the sdp already computed*/
-- linphone_set_sdp(msg,sdpmesg);
-+ /*if a sdp answer is computed, send it, else send an offer */
-+ sdpmesg=call->sdpctx->answerstr;
-+ if (sdpmesg==NULL){
-+ offering=TRUE;
-+ call->profile=lc->local_profile;
-+ sdpmesg=sdp_context_get_offer(call->sdpctx);
-+ linphone_set_sdp(msg,sdpmesg);
-+ linphone_core_init_media_streams(lc);
-+ }else{
-+ linphone_set_sdp(msg,sdpmesg);
-+ }
- eXosip_lock();
- eXosip_call_send_answer(call->tid,200,msg);
- eXosip_unlock();
- lc->vtable.display_status(lc,_("Connected."));
- gstate_new_state(lc, GSTATE_CALL_IN_CONNECTED, NULL);
-
-- linphone_core_start_media_streams(lc, lc->call);
-+ if (!offering) linphone_core_start_media_streams(lc, lc->call);
- return 0;
- }
-
-@@ -1485,27 +1517,34 @@
- if (sndcard) ms_snd_card_set_level(sndcard,MS_SND_CARD_CAPTURE,level);
- }
-
--static MSSndCard *get_card_from_string_id(const char *devid){
-+static MSSndCard *get_card_from_string_id(const char *devid, unsigned int cap){
- MSSndCard *sndcard=NULL;
- if (devid!=NULL){
- sndcard=ms_snd_card_manager_get_card(ms_snd_card_manager_get(),devid);
-+ if (sndcard!=NULL &&
-+ (ms_snd_card_get_capabilities(sndcard) & cap)==0 ){
-+ ms_warning("%s card does not have the %s capability, ignoring.",
-+ devid,
-+ cap==MS_SND_CARD_CAP_CAPTURE ? "capture" : "playback");
-+ sndcard=NULL;
-+ }
- }
- if (sndcard==NULL) sndcard=ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
- return sndcard;
- }
-
- int linphone_core_set_ringer_device(LinphoneCore *lc, const char * devid){
-- lc->sound_conf.ring_sndcard=get_card_from_string_id(devid);
-+ lc->sound_conf.ring_sndcard=get_card_from_string_id(devid,MS_SND_CARD_CAP_PLAYBACK);
- return 0;
- }
-
- int linphone_core_set_playback_device(LinphoneCore *lc, const char * devid){
-- lc->sound_conf.play_sndcard=get_card_from_string_id(devid);
-+ lc->sound_conf.play_sndcard=get_card_from_string_id(devid,MS_SND_CARD_CAP_PLAYBACK);
- return 0;
- }
-
- int linphone_core_set_capture_device(LinphoneCore *lc, const char * devid){
-- lc->sound_conf.capt_sndcard=get_card_from_string_id(devid);
-+ lc->sound_conf.capt_sndcard=get_card_from_string_id(devid,MS_SND_CARD_CAP_CAPTURE);
- return 0;
- }
-
-diff -urNad linphone-1.99.0~/coreapi/linphonecore.h linphone-1.99.0/coreapi/linphonecore.h
---- linphone-1.99.0~/coreapi/linphonecore.h 2007-06-27 10:36:46.000000000 +0200
-+++ linphone-1.99.0/coreapi/linphonecore.h 2007-10-07 01:42:50.000000000 +0200
-@@ -55,6 +55,7 @@
- bool_t guess_hostname;
- bool_t loopback_only;
- bool_t ipv6_enabled;
-+ bool_t sdp_200_ack;
- } sip_config_t;
-
- typedef struct rtp_config
-@@ -277,6 +278,7 @@
- char *passwd;
- char *ha1;
- bool_t works;
-+ bool_t first_time;
- }LinphoneAuthInfo;
-
- LinphoneAuthInfo *linphone_auth_info_new(const char *username, const char *userid,
-@@ -289,6 +291,7 @@
- struct _LinphoneChatRoom{
- struct _LinphoneCore *lc;
- char *peer;
-+ char *route;
- osip_from_t *peer_url;
- void * user_data;
- };
-@@ -410,12 +413,6 @@
- LINPHONE_POLICY_USE_STUN
- } LinphoneFirewallPolicy;
-
--typedef struct _AuthState{
-- int tid;
-- char *username;
-- char *realm;
--}AuthState;
--
- typedef struct _LinphoneCore
- {
- LinphoneCoreVTable vtable;
-@@ -460,7 +457,6 @@
- int dw_video_bw;
- int up_video_bw;
- int automatic_action;
-- AuthState authstate;
- bool_t use_files;
- bool_t apply_nat_settings;
- #ifdef VINCENT_MAURY_RSVP
-@@ -669,7 +665,7 @@
- void linphone_core_stop_media_streams(LinphoneCore *lc);
- const char * linphone_core_get_identity(LinphoneCore *lc);
- const char * linphone_core_get_route(LinphoneCore *lc);
--bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **real_url, osip_to_t **real_parsed_url);
-+bool_t linphone_core_interpret_url(LinphoneCore *lc, const char *url, char **real_url, osip_to_t **real_parsed_url, char **route);
-
- #ifdef __cplusplus
- }
-diff -urNad linphone-1.99.0~/coreapi/private.h linphone-1.99.0/coreapi/private.h
---- linphone-1.99.0~/coreapi/private.h 2007-06-01 14:47:21.000000000 +0200
-+++ linphone-1.99.0/coreapi/private.h 2007-10-07 01:42:50.000000000 +0200
-@@ -33,7 +33,7 @@
- #endif
-
- #ifndef LINPHONE_VERSION
--#define LINPHONE_VERSION "1.7.0"
-+#define LINPHONE_VERSION "1.99.1"
- #endif
-
- #ifndef LIBLINPHONE_VERSION
diff -urNad linphone-1.99.0~/gtk/linphone.c linphone-1.99.0/gtk/linphone.c
--- linphone-1.99.0~/gtk/linphone.c 2007-05-23 15:21:33.000000000 +0200
+++ linphone-1.99.0/gtk/linphone.c 2007-10-07 01:42:50.000000000 +0200
@@ -1083,1309 +30,3 @@
//g_log_set_fatal_mask("GLib",G_LOG_LEVEL_WARNING);
//g_mem_set_vtable(glib_mem_profiler_table);
//g_mem_set_vtable(&dbgtable);
-diff -urNad linphone-1.99.0~/m4/exosip.m4 linphone-1.99.0/m4/exosip.m4
---- linphone-1.99.0~/m4/exosip.m4 2007-05-23 11:32:18.000000000 +0200
-+++ linphone-1.99.0/m4/exosip.m4 2007-10-07 01:42:50.000000000 +0200
-@@ -1,3 +1,4 @@
-+dnl -*- autoconf -*-
- AC_DEFUN([LP_SETUP_EXOSIP],[
- AC_REQUIRE([AC_CANONICAL_HOST])
- AC_REQUIRE([LP_CHECK_OSIP2])
-@@ -16,7 +17,14 @@
- LDFLAGS_save=$LDFLAGS
- LDFLAGS=$OSIP_LIBS
- LIBS_save=$LIBS
--AC_CHECK_LIB(eXosip2,eXosip_subscribe_remove, , AC_MSG_ERROR([Could not find eXosip2 library with version >= 3.0.2 !]),[-losipparser2 -losip2 -lpthread])
-+AC_CHECK_LIB([eXosip2],[eXosip_subscribe_remove],
-+ [],
-+ [AC_MSG_ERROR([Could not find eXosip2 library with version >= 3.0.2 !])],
-+ [-losipparser2 -losip2 -lpthread])
-+AC_CHECK_LIB([eXosip2],[eXosip_get_version],
-+ [AC_DEFINE([HAVE_EXOSIP_GET_VERSION],[1],[Defined when eXosip_get_version is available])],
-+ [],
-+ [-losipparser2 -losip2 -lpthread])
- LIBS=$LIBS_save
- LDFLAGS=$LDFLAGS_save
-
-diff -urNad linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msfileplayer.h linphone-1.99.0/mediastreamer2/include/mediastreamer2/msfileplayer.h
---- linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msfileplayer.h 2006-11-08 18:52:45.000000000 +0100
-+++ linphone-1.99.0/mediastreamer2/include/mediastreamer2/msfileplayer.h 2007-10-07 01:42:54.000000000 +0200
-@@ -34,6 +34,7 @@
- */
- #define MS_FILE_PLAYER_LOOP MS_FILTER_METHOD(MS_FILE_PLAYER_ID,4,int)
- #define MS_FILE_PLAYER_DONE MS_FILTER_METHOD(MS_FILE_PLAYER_ID,5,int)
-+#define MS_FILE_PLAYER_BIG_BUFFER MS_FILTER_METHOD(MS_FILE_PLAYER_ID,6,int)
-
- /*events*/
- #define MS_FILE_PLAYER_EOF MS_FILTER_EVENT_NO_ARG(MS_FILE_PLAYER_ID,0)
-diff -urNad linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msqueue.h linphone-1.99.0/mediastreamer2/include/mediastreamer2/msqueue.h
---- linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msqueue.h 2006-11-29 14:50:49.000000000 +0100
-+++ linphone-1.99.0/mediastreamer2/include/mediastreamer2/msqueue.h 2007-10-07 01:42:54.000000000 +0200
-@@ -44,13 +44,17 @@
-
- static inline void ms_queue_put(MSQueue *q, mblk_t *m){
- putq(&q->q,m);
-- return;
-+ return;
- }
-
- static inline mblk_t * ms_queue_peek_last(MSQueue *q){
- return qlast(&q->q);
- }
-
-+static inline bool_t ms_queue_empty(MSQueue *q){
-+ return qempty(&q->q);
-+}
-+
- void ms_queue_flush(MSQueue *q);
-
- void ms_queue_destroy(MSQueue *q);
-@@ -72,7 +76,7 @@
- typedef struct _MSBufferizer MSBufferizer;
-
- /*allocates and initialize */
--MSBufferizer * ms_bufferizer_new();
-+MSBufferizer * ms_bufferizer_new(void);
-
- /*initialize in memory */
- void ms_bufferizer_init(MSBufferizer *obj);
-diff -urNad linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msticker.h linphone-1.99.0/mediastreamer2/include/mediastreamer2/msticker.h
---- linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msticker.h 2007-02-07 21:36:18.000000000 +0100
-+++ linphone-1.99.0/mediastreamer2/include/mediastreamer2/msticker.h 2007-10-07 01:42:54.000000000 +0200
-@@ -50,7 +50,7 @@
- typedef struct _MSTicker MSTicker;
-
-
--MSTicker *ms_ticker_new();
-+MSTicker *ms_ticker_new(void);
-
- /**
- * function_name:ms_ticker_attach
-diff -urNad linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msvideo.h linphone-1.99.0/mediastreamer2/include/mediastreamer2/msvideo.h
---- linphone-1.99.0~/mediastreamer2/include/mediastreamer2/msvideo.h 2007-06-12 15:18:01.000000000 +0200
-+++ linphone-1.99.0/mediastreamer2/include/mediastreamer2/msvideo.h 2007-10-07 01:42:54.000000000 +0200
-@@ -68,7 +68,7 @@
-
- int ms_pix_fmt_to_ffmpeg(MSPixFmt fmt);
- MSPixFmt ffmpeg_pix_fmt_to_ms(int fmt);
--void ms_ffmpeg_check_init();
-+void ms_ffmpeg_check_init(void);
-
- #define MS_FILTER_SET_VIDEO_SIZE MS_FILTER_BASE_METHOD(100,MSVideoSize)
- #define MS_FILTER_GET_VIDEO_SIZE MS_FILTER_BASE_METHOD(101,MSVideoSize)
-diff -urNad linphone-1.99.0~/mediastreamer2/src/msconf.c linphone-1.99.0/mediastreamer2/src/msconf.c
---- linphone-1.99.0~/mediastreamer2/src/msconf.c 2007-03-09 21:56:35.000000000 +0100
-+++ linphone-1.99.0/mediastreamer2/src/msconf.c 2007-10-07 01:42:54.000000000 +0200
-@@ -211,7 +211,7 @@
- chan=&s->channels[0];
- if (s->adaptative_msconf_buf*s->conf_gran<ms_bufferizer_get_avail(&chan->buff))
- {
-- int i = ms_bufferizer_get_avail(&chan->buff)/s->conf_gran;
-+ i = ms_bufferizer_get_avail(&chan->buff)/s->conf_gran;
- if (i>5)
- ms_message("Increasing buffer because sound card is late. (nb_buf=%i /old=%i)", i, s->adaptative_msconf_buf);
- s->adaptative_msconf_buf=i;
-diff -urNad linphone-1.99.0~/mediastreamer2/src/msfileplayer.c linphone-1.99.0/mediastreamer2/src/msfileplayer.c
---- linphone-1.99.0~/mediastreamer2/src/msfileplayer.c 2007-07-22 11:47:57.000000000 +0200
-+++ linphone-1.99.0/mediastreamer2/src/msfileplayer.c 2007-10-07 01:42:54.000000000 +0200
-@@ -160,10 +160,19 @@
- }else freemsg(om);
- if (err<bytes){
- ms_filter_notify_no_arg(f,MS_FILE_PLAYER_EOF);
-+ lseek(d->fd,d->hsize,SEEK_SET);
-+
-+ /* special value for playing file only once */
-+ if (d->loop_after==-2)
-+ {
-+ d->state=STOPPED;
-+ ms_filter_unlock(f);
-+ return;
-+ }
-+
- if (d->loop_after>=0){
-- lseek(d->fd,d->hsize,SEEK_SET);
- d->pause_time=d->loop_after;
-- }else d->state=STOPPED;
-+ }
- }
- }else{
- ms_warning("Fail to read %i bytes: %s",bytes,strerror(errno));
-diff -urNad linphone-1.99.0~/mediastreamer2/src/msfileplayer_win.c linphone-1.99.0/mediastreamer2/src/msfileplayer_win.c
---- linphone-1.99.0~/mediastreamer2/src/msfileplayer_win.c 2006-11-08 18:52:45.000000000 +0100
-+++ linphone-1.99.0/mediastreamer2/src/msfileplayer_win.c 2007-10-07 01:42:54.000000000 +0200
-@@ -37,6 +37,9 @@
- int loop_after;
- int pause_time;
- bool_t swap;
-+
-+ int stat;
-+ int big_buffer; /* ouput less & bigger buffer. (default => no change) */
- };
-
- typedef struct _PlayerData PlayerData;
-@@ -51,6 +54,8 @@
- d->hsize=0;
- d->loop_after=-1;
- d->pause_time=0;
-+ d->stat=-1;
-+ d->big_buffer=1;
- f->data=d;
- }
-
-@@ -99,6 +104,7 @@
- if (d->fd!=INVALID_HANDLE_VALUE) CloseHandle(d->fd);
- d->fd=NULL;
- d->state=CLOSED;
-+ d->stat=-1;
- return 0;
- }
-
-@@ -113,6 +119,7 @@
- PlayerData *d=(PlayerData*)f->data;
- if (d->state==STARTED){
- d->state=STOPPED;
-+ d->stat=-1;
- SetFilePointer(d->fd, d->hsize, NULL, FILE_BEGIN);
- }
- return 0;
-@@ -156,6 +163,8 @@
- }
-
- if (d->loop_after>0)
-+ {
-+ d->stat=-1;
- d->pause_time=d->loop_after;
- }
- }else{
-@@ -180,6 +189,12 @@
- return 0;
- }
-
-+static int player_set_big_buffer(MSFilter *f, void *arg){
-+ PlayerData *d=(PlayerData*)f->data;
-+ d->big_buffer=*((int*)arg);
-+ return 0;
-+}
-+
- static int player_eof(MSFilter *f, void *arg){
- PlayerData *d=(PlayerData*)f->data;
- if (d->fd==NULL && d->state==CLOSED)
-@@ -204,6 +219,7 @@
- { MS_FILTER_GET_NCHANNELS, player_get_nch },
- { MS_FILE_PLAYER_LOOP, player_loop },
- { MS_FILE_PLAYER_DONE, player_eof },
-+ { MS_FILE_PLAYER_BIG_BUFFER, player_set_big_buffer },
- { 0, NULL }
- };
-
-diff -urNad linphone-1.99.0~/mediastreamer2/src/mssndcard.c linphone-1.99.0/mediastreamer2/src/mssndcard.c
---- linphone-1.99.0~/mediastreamer2/src/mssndcard.c 2007-02-02 11:42:15.000000000 +0100
-+++ linphone-1.99.0/mediastreamer2/src/mssndcard.c 2007-10-07 01:42:54.000000000 +0200
-@@ -51,7 +51,13 @@
- }
-
- MSSndCard * ms_snd_card_manager_get_default_card(MSSndCardManager *m){
-- if (m->cards!=NULL) return (MSSndCard*)m->cards->data;
-+ /*return the first card that has the capture+playback capability */
-+ MSList *elem;
-+ for (elem=m->cards;elem!=NULL;elem=elem->next){
-+ MSSndCard *card=(MSSndCard*)elem->data;
-+ if (card->capabilities==(MS_SND_CARD_CAP_CAPTURE|MS_SND_CARD_CAP_PLAYBACK))
-+ return card;
-+ }
- return NULL;
- }
-
-diff -urNad linphone-1.99.0~/mediastreamer2/src/msticker.c linphone-1.99.0/mediastreamer2/src/msticker.c
---- linphone-1.99.0~/mediastreamer2/src/msticker.c 2007-07-22 11:47:57.000000000 +0200
-+++ linphone-1.99.0/mediastreamer2/src/msticker.c 2007-10-07 01:42:54.000000000 +0200
-@@ -1,294 +1,294 @@
--/*
--mediastreamer2 library - modular sound and video processing and streaming
--Copyright (C) 2006 Simon MORLAT (simon.morlat at linphone.org)
--
--This program is free software; you can redistribute it and/or
--modify it under the terms of the GNU General Public License
--as published by the Free Software Foundation; either version 2
--of the License, or (at your option) any later version.
--
--This program is distributed in the hope that it will be useful,
--but WITHOUT ANY WARRANTY; without even the implied warranty of
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--GNU General Public License for more details.
--
--You should have received a copy of the GNU General Public License
--along with this program; if not, write to the Free Software
--Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
--*/
--
--
--
--#include "mediastreamer2/msticker.h"
--
--
--void * ms_ticker_run(void *s);
--static uint64_t get_cur_time(void *);
--
--void ms_ticker_start(MSTicker *s){
-- s->run=TRUE;
-- ms_thread_create(&s->thread,NULL,ms_ticker_run,s);
--}
--
--
--void ms_ticker_init(MSTicker *ticker)
--{
-- ms_mutex_init(&ticker->lock,NULL);
-- ms_cond_init(&ticker->cond,NULL);
-- ticker->execution_list=NULL;
-- ticker->ticks=1;
-- ticker->time=0;
-- ticker->interval=10;
-- ticker->run=FALSE;
-- ticker->exec_id=0;
-- ticker->get_cur_time_ptr=&get_cur_time;
-- ticker->get_cur_time_data=NULL;
--#ifdef WIN32_TIMERS
-- ticker->TimeEvent=NULL;
--#endif
-- ms_ticker_start(ticker);
--}
--
--MSTicker *ms_ticker_new(){
-- MSTicker *obj=ms_new(MSTicker,1);
-- ms_ticker_init(obj);
-- return obj;
--}
--
--void ms_ticker_stop(MSTicker *s){
-- ms_mutex_lock(&s->lock);
-- s->run=FALSE;
-- ms_cond_wait(&s->cond,&s->lock);
-- ms_mutex_unlock(&s->lock);
-- ms_thread_join(s->thread,NULL);
--}
--
--
--void ms_ticker_uninit(MSTicker *ticker)
--{
-- ms_ticker_stop(ticker);
-- ms_mutex_destroy(&ticker->lock);
-- ms_cond_destroy(&ticker->cond);
--}
--
--void ms_ticker_destroy(MSTicker *ticker){
-- ms_ticker_uninit(ticker);
-- ms_free(ticker);
--}
--
--static void find_filters(MSList **filters, MSFilter *f ){
-- int i;
-- MSQueue *link;
-- if (f==NULL) ms_fatal("Bad graph.");
-- /*ms_message("seeing %s, seen=%i",f->desc->name,f->seen);*/
-- if (f->seen){
-- return;
-- }
-- f->seen=TRUE;
-- *filters=ms_list_append(*filters,f);
-- /* go upstream */
-- for(i=0;i<f->desc->ninputs;i++){
-- link=f->inputs[i];
-- if (link!=NULL) find_filters(filters,link->prev.filter);
-- }
-- /* go downstream */
-- for(i=0;i<f->desc->noutputs;i++){
-- link=f->outputs[i];
-- if (link!=NULL) find_filters(filters,link->next.filter);
-- }
--}
--
--static MSList *get_sources(MSList *filters){
-- MSList *sources=NULL;
-- MSFilter *f;
-- for(;filters!=NULL;filters=filters->next){
-- f=(MSFilter*)filters->data;
-- if (f->desc->ninputs==0){
-- sources=ms_list_append(sources,f);
-- }
-- }
-- return sources;
--}
--
--int ms_ticker_attach(MSTicker *ticker,MSFilter *f)
--{
-- MSList *sources=NULL;
-- MSList *filters=NULL;
-- MSList *it;
--
-- if (f->ticker!=NULL) {
-- ms_message("Filter %s is already being scheduled; nothing to do.",f->desc->name);
-- return 0;
-- }
--
-- find_filters(&filters,f);
-- sources=get_sources(filters);
-- if (sources==NULL){
-- ms_fatal("No sources found around filter %s",f->desc->name);
-- ms_list_free(filters);
-- return -1;
-- }
-- /*run preprocess on each filter: */
-- for(it=filters;it!=NULL;it=it->next)
-- ms_filter_preprocess((MSFilter*)it->data,ticker);
-- ms_mutex_lock(&ticker->lock);
-- ticker->execution_list=ms_list_concat(ticker->execution_list,sources);
-- ms_mutex_unlock(&ticker->lock);
-- ms_list_free(filters);
-- return 0;
--}
--
--
--
--int ms_ticker_detach(MSTicker *ticker,MSFilter *f){
-- MSList *sources=NULL;
-- MSList *filters=NULL;
-- MSList *it;
--
-- if (f->ticker==NULL) {
-- ms_message("Filter %s is not scheduled; nothing to do.",f->desc->name);
-- return 0;
-- }
--
-- find_filters(&filters,f);
-- sources=get_sources(filters);
-- if (sources==NULL){
-- ms_mutex_unlock(&ticker->lock);
-- ms_fatal("No sources found around filter %s",f->desc->name);
-- return -1;
-- }
-- ms_mutex_lock(&ticker->lock);
-- for(it=sources;it!=NULL;it=ms_list_next(it)){
-- ticker->execution_list=ms_list_remove(ticker->execution_list,it->data);
-- }
-- ms_mutex_unlock(&ticker->lock);
-- ms_list_for_each(filters,(void (*)(void*))ms_filter_postprocess);
-- ms_list_free(filters);
-- ms_list_free(sources);
-- return 0;
--}
--
--
--static bool_t filter_can_process(MSFilter *f, int tick){
-- /* look if filters before this one have run */
-- int i;
-- MSQueue *l;
-- for(i=0;i<f->desc->ninputs;i++){
-- l=f->inputs[i];
-- if (l!=NULL){
-- if (l->prev.filter->last_tick!=tick) return FALSE;
-- }
-- }
-- return TRUE;
--}
--
--static void call_process(MSFilter *f){
-- bool_t process_done=FALSE;
-- if (f->desc->ninputs==0){
-- ms_filter_process(f);
-- }else{
-- while (ms_filter_inputs_have_data(f)) {
-- if (process_done){
-- ms_warning("Re-scheduling filter %s: all data should be consumed in one process call, so fix it.",f->desc->name);
-- }
-- ms_filter_process(f);
-- process_done=TRUE;
-- }
-- }
--}
--
--static void run_graph(MSFilter *f, MSTicker *s, MSList **unschedulable, bool_t force_schedule){
-- int i;
-- MSQueue *l;
-- if (f->last_tick!=s->ticks ){
-- if (filter_can_process(f,s->ticks) || force_schedule) {
-- /* this is a candidate */
-- f->last_tick=s->ticks;
-- call_process(f);
-- /* now recurse to next filters */
-- for(i=0;i<f->desc->noutputs;i++){
-- l=f->outputs[i];
-- if (l!=NULL){
-- run_graph(l->next.filter,s,unschedulable, force_schedule);
-- }
-- }
-- }else{
-- /* this filter has not all inputs that have been filled by filters before it. */
-- *unschedulable=ms_list_prepend(*unschedulable,f);
-- }
-- }
--}
--
--static void run_graphs(MSTicker *s, MSList *execution_list, bool_t force_schedule){
-- MSList *it;
-- MSList *unschedulable=NULL;
-- for(it=execution_list;it!=NULL;it=it->next){
-- run_graph((MSFilter*)it->data,s,&unschedulable,force_schedule);
-- }
-- /* filters that are part of a loop haven't been called in process() because one of their input refers to a filter that could not be scheduled (because they could not be scheduled themselves)... Do you understand ?*/
-- /* we resolve this by simply assuming that they must be called anyway
-- for the loop to run correctly*/
-- /* we just recall run_graphs on them, as if they were source filters */
-- if (unschedulable!=NULL) {
-- run_graphs(s,unschedulable,TRUE);
-- ms_list_free(unschedulable);
-- }
--}
--
--#ifdef __MACH__
--#include <sys/types.h>
--#include <sys/timeb.h>
--#endif
--
--static uint64_t get_cur_time(void *unused){
--#if defined(_WIN32_WCE)
-- DWORD timemillis = GetTickCount();
-- return timemillis;
--#elif defined(WIN32)
-- return timeGetTime() ;
--#elif defined(__MACH__) && defined(__GNUC__) && (__GNUC__ >= 3)
-- struct timeval tv;
-- gettimeofday(&tv, NULL);
-- return (tv.tv_sec*1000LL) + (tv.tv_usec/1000LL);
--#elif defined(__MACH__)
-- struct timespec ts;
-- struct timeb time_val;
--
-- ftime (&time_val);
-- ts.tv_sec = time_val.time;
-- ts.tv_nsec = time_val.millitm * 1000000;
-- return (ts.tv_sec*1000LL) + (ts.tv_nsec/1000000LL);
--#else
-- struct timespec ts;
-- if (clock_gettime(CLOCK_REALTIME,&ts)<0){
-- ms_fatal("clock_gettime() doesn't work: %s",strerror(errno));
-- }
-- return (ts.tv_sec*1000LL) + (ts.tv_nsec/1000000LL);
--#endif
--}
-+/*
-+mediastreamer2 library - modular sound and video processing and streaming
-+Copyright (C) 2006 Simon MORLAT (simon.morlat at linphone.org)
-
--static void sleepMs(int ms){
--#ifdef WIN32
-- Sleep(ms);
--#else
-- struct timespec ts;
-- ts.tv_sec=0;
-- ts.tv_nsec=ms*1000000LL;
-- nanosleep(&ts,NULL);
--#endif
--}
--
--static int set_high_prio(void){
-+This program is free software; you can redistribute it and/or
-+modify it under the terms of the GNU General Public License
-+as published by the Free Software Foundation; either version 2
-+of the License, or (at your option) any later version.
-+
-+This program is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+GNU General Public License for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with this program; if not, write to the Free Software
-+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-+*/
-+
-+
-+
-+#include "mediastreamer2/msticker.h"
-+
-+
-+void * ms_ticker_run(void *s);
-+static uint64_t get_cur_time(void *);
-+
-+void ms_ticker_start(MSTicker *s){
-+ s->run=TRUE;
-+ ms_thread_create(&s->thread,NULL,ms_ticker_run,s);
-+}
-+
-+
-+void ms_ticker_init(MSTicker *ticker)
-+{
-+ ms_mutex_init(&ticker->lock,NULL);
-+ ms_cond_init(&ticker->cond,NULL);
-+ ticker->execution_list=NULL;
-+ ticker->ticks=1;
-+ ticker->time=0;
-+ ticker->interval=10;
-+ ticker->run=FALSE;
-+ ticker->exec_id=0;
-+ ticker->get_cur_time_ptr=&get_cur_time;
-+ ticker->get_cur_time_data=NULL;
-+#ifdef WIN32_TIMERS
-+ ticker->TimeEvent=NULL;
-+#endif
-+ ms_ticker_start(ticker);
-+}
-+
-+MSTicker *ms_ticker_new(){
-+ MSTicker *obj=ms_new(MSTicker,1);
-+ ms_ticker_init(obj);
-+ return obj;
-+}
-+
-+void ms_ticker_stop(MSTicker *s){
-+ ms_mutex_lock(&s->lock);
-+ s->run=FALSE;
-+ ms_cond_wait(&s->cond,&s->lock);
-+ ms_mutex_unlock(&s->lock);
-+ ms_thread_join(s->thread,NULL);
-+}
-+
-+
-+void ms_ticker_uninit(MSTicker *ticker)
-+{
-+ ms_ticker_stop(ticker);
-+ ms_mutex_destroy(&ticker->lock);
-+ ms_cond_destroy(&ticker->cond);
-+}
-+
-+void ms_ticker_destroy(MSTicker *ticker){
-+ ms_ticker_uninit(ticker);
-+ ms_free(ticker);
-+}
-+
-+static void find_filters(MSList **filters, MSFilter *f ){
-+ int i;
-+ MSQueue *link;
-+ if (f==NULL) ms_fatal("Bad graph.");
-+ /*ms_message("seeing %s, seen=%i",f->desc->name,f->seen);*/
-+ if (f->seen){
-+ return;
-+ }
-+ f->seen=TRUE;
-+ *filters=ms_list_append(*filters,f);
-+ /* go upstream */
-+ for(i=0;i<f->desc->ninputs;i++){
-+ link=f->inputs[i];
-+ if (link!=NULL) find_filters(filters,link->prev.filter);
-+ }
-+ /* go downstream */
-+ for(i=0;i<f->desc->noutputs;i++){
-+ link=f->outputs[i];
-+ if (link!=NULL) find_filters(filters,link->next.filter);
-+ }
-+}
-+
-+static MSList *get_sources(MSList *filters){
-+ MSList *sources=NULL;
-+ MSFilter *f;
-+ for(;filters!=NULL;filters=filters->next){
-+ f=(MSFilter*)filters->data;
-+ if (f->desc->ninputs==0){
-+ sources=ms_list_append(sources,f);
-+ }
-+ }
-+ return sources;
-+}
-+
-+int ms_ticker_attach(MSTicker *ticker,MSFilter *f)
-+{
-+ MSList *sources=NULL;
-+ MSList *filters=NULL;
-+ MSList *it;
-+
-+ if (f->ticker!=NULL) {
-+ ms_message("Filter %s is already being scheduled; nothing to do.",f->desc->name);
-+ return 0;
-+ }
-+
-+ find_filters(&filters,f);
-+ sources=get_sources(filters);
-+ if (sources==NULL){
-+ ms_fatal("No sources found around filter %s",f->desc->name);
-+ ms_list_free(filters);
-+ return -1;
-+ }
-+ /*run preprocess on each filter: */
-+ for(it=filters;it!=NULL;it=it->next)
-+ ms_filter_preprocess((MSFilter*)it->data,ticker);
-+ ms_mutex_lock(&ticker->lock);
-+ ticker->execution_list=ms_list_concat(ticker->execution_list,sources);
-+ ms_mutex_unlock(&ticker->lock);
-+ ms_list_free(filters);
-+ return 0;
-+}
-+
-+
-+
-+int ms_ticker_detach(MSTicker *ticker,MSFilter *f){
-+ MSList *sources=NULL;
-+ MSList *filters=NULL;
-+ MSList *it;
-+
-+ if (f->ticker==NULL) {
-+ ms_message("Filter %s is not scheduled; nothing to do.",f->desc->name);
-+ return 0;
-+ }
-+
-+ find_filters(&filters,f);
-+ sources=get_sources(filters);
-+ if (sources==NULL){
-+ ms_mutex_unlock(&ticker->lock);
-+ ms_fatal("No sources found around filter %s",f->desc->name);
-+ return -1;
-+ }
-+ ms_mutex_lock(&ticker->lock);
-+ for(it=sources;it!=NULL;it=ms_list_next(it)){
-+ ticker->execution_list=ms_list_remove(ticker->execution_list,it->data);
-+ }
-+ ms_mutex_unlock(&ticker->lock);
-+ ms_list_for_each(filters,(void (*)(void*))ms_filter_postprocess);
-+ ms_list_free(filters);
-+ ms_list_free(sources);
-+ return 0;
-+}
-+
-+
-+static bool_t filter_can_process(MSFilter *f, int tick){
-+ /* look if filters before this one have run */
-+ int i;
-+ MSQueue *l;
-+ for(i=0;i<f->desc->ninputs;i++){
-+ l=f->inputs[i];
-+ if (l!=NULL){
-+ if (l->prev.filter->last_tick!=tick) return FALSE;
-+ }
-+ }
-+ return TRUE;
-+}
-+
-+static void call_process(MSFilter *f){
-+ bool_t process_done=FALSE;
-+ if (f->desc->ninputs==0){
-+ ms_filter_process(f);
-+ }else{
-+ while (ms_filter_inputs_have_data(f)) {
-+ if (process_done){
-+ ms_warning("Re-scheduling filter %s: all data should be consumed in one process call, so fix it.",f->desc->name);
-+ }
-+ ms_filter_process(f);
-+ process_done=TRUE;
-+ }
-+ }
-+}
-+
-+static void run_graph(MSFilter *f, MSTicker *s, MSList **unschedulable, bool_t force_schedule){
-+ int i;
-+ MSQueue *l;
-+ if (f->last_tick!=s->ticks ){
-+ if (filter_can_process(f,s->ticks) || force_schedule) {
-+ /* this is a candidate */
-+ f->last_tick=s->ticks;
-+ call_process(f);
-+ /* now recurse to next filters */
-+ for(i=0;i<f->desc->noutputs;i++){
-+ l=f->outputs[i];
-+ if (l!=NULL){
-+ run_graph(l->next.filter,s,unschedulable, force_schedule);
-+ }
-+ }
-+ }else{
-+ /* this filter has not all inputs that have been filled by filters before it. */
-+ *unschedulable=ms_list_prepend(*unschedulable,f);
-+ }
-+ }
-+}
-+
-+static void run_graphs(MSTicker *s, MSList *execution_list, bool_t force_schedule){
-+ MSList *it;
-+ MSList *unschedulable=NULL;
-+ for(it=execution_list;it!=NULL;it=it->next){
-+ run_graph((MSFilter*)it->data,s,&unschedulable,force_schedule);
-+ }
-+ /* filters that are part of a loop haven't been called in process() because one of their input refers to a filter that could not be scheduled (because they could not be scheduled themselves)... Do you understand ?*/
-+ /* we resolve this by simply assuming that they must be called anyway
-+ for the loop to run correctly*/
-+ /* we just recall run_graphs on them, as if they were source filters */
-+ if (unschedulable!=NULL) {
-+ run_graphs(s,unschedulable,TRUE);
-+ ms_list_free(unschedulable);
-+ }
-+}
-+
-+#ifdef __MACH__
-+#include <sys/types.h>
-+#include <sys/timeb.h>
-+#endif
-+
-+static uint64_t get_cur_time(void *unused){
-+#if defined(_WIN32_WCE)
-+ DWORD timemillis = GetTickCount();
-+ return timemillis;
-+#elif defined(WIN32)
-+ return timeGetTime() ;
-+#elif defined(__MACH__) && defined(__GNUC__) && (__GNUC__ >= 3)
-+ struct timeval tv;
-+ gettimeofday(&tv, NULL);
-+ return (tv.tv_sec*1000LL) + (tv.tv_usec/1000LL);
-+#elif defined(__MACH__)
-+ struct timespec ts;
-+ struct timeb time_val;
-+
-+ ftime (&time_val);
-+ ts.tv_sec = time_val.time;
-+ ts.tv_nsec = time_val.millitm * 1000000;
-+ return (ts.tv_sec*1000LL) + (ts.tv_nsec/1000000LL);
-+#else
-+ struct timespec ts;
-+ if (clock_gettime(CLOCK_REALTIME,&ts)<0){
-+ ms_fatal("clock_gettime() doesn't work: %s",strerror(errno));
-+ }
-+ return (ts.tv_sec*1000LL) + (ts.tv_nsec/1000000LL);
-+#endif
-+}
-+
-+static void sleepMs(int ms){
-+#ifdef WIN32
-+ Sleep(ms);
-+#else
-+ struct timespec ts;
-+ ts.tv_sec=0;
-+ ts.tv_nsec=ms*1000000LL;
-+ nanosleep(&ts,NULL);
-+#endif
-+}
-+
-+static int set_high_prio(void){
- int precision=2;
--#ifdef WIN32
-+#ifdef WIN32
- MMRESULT mm;
- TIMECAPS ptc;
- mm=timeGetDevCaps(&ptc,sizeof(ptc));
- if (mm==0){
-- if (ptc.wPeriodMin<precision)
-- ptc.wPeriodMin=precision;
-- else
-- precision = ptc.wPeriodMin;
-+ if (ptc.wPeriodMin<precision)
-+ ptc.wPeriodMin=precision;
-+ else
-+ precision = ptc.wPeriodMin;
- mm=timeBeginPeriod(ptc.wPeriodMin);
- if (mm!=TIMERR_NOERROR){
- ms_warning("timeBeginPeriod failed.");
-@@ -298,171 +298,172 @@
- ms_warning("timeGetDevCaps failed.");
- }
-
-- if(!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST)){
-- ms_warning("SetThreadPriority() failed (%d)\n", GetLastError());
-- }
--#endif
-- return precision;
--}
--
--static void unset_high_prio(int precision){
--#ifdef WIN32
-+ if(!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST)){
-+ ms_warning("SetThreadPriority() failed (%d)\n", GetLastError());
-+ }
-+#endif
-+ return precision;
-+}
-+
-+static void unset_high_prio(int precision){
-+#ifdef WIN32
- MMRESULT mm;
-
-- if(!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL)){
-- ms_warning("SetThreadPriority() failed (%d)\n", GetLastError());
-- }
--
-- mm=timeEndPeriod(precision);
--#endif
--}
--
--#ifndef WIN32_TIMERS
--
--void * ms_ticker_run(void *arg)
--{
-- MSTicker *s=(MSTicker*)arg;
-- uint64_t realtime;
-- int lastlate=0;
-- int precision=2;
--
-- precision = set_high_prio();
--
--
-- s->ticks=1;
-- ms_mutex_lock(&s->lock);
-- s->orig=s->get_cur_time_ptr(s->get_cur_time_data);
--
-- while(s->run){
-- s->ticks++;
-- run_graphs(s,s->execution_list,FALSE);
-- s->time+=s->interval;
-- while(1){
-- int64_t diff;
-- realtime=s->get_cur_time_ptr(s->get_cur_time_data)-s->orig;
-- ms_mutex_unlock(&s->lock);
-- diff=s->time-realtime;
-- if (diff>0){
-- /* sleep until next tick */
-- sleepMs(diff);
-- }else{
-- int late=-diff;
-- if (late>s->interval*5 && late>lastlate){
-- ms_warning("We are late of %d miliseconds.",late);
-- }
-- lastlate=late;
-- break; /*exit the while loop */
-- }
-- ms_mutex_lock(&s->lock);
-- }
-- ms_mutex_lock(&s->lock);
-- }
-- ms_cond_signal(&s->cond);
-- ms_mutex_unlock(&s->lock);
-- unset_high_prio(precision);
-- ms_message("MSTicker thread exiting");
-- ms_thread_exit(NULL);
-- return NULL;
--}
--
--#else
--
--void * ms_ticker_run(void *arg)
--{
-- MSTicker *s=(MSTicker*)arg;
-- uint64_t realtime;
-- int precision=2;
-- UINT timerId;
--
-- precision = set_high_prio();
--
-- s->TimeEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
--
-- s->ticks=1;
-- ms_mutex_lock(&s->lock);
-- s->orig=s->get_cur_time_ptr(s->get_cur_time_data);
--
-- timerId = timeSetEvent (s->interval, precision, s->TimeEvent, 0,
-- TIME_PERIODIC | TIME_CALLBACK_EVENT_SET);
-- while(s->run){
-- DWORD err;
--
-- s->ticks++;
-- run_graphs(s,s->execution_list,FALSE);
--
-- /* elapsed time since origin */
-- s->time = s->get_cur_time_ptr(s->get_cur_time_data)- s->orig;
--
-- ms_mutex_unlock(&s->lock);
-- err = WaitForSingleObject (s->TimeEvent, s->interval*1000 ); /* wake up each diff */
-- if (err==WAIT_FAILED)
-+ if(!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL)){
-+ ms_warning("SetThreadPriority() failed (%d)\n", GetLastError());
-+ }
-+
-+ mm=timeEndPeriod(precision);
-+#endif
-+}
-+
-+#ifndef WIN32_TIMERS
-+
-+void * ms_ticker_run(void *arg)
-+{
-+ uint64_t realtime;
-+ int64_t diff;
-+ MSTicker *s=(MSTicker*)arg;
-+ int lastlate=0;
-+ int precision=2;
-+ int late;
-+
-+ precision = set_high_prio();
-+
-+
-+ s->ticks=1;
-+ ms_mutex_lock(&s->lock);
-+ s->orig=s->get_cur_time_ptr(s->get_cur_time_data);
-+
-+ while(s->run){
-+ s->ticks++;
-+ run_graphs(s,s->execution_list,FALSE);
-+ s->time+=s->interval;
-+ while(1){
-+ realtime=s->get_cur_time_ptr(s->get_cur_time_data)-s->orig;
-+ ms_mutex_unlock(&s->lock);
-+ diff=s->time-realtime;
-+ if (diff>0){
-+ /* sleep until next tick */
-+ sleepMs(diff);
-+ }else{
-+ late=-diff;
-+ if (late>s->interval*5 && late>lastlate){
-+ ms_warning("We are late of %d miliseconds.",late);
-+ }
-+ lastlate=late;
-+ break; /*exit the while loop */
-+ }
-+ ms_mutex_lock(&s->lock);
-+ }
-+ ms_mutex_lock(&s->lock);
-+ }
-+ ms_cond_signal(&s->cond);
-+ ms_mutex_unlock(&s->lock);
-+ unset_high_prio(precision);
-+ ms_message("MSTicker thread exiting");
-+ ms_thread_exit(NULL);
-+ return NULL;
-+}
-+
-+#else
-+
-+void * ms_ticker_run(void *arg)
-+{
-+ MSTicker *s=(MSTicker*)arg;
-+ uint64_t realtime;
-+ int precision=2;
-+ UINT timerId;
-+
-+ precision = set_high_prio();
-+
-+ s->TimeEvent = CreateEvent (NULL, FALSE, FALSE, NULL);
-+
-+ s->ticks=1;
-+ ms_mutex_lock(&s->lock);
-+ s->orig=s->get_cur_time_ptr(s->get_cur_time_data);
-+
-+ timerId = timeSetEvent (s->interval, precision, s->TimeEvent, 0,
-+ TIME_PERIODIC | TIME_CALLBACK_EVENT_SET);
-+ while(s->run){
-+ DWORD err;
-+
-+ s->ticks++;
-+ run_graphs(s,s->execution_list,FALSE);
-+
-+ /* elapsed time since origin */
-+ s->time = s->get_cur_time_ptr(s->get_cur_time_data)- s->orig;
-+
-+ ms_mutex_unlock(&s->lock);
-+ err = WaitForSingleObject (s->TimeEvent, s->interval*1000 ); /* wake up each diff */
-+ if (err==WAIT_FAILED)
- ms_message("WaitForSingleObject is failing");
--
-- ms_mutex_lock(&s->lock);
-- }
-- ms_cond_signal(&s->cond);
-- ms_mutex_unlock(&s->lock);
-- timeKillEvent (timerId);
-- CloseHandle (s->TimeEvent);
-- s->TimeEvent=NULL;
-- unset_high_prio(precision);
-- ms_message("MSTicker thread exiting");
-- ms_thread_exit(NULL);
-- return NULL;
--}
--
--#endif
--
--void ms_ticker_set_time_func(MSTicker *ticker, MSTickerTimeFunc func, void *user_data){
-- if (func==NULL) func=get_cur_time;
-- /*ms_mutex_lock(&ticker->lock);*/
-- ticker->get_cur_time_ptr=func;
-- ticker->get_cur_time_data=user_data;
-- /*re-set the origin to take in account that previous function ptr and the
-- new one may return different times*/
-- ticker->orig=func(user_data)-ticker->time;
-- /*ms_mutex_unlock(&ticker->lock);*/
-- ms_message("ms_ticker_set_time_func: ticker updated.");
--}
--
--static void print_graph(MSFilter *f, MSTicker *s, MSList **unschedulable, bool_t force_schedule){
-- int i;
-- MSQueue *l;
-- if (f->last_tick!=s->ticks ){
-- if (filter_can_process(f,s->ticks) || force_schedule) {
-- /* this is a candidate */
-- f->last_tick=s->ticks;
-- ms_message("print_graphs: %s", f->desc->name);
-- /* now recurse to next filters */
-- for(i=0;i<f->desc->noutputs;i++){
-- l=f->outputs[i];
-- if (l!=NULL){
-- print_graph(l->next.filter,s,unschedulable, force_schedule);
-- }
-- }
-- }else{
-- /* this filter has not all inputs that have been filled by filters before it. */
-- *unschedulable=ms_list_prepend(*unschedulable,f);
-- }
-- }
--}
--
--static void print_graphs(MSTicker *s, MSList *execution_list, bool_t force_schedule){
-- MSList *it;
-- MSList *unschedulable=NULL;
-- for(it=execution_list;it!=NULL;it=it->next){
-- print_graph((MSFilter*)it->data,s,&unschedulable,force_schedule);
-- }
-- /* filters that are part of a loop haven't been called in process() because one of their input refers to a filter that could not be scheduled (because they could not be scheduled themselves)... Do you understand ?*/
-- /* we resolve this by simply assuming that they must be called anyway
-- for the loop to run correctly*/
-- /* we just recall run_graphs on them, as if they were source filters */
-- if (unschedulable!=NULL) {
-- print_graphs(s,unschedulable,TRUE);
-- ms_list_free(unschedulable);
-- }
--}
--
--void ms_ticker_print_graphs(MSTicker *ticker){
-- print_graphs(ticker,ticker->execution_list,FALSE);
--}
-+
-+ ms_mutex_lock(&s->lock);
-+ }
-+ ms_cond_signal(&s->cond);
-+ ms_mutex_unlock(&s->lock);
-+ timeKillEvent (timerId);
-+ CloseHandle (s->TimeEvent);
-+ s->TimeEvent=NULL;
-+ unset_high_prio(precision);
-+ ms_message("MSTicker thread exiting");
-+ ms_thread_exit(NULL);
-+ return NULL;
-+}
-+
-+#endif
-+
-+void ms_ticker_set_time_func(MSTicker *ticker, MSTickerTimeFunc func, void *user_data){
-+ if (func==NULL) func=get_cur_time;
-+ /*ms_mutex_lock(&ticker->lock);*/
-+ ticker->get_cur_time_ptr=func;
-+ ticker->get_cur_time_data=user_data;
-+ /*re-set the origin to take in account that previous function ptr and the
-+ new one may return different times*/
-+ ticker->orig=func(user_data)-ticker->time;
-+ /*ms_mutex_unlock(&ticker->lock);*/
-+ ms_message("ms_ticker_set_time_func: ticker updated.");
-+}
-+
-+static void print_graph(MSFilter *f, MSTicker *s, MSList **unschedulable, bool_t force_schedule){
-+ int i;
-+ MSQueue *l;
-+ if (f->last_tick!=s->ticks ){
-+ if (filter_can_process(f,s->ticks) || force_schedule) {
-+ /* this is a candidate */
-+ f->last_tick=s->ticks;
-+ ms_message("print_graphs: %s", f->desc->name);
-+ /* now recurse to next filters */
-+ for(i=0;i<f->desc->noutputs;i++){
-+ l=f->outputs[i];
-+ if (l!=NULL){
-+ print_graph(l->next.filter,s,unschedulable, force_schedule);
-+ }
-+ }
-+ }else{
-+ /* this filter has not all inputs that have been filled by filters before it. */
-+ *unschedulable=ms_list_prepend(*unschedulable,f);
-+ }
-+ }
-+}
-+
-+static void print_graphs(MSTicker *s, MSList *execution_list, bool_t force_schedule){
-+ MSList *it;
-+ MSList *unschedulable=NULL;
-+ for(it=execution_list;it!=NULL;it=it->next){
-+ print_graph((MSFilter*)it->data,s,&unschedulable,force_schedule);
-+ }
-+ /* filters that are part of a loop haven't been called in process() because one of their input refers to a filter that could not be scheduled (because they could not be scheduled themselves)... Do you understand ?*/
-+ /* we resolve this by simply assuming that they must be called anyway
-+ for the loop to run correctly*/
-+ /* we just recall run_graphs on them, as if they were source filters */
-+ if (unschedulable!=NULL) {
-+ print_graphs(s,unschedulable,TRUE);
-+ ms_list_free(unschedulable);
-+ }
-+}
-+
-+void ms_ticker_print_graphs(MSTicker *ticker){
-+ print_graphs(ticker,ticker->execution_list,FALSE);
-+}
-diff -urNad linphone-1.99.0~/mediastreamer2/src/videoenc.c linphone-1.99.0/mediastreamer2/src/videoenc.c
---- linphone-1.99.0~/mediastreamer2/src/videoenc.c 2007-08-04 22:13:18.000000000 +0200
-+++ linphone-1.99.0/mediastreamer2/src/videoenc.c 2007-10-07 01:42:54.000000000 +0200
-@@ -256,7 +256,7 @@
- c->max_b_frames=0; /*don't use b frames*/
- c->flags|=CODEC_FLAG_AC_PRED;
- c->flags|=CODEC_FLAG_H263P_UMV;
-- c->flags|=CODEC_FLAG_QPEL;
-+ /*c->flags|=CODEC_FLAG_QPEL;*/ /*don't enable this one: this forces profile_level to advanced simple profile */
- c->flags|=CODEC_FLAG_4MV;
- c->flags|=CODEC_FLAG_GMC;
- c->flags|=CODEC_FLAG_LOOP_FILTER;
-@@ -418,9 +418,9 @@
- AVFrame pict;
- AVCodecContext *c=&s->av_context;
- int error;
--
- mblk_t *comp_buf=s->comp_buf;
- int comp_buf_sz=comp_buf->b_datap->db_lim-comp_buf->b_datap->db_base;
-+
- /* convert image if necessary */
- avcodec_get_frame_defaults(&pict);
- avpicture_fill((AVPicture*)&pict,(uint8_t*)inm->b_rptr,c->pix_fmt,c->width,c->height);
-diff -urNad linphone-1.99.0~/mediastreamer2/src/winsnd2.c linphone-1.99.0/mediastreamer2/src/winsnd2.c
---- linphone-1.99.0~/mediastreamer2/src/winsnd2.c 2007-07-19 13:29:08.000000000 +0200
-+++ linphone-1.99.0/mediastreamer2/src/winsnd2.c 2007-10-07 01:42:54.000000000 +0200
-@@ -29,6 +29,7 @@
-
- #define WINSND_NBUFS 10
- #define WINSND_NSAMPLES 160
-+#define WINSND_MINIMUMBUFFER 5
-
- static MSFilter *ms_winsnd_read_new(MSSndCard *card);
- static MSFilter *ms_winsnd_write_new(MSSndCard *card);
-diff -urNad linphone-1.99.0~/oRTP/ChangeLog linphone-1.99.0/oRTP/ChangeLog
---- linphone-1.99.0~/oRTP/ChangeLog 2007-05-03 16:28:30.000000000 +0200
-+++ linphone-1.99.0/oRTP/ChangeLog 2007-10-07 01:42:54.000000000 +0200
-@@ -1,4 +1,9 @@
--2007-04-19 Francois-Xavier Kowalski <fix at hp.com>
-+2007-07-26 Francois-Xavier Kowalski <fix at hp.com>
-+
-+ * pkg.list: 1.3
-+ Do not run makewhatis when installing EPM-generated package.
-+
-+2007-04-19 Francois-Xavier Kowalski <fix at hp.com>
-
- * ortp.spec.in (Requires): 1.4
- Adapt to new documentation generation change from gtk-doc to
-diff -urNad linphone-1.99.0~/oRTP/include/ortp/rtpsession.h linphone-1.99.0/oRTP/include/ortp/rtpsession.h
---- linphone-1.99.0~/oRTP/include/ortp/rtpsession.h 2007-08-01 16:09:29.000000000 +0200
-+++ linphone-1.99.0/oRTP/include/ortp/rtpsession.h 2007-10-07 01:42:54.000000000 +0200
-@@ -154,6 +154,7 @@
- struct sockaddr_in rem_addr;
- #endif
- int rem_addrlen;
-+ bool_t enabled; /*tells whether we can send RTCP packets */
- } RtcpStream;
-
- typedef struct _RtpSession RtpSession;
-@@ -284,6 +285,8 @@
-
- void rtp_session_set_connected_mode(RtpSession *session, bool_t yesno);
-
-+void rtp_session_enable_rtcp(RtpSession *session, bool_t yesno);
-+
- /*low level recv and send functions */
- mblk_t * rtp_session_recvm_with_ts (RtpSession * session, uint32_t user_ts);
- mblk_t * rtp_session_create_packet(RtpSession *session,int header_size, const uint8_t *payload, int payload_size);
-diff -urNad linphone-1.99.0~/oRTP/include/ortp/stun_udp.h linphone-1.99.0/oRTP/include/ortp/stun_udp.h
---- linphone-1.99.0~/oRTP/include/ortp/stun_udp.h 2007-03-22 20:59:56.000000000 +0100
-+++ linphone-1.99.0/oRTP/include/ortp/stun_udp.h 2007-10-07 01:42:54.000000000 +0200
-@@ -94,8 +94,8 @@
- #else
-
- typedef int Socket;
--static const Socket INVALID_SOCKET = -1;
--static const int SOCKET_ERROR = -1;
-+#define INVALID_SOCKET -1
-+#define SOCKET_ERROR -1
-
- #define closesocket(fd) close(fd)
-
-diff -urNad linphone-1.99.0~/oRTP/pkg.list linphone-1.99.0/oRTP/pkg.list
---- linphone-1.99.0~/oRTP/pkg.list 2006-08-09 15:01:57.000000000 +0200
-+++ linphone-1.99.0/oRTP/pkg.list 2007-10-07 01:42:54.000000000 +0200
-@@ -16,20 +16,15 @@
-
- %system linux
-
--# Compress man pages
--%define __spec_install_post /usr/lib/rpm/brp-compress || :
--
- # Package all-in one: should be split later on...
- %provides ortp-devel
-
- %postinstall << EOF
- ldconfig 2>&1 | logger -i -s -t ${PACKAGE}
--makewhatis -u -w 2>&1 | logger -i -s -t ${PACKAGE}
- EOF
-
- %postremove << EOF
- ldconfig 2>&1 | logger -i -s -t ${PACKAGE}
--makewhatis -u -w 2>&1 | logger -i -s -t ${PACKAGE}
- EOF
-
- %system hpux
-diff -urNad linphone-1.99.0~/oRTP/src/rtpsession.c linphone-1.99.0/oRTP/src/rtpsession.c
---- linphone-1.99.0~/oRTP/src/rtpsession.c 2007-08-01 16:14:52.000000000 +0200
-+++ linphone-1.99.0/oRTP/src/rtpsession.c 2007-10-07 01:42:54.000000000 +0200
-@@ -265,6 +265,7 @@
- rtp_session_enable_jitter_buffer(session,TRUE);
- rtp_session_set_jitter_buffer_params(session,&jbp);
- rtp_session_set_time_jump_limit(session,5000);
-+ rtp_session_enable_rtcp(session,TRUE);
- session->recv_buf_size = UDP_MAX_SIZE;
- session->symmetric_rtp = FALSE;
- session->permissive=FALSE;
-@@ -364,6 +365,17 @@
- rtp_session_telephone_events_supported(session);
- }
-
-+/**
-+ * By default oRTP automatically sends RTCP SR or RR packets. If
-+ * yesno is set to FALSE, the RTCP sending of packet is disabled.
-+ * This functionnality might be needed for some equipments that do not
-+ * support RTCP, leading to a traffic of ICMP errors on the network.
-+ * It can also be used to save bandwidth despite the RTCP bandwidth is
-+ * actually and usually very very low.
-+**/
-+void rtp_session_enable_rtcp(RtpSession *session, bool_t yesno){
-+ session->rtcp.enabled=yesno;
-+}
-
- /**
- * Set the RTP profile to be used for the sending by this session. By default, all session are created by
-@@ -1478,9 +1490,10 @@
- float time;
- if (bytes==0) return 0;
- gettimeofday(¤t,NULL);
-- time=(current.tv_sec - orig->tv_sec) +
-- ((current.tv_usec - orig->tv_usec)*1e-6);
-- bw=((float)bytes)*8/time;
-+ time=(float)(current.tv_sec - orig->tv_sec) +
-+ ((float)(current.tv_usec - orig->tv_usec)*1e-6);
-+ bw=((float)bytes)*8/(time+0.001);
-+ /*+0.0001 avoids a division by zero without changing the results significatively*/
- return bw;
- }
-
-diff -urNad linphone-1.99.0~/oRTP/src/rtpsession_inet.c linphone-1.99.0/oRTP/src/rtpsession_inet.c
---- linphone-1.99.0~/oRTP/src/rtpsession_inet.c 2007-08-01 10:24:35.000000000 +0200
-+++ linphone-1.99.0/oRTP/src/rtpsession_inet.c 2007-10-07 01:42:54.000000000 +0200
-@@ -786,7 +786,9 @@
- destlen=0;
- }
-
-- if ((sockfd>=0 || rtp_session_using_transport(session, rtcp)) && (session->rtcp.rem_addrlen>0 ||using_connected_socket) ){
-+ if (session->rtcp.enabled &&
-+ ( (sockfd>=0 && (session->rtcp.rem_addrlen>0 ||using_connected_socket))
-+ || rtp_session_using_transport(session, rtcp) ) ){
- if (rtp_session_using_transport(session, rtcp)){
- error = (session->rtcp.tr->t_sendto) (session->rtcp.tr, m, 0,
- destaddr, destlen);
-@@ -809,7 +811,7 @@
- rtp_signal_table_emit3(&session->on_network_error,(long)"Error sending RTCP packet",INT_TO_POINTER(getSocketErrorCode()));
- }else ortp_warning ("Error sending rtcp packet: %s ; socket=%i; addr=%s", getSocketError(), session->rtcp.socket, ortp_inet_ntoa((struct sockaddr*)&session->rtcp.rem_addr,session->rtcp.rem_addrlen,host,sizeof(host)) );
- }
-- }else ortp_warning("Cannot send rtcp report: sockfd=%i, rem_addrlen=%i, connected=%i",sockfd,session->rtcp.rem_addrlen,using_connected_socket);
-+ }else ortp_message("Not sending rtcp report: sockfd=%i, rem_addrlen=%i, connected=%i",sockfd,session->rtcp.rem_addrlen,using_connected_socket);
- freemsg (m);
- return error;
- }
More information about the Pkg-voip-commits
mailing list