From 411ff1b9ed90bf4de644e396d98f624a806a8c8d Mon Sep 17 00:00:00 2001 From: bossiel Date: Mon, 11 Jul 2011 11:03:44 +0000 Subject: [PATCH] Fix issues --- .../audio/coreaudio/tdav_consumer_audiounit.c | 1 - .../audio/directsound/tdav_consumer_dsound.c | 6 +- .../tinyDAV/src/codecs/g711/tdav_codec_g711.c | 38 +++++---- .../tinyDAV/src/codecs/g729/tdav_codec_g729.c | 14 ++-- .../tinyDAV/src/codecs/ilbc/tdav_codec_ilbc.c | 12 +-- .../tinyDAV/src/codecs/msrp/tdav_codec_msrp.c | 2 +- .../include/tinymedia/tmedia_session.h | 1 + .../doubango/tinyMEDIA/src/tmedia_session.c | 18 ++-- .../include/tinysip/api/tsip_api_invite.h | 4 +- .../tinySIP/include/tinysip/tsip_event.h | 5 +- .../tinySIP/src/api/tsip_api_invite.c | 6 +- .../tinySIP/src/dialogs/tsip_dialog_invite.c | 83 +++++++++++++++---- .../tinySIP/src/dialogs/tsip_dialog_layer.c | 4 +- .../2.0/doubango/tinySIP/src/tsip_ssession.c | 3 + 14 files changed, 137 insertions(+), 60 deletions(-) diff --git a/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_consumer_audiounit.c b/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_consumer_audiounit.c index 63f05c89..e48dd957 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_consumer_audiounit.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/coreaudio/tdav_consumer_audiounit.c @@ -223,7 +223,6 @@ static int tdav_consumer_audiounit_start(tmedia_consumer_t* self) } if(consumer->paused){ consumer->paused = tsk_false; - return tsk_false; } if(consumer->started){ TSK_DEBUG_WARN("Already started"); diff --git a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c index 94f9f959..ef394474 100644 --- a/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c +++ b/branches/2.0/doubango/tinyDAV/src/audio/directsound/tdav_consumer_dsound.c @@ -194,17 +194,17 @@ int tdav_consumer_dsound_start(tmedia_consumer_t* self) HRESULT hr; LPDIRECTSOUNDNOTIFY lpDSBNotify; DSBPOSITIONNOTIFY pPosNotify[TDAV_DSOUNS_CONSUMER_NOTIF_POS_COUNT] = {0}; - + if(!dsound){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } - + if(!dsound->device || !dsound->primaryBuffer || !dsound->secondaryBuffer){ TSK_DEBUG_ERROR("Consumer not prepared"); return -2; } - + if(dsound->started){ TSK_DEBUG_WARN("Consumer already started"); return 0; diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c b/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c index 28975636..3700cb75 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/g711/tdav_codec_g711.c @@ -36,10 +36,12 @@ /* ============ G.711u Plugin interface ================= */ +#define tdav_codec_g711u_open tsk_null +#define tdav_codec_g711u_close tsk_null #define tdav_codec_g711u_fmtp_get tsk_null #define tdav_codec_g711u_fmtp_set tsk_null -tsk_size_t tdav_codec_g711u_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) +static tsk_size_t tdav_codec_g711u_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) { register tsk_size_t i; register uint8_t* pout_data; @@ -68,7 +70,7 @@ tsk_size_t tdav_codec_g711u_encode(tmedia_codec_t* self, const void* in_data, ts return (in_size/2); } -tsk_size_t tdav_codec_g711u_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) +static tsk_size_t tdav_codec_g711u_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) { tsk_size_t i; @@ -94,7 +96,7 @@ tsk_size_t tdav_codec_g711u_decode(tmedia_codec_t* self, const void* in_data, ts return (in_size*2); } -tsk_bool_t tdav_codec_g711u_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_g711u_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) { /* always match */ return tsk_true; } @@ -138,7 +140,7 @@ static const tsk_object_def_t tdav_codec_g711u_def_s = static const tmedia_codec_plugin_def_t tdav_codec_g711u_plugin_def_s = { &tdav_codec_g711u_def_s, - + tmedia_audio, "PCMU", "G.711u codec (From tinyDAV)", @@ -150,12 +152,12 @@ static const tmedia_codec_plugin_def_t tdav_codec_g711u_plugin_def_s = 1, // channels 20 // ptime }, - + /* video */ {0}, - - tsk_null, // open - tsk_null, // close + + tdav_codec_g711u_open, + tdav_codec_g711u_close, tdav_codec_g711u_encode, tdav_codec_g711u_decode, tdav_codec_g711u_fmtp_match, @@ -167,20 +169,22 @@ const tmedia_codec_plugin_def_t *tdav_codec_g711u_plugin_def_t = &tdav_codec_g71 /* ============ G.711a Plugin interface ================= */ +#define tdav_codec_g711a_open tsk_null +#define tdav_codec_g711a_close tsk_null #define tdav_codec_g711a_fmtp_get tsk_null #define tdav_codec_g711a_fmtp_set tsk_null -tsk_size_t tdav_codec_g711a_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) +static tsk_size_t tdav_codec_g711a_encode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size) { register tsk_size_t i; register uint8_t* pout_data; register short* pin_data; - + if(!self || !in_data || !in_size || !out_data){ TSK_DEBUG_ERROR("Invalid parameter"); return 0; } - + if(*out_max_size encoder.no_of_bytes; } -tsk_size_t tdav_codec_ilbc_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) +static tsk_size_t tdav_codec_ilbc_decode(tmedia_codec_t* self, const void* in_data, tsk_size_t in_size, void** out_data, tsk_size_t* out_max_size, const tsk_object_t* proto_hdr) { int blocks, i, k, block_size; float dtmp; @@ -157,14 +157,14 @@ tsk_size_t tdav_codec_ilbc_decode(tmedia_codec_t* self, const void* in_data, tsk return out_size; } -char* tdav_codec_ilbc_fmtp_get(const tmedia_codec_t* codec) +static char* tdav_codec_ilbc_fmtp_get(const tmedia_codec_t* codec) { char* fmtp = tsk_null; tsk_sprintf(&fmtp, "mode=%d", TDAV_ILBC_MODE); return fmtp; } -tsk_bool_t tdav_codec_ilbc_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_ilbc_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) { /* RFC 3952 - 5. Mapping To SDP Parameters The offer contains the preferred mode of the offerer. The answerer diff --git a/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c b/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c index bf9f2a78..b0884ff9 100644 --- a/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c +++ b/branches/2.0/doubango/tinyDAV/src/codecs/msrp/tdav_codec_msrp.c @@ -42,7 +42,7 @@ #define tdav_codec_msrp_encode tsk_null #define tdav_codec_msrp_decode tsk_null -tsk_bool_t tdav_codec_msrp_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) +static tsk_bool_t tdav_codec_msrp_fmtp_match(const tmedia_codec_t* codec, const char* fmtp) { /* always match */ return tsk_true; } diff --git a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h index 5fd84ba5..badd9ec2 100644 --- a/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h +++ b/branches/2.0/doubango/tinyMEDIA/include/tinymedia/tmedia_session.h @@ -196,6 +196,7 @@ typedef struct tmedia_session_mgr_s tsk_bool_t started; tsk_bool_t ro_changed; tsk_bool_t state_changed; + tsk_bool_t mediaType_changed; //! session type tmedia_type_t type; diff --git a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c index b374d386..e65a7bb7 100644 --- a/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c +++ b/branches/2.0/doubango/tinyMEDIA/src/tmedia_session.c @@ -702,10 +702,15 @@ const tsdp_message_t* tmedia_session_mgr_get_lo(tmedia_session_mgr_t* self) } /* creates local sdp if not already done or update it's value (because of set_ro())*/ - if((self->ro_changed || self->state_changed) && self->sdp.lo){ + if((self->ro_changed || self->state_changed || self->mediaType_changed) && self->sdp.lo){ TSK_OBJECT_SAFE_FREE(self->sdp.lo); + if(self->mediaType_changed){ + // reload session with new medias and keep the old one + _tmedia_session_mgr_load_sessions(self); + } self->ro_changed = tsk_false; self->state_changed = tsk_false; + self->mediaType_changed = tsk_false; } if(self->sdp.lo){ @@ -781,7 +786,7 @@ int tmedia_session_mgr_set_ro(tmedia_session_mgr_t* self, const tsdp_message_t* an offer that contains SDP with a version that has not changed; this is effectively a no-op. */ if((O = (const tsdp_header_O_t*)tsdp_message_get_header(sdp, tsdp_htype_O))){ - if(self->sdp.ro_ver == (int32_t)O->sess_version){ + if(self->sdp.ro_ver == (int32_t)O->sess_version && 0){ TSK_DEBUG_INFO("Remote offer has not changed"); return 0; } @@ -1228,11 +1233,13 @@ int _tmedia_session_mgr_load_sessions(tmedia_session_mgr_t* self) tsk_size_t i = 0; tmedia_session_t* session; const tmedia_session_plugin_def_t* plugin; - - if(TSK_LIST_IS_EMPTY(self->sessions)){ + +#define has_media(media_type) (tsk_list_find_object_by_pred(self->sessions, __pred_find_session_by_type, &(media_type))) + + if(TSK_LIST_IS_EMPTY(self->sessions) || self->mediaType_changed){ /* for each registered plugin create a session instance */ while((i < TMED_SESSION_MAX_PLUGINS) && (plugin = __tmedia_session_plugins[i++])){ - if((plugin->type & self->type) == plugin->type){ + if((plugin->type & self->type) == plugin->type && !has_media(plugin->type)){ if((session = tmedia_session_create(plugin->type))){ tsk_list_push_back_data(self->sessions, (void**)(&session)); } @@ -1248,6 +1255,7 @@ int _tmedia_session_mgr_load_sessions(tmedia_session_mgr_t* self) /* load params */ _tmedia_session_mgr_apply_params(self); } +#undef has_media return 0; } diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h index e4c4e320..e03ac7d6 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/api/tsip_api_invite.h @@ -61,7 +61,9 @@ typedef enum tsip_invite_event_type_e // tsip_m_early_media, - + tsip_m_updating, // Trying to update from Audio -> Video for example + tsip_m_updated, // succeed to update + /* 3GPP TS 24.610: Communication Hold */ tsip_m_local_hold_ok, tsip_m_local_hold_nok, diff --git a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h index 694c564f..aa9766ba 100644 --- a/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h +++ b/branches/2.0/doubango/tinySIP/include/tinysip/tsip_event.h @@ -62,8 +62,9 @@ tsip_event_type_t; // 8xx ==> success #define tsip_event_code_dialog_request_incoming 800 -#define tsip_event_code_dialog_request_cancelled 801 -#define tsip_event_code_dialog_request_sent 802 +#define tsip_event_code_dialog_request_outgoing 802 +#define tsip_event_code_dialog_request_cancelled 803 +#define tsip_event_code_dialog_request_sent 804 // 9xx ==> Informational #define tsip_event_code_dialog_connecting 900 diff --git a/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c b/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c index a8813c4a..154b2f48 100644 --- a/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c +++ b/branches/2.0/doubango/tinySIP/src/api/tsip_api_invite.c @@ -74,14 +74,18 @@ int tsip_action_INVITE(const tsip_ssession_handle_t *ss, tmedia_type_t type, ... va_start(ap, type); if((action = _tsip_action_create(tsip_atype_invite, &ap))){ + tsk_bool_t new_dialog = tsk_false; /* Media type */ action->media.type = type; if(!(dialog = tsip_dialog_layer_find_by_ss(_ss->stack->layer_dialog, ss))){ dialog = tsip_dialog_layer_new(_ss->stack->layer_dialog, tsip_dialog_INVITE, ss); + new_dialog = tsk_true; } if(!(ret = tsip_dialog_fsm_act(dialog, action->type, tsk_null, action))){ - TSIP_SSESSION(_ss)->media.type = type; // Update Session Media Type + if(new_dialog){ // otherwise we are trying to refresh the media type and the type will be updated if 200 OK + TSIP_SSESSION(_ss)->media.type = type; // Update Session Media Type + } } tsk_object_unref(dialog); diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c index 314f45eb..6e9c5a82 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_invite.c @@ -99,20 +99,21 @@ static int x0000_Connected_2_Connected_X_oDTMF(va_list *app); static int x0000_Connected_2_Connected_X_oLMessage(va_list *app); static int x0000_Connected_2_Connected_X_iACK(va_list *app); static int x0000_Connected_2_Connected_X_iINVITEorUPDATE(va_list *app); +static int x0000_Connected_2_Connected_X_oINVITE(va_list *app); -int x0000_Any_2_Any_X_i1xx(va_list *app); -int x0000_Any_2_Any_X_i401_407_INVITEorUPDATE(va_list *app); -int x0000_Any_2_Any_X_i2xxINVITEorUPDATE(va_list *app); +static int x0000_Any_2_Any_X_i1xx(va_list *app); +static int x0000_Any_2_Any_X_i401_407_INVITEorUPDATE(va_list *app); +static int x0000_Any_2_Any_X_i2xxINVITEorUPDATE(va_list *app); -int x0000_Any_2_Any_X_iPRACK(va_list *app); -int x0000_Any_2_Any_X_iOPTIONS(va_list *app); -int x0000_Any_2_Trying_X_oBYE(va_list *app); /* If not Connected => Cancel will be called instead. See tsip_dialog_hangup() */ -int x0000_Any_2_Terminated_X_iBYE(va_list *app); -int x0000_Any_2_Trying_X_shutdown(va_list *app); +static int x0000_Any_2_Any_X_iPRACK(va_list *app); +static int x0000_Any_2_Any_X_iOPTIONS(va_list *app); +static int x0000_Any_2_Trying_X_oBYE(va_list *app); /* If not Connected => Cancel will be called instead. See tsip_dialog_hangup() */ +static int x0000_Any_2_Terminated_X_iBYE(va_list *app); +static int x0000_Any_2_Trying_X_shutdown(va_list *app); -int x9998_Any_2_Any_X_transportError(va_list *app); -int x9999_Any_2_Any_X_Error(va_list *app); +static int x9998_Any_2_Any_X_transportError(va_list *app); +static int x9999_Any_2_Any_X_Error(va_list *app); /* ======================== conds ======================== */ static tsk_bool_t _fsm_cond_is_resp2INVITE(tsip_dialog_invite_t* self, tsip_message_t* message) @@ -292,7 +293,9 @@ int tsip_dialog_invite_init(tsip_dialog_invite_t *self) TSK_FSM_ADD_ALWAYS(_fsm_state_Connected, _fsm_action_iINVITE, _fsm_state_Connected, x0000_Connected_2_Connected_X_iINVITEorUPDATE, "x0000_Connected_2_Connected_X_iINVITE"), // Connected -> (iUPDATE) -> Connected TSK_FSM_ADD_ALWAYS(_fsm_state_Connected, _fsm_action_iUPDATE, _fsm_state_Connected, x0000_Connected_2_Connected_X_iINVITEorUPDATE, "x0000_Connected_2_Connected_X_iUPDATE"), - + // Connected -> (send reINVITE) -> Connected + TSK_FSM_ADD_ALWAYS(_fsm_state_Connected, _fsm_action_oINVITE, _fsm_state_Connected, x0000_Connected_2_Connected_X_oINVITE, "x0000_Connected_2_Connected_X_oINVITE"), + /*======================= * === BYE/SHUTDOWN === */ @@ -365,6 +368,9 @@ int tsip_dialog_invite_start(tsip_dialog_invite_t *self) int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message_t* message) { tsdp_message_t* sdp_ro = tsk_null; + tmedia_type_t old_media_type; + tmedia_type_t new_media_type; + tsk_bool_t media_session_was_null; int ret = 0; if(!self || !message){ @@ -393,12 +399,14 @@ int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message return 0; } } + + media_session_was_null = (self->msession_mgr == tsk_null); + old_media_type = TSIP_DIALOG_GET_SS(self)->media.type; + new_media_type = sdp_ro ? tmedia_type_from_sdp(sdp_ro) : old_media_type; /* Create session Manager if not already done */ if(!self->msession_mgr){ - if(sdp_ro){ - TSIP_DIALOG_GET_SS(self)->media.type = tmedia_type_from_sdp(sdp_ro); - } + TSIP_DIALOG_GET_SS(self)->media.type = new_media_type; self->msession_mgr = tmedia_session_mgr_create(TSIP_DIALOG_GET_SS(self)->media.type, TSIP_DIALOG_GET_STACK(self)->network.local_ip, TNET_SOCKET_TYPE_IS_IPV6(TSIP_DIALOG_GET_STACK(self)->network.proxy_cscf_type), (sdp_ro == tsk_null)); if(TSIP_DIALOG_GET_STACK(self)->natt.ctx){ @@ -413,6 +421,14 @@ int tsip_dialog_invite_process_ro(tsip_dialog_invite_t *self, const tsip_message } } + // is media update? + if(!media_session_was_null && (old_media_type != new_media_type) && (self->msession_mgr->sdp.lo && self->msession_mgr->sdp.ro)){ + // at this point the media session manager has been succeffuly started and all is ok + TSIP_DIALOG_GET_SS(self)->media.type = new_media_type; + TSIP_DIALOG_INVITE_SIGNAL(self, tsip_m_updated, + TSIP_RESPONSE_CODE(message), TSIP_RESPONSE_PHRASE(message), message); + } + /* start session manager */ if(!self->msession_mgr->started && (self->msession_mgr->sdp.lo && self->msession_mgr->sdp.ro)){ /* Set MSRP Callback */ @@ -552,6 +568,45 @@ int x0000_Connected_2_Connected_X_iINVITEorUPDATE(va_list *app) return ret; } +/* Connected -> (send reINVITE) -> Connected */ +static int x0000_Connected_2_Connected_X_oINVITE(va_list *app) +{ + int ret; + tsk_bool_t mediaType_changed; + tsip_dialog_invite_t *self; + const tsip_action_t* action; + + self = va_arg(*app, tsip_dialog_invite_t *); + va_arg(*app, const tsip_message_t *); + action = va_arg(*app, const tsip_action_t *); + + /* Update current action */ + ret = tsip_dialog_set_curr_action(TSIP_DIALOG(self), action); + + /* Get Media type from the action */ + mediaType_changed = (TSIP_DIALOG_GET_SS(self)->media.type != action->media.type && action->media.type != tmedia_none); + if(self->msession_mgr && mediaType_changed){ + self->msession_mgr->mediaType_changed = tsk_true; + self->msession_mgr->type = action->media.type; + } + + /* Appy media params received from the user */ + if(!TSK_LIST_IS_EMPTY(action->media.params)){ + ret = tmedia_session_mgr_set_3(self->msession_mgr, action->media.params); + } + + /* send the request */ + ret = send_INVITE(self, mediaType_changed); + + /* alert the user */ + if(mediaType_changed){ + TSIP_DIALOG_INVITE_SIGNAL(self, tsip_m_updating, + tsip_event_code_dialog_request_outgoing, "Updating media type", self->last_oInvite); + } + + return ret; +} + /* Any -> (iPRACK) -> Any */ int x0000_Any_2_Any_X_iPRACK(va_list *app) { diff --git a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c index 77cbe12d..10e9d5d8 100644 --- a/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c +++ b/branches/2.0/doubango/tinySIP/src/dialogs/tsip_dialog_layer.c @@ -139,7 +139,7 @@ tsip_dialog_t* tsip_dialog_layer_find(const tsip_dialog_layer_t *self, const cha return ret; } -/** Hangup all dialogs staring by REGISTER */ +/** Hangup all dialogs starting by non-REGISTER */ int tsip_dialog_layer_shutdownAll(tsip_dialog_layer_t *self) { if(self){ @@ -235,7 +235,7 @@ phase3_loop: tsip_dialog_shutdown(dialog, tsk_null); // if "tsip_dialog_shutdown()" remove the dialog, then - // "self->dialogs" will be unsafe + // "self->dialogs" will became unsafe while looping if(!(item = tsk_object_unref(item))){ goto phase3_loop; } diff --git a/branches/2.0/doubango/tinySIP/src/tsip_ssession.c b/branches/2.0/doubango/tinySIP/src/tsip_ssession.c index 64ff90b2..616ebd15 100644 --- a/branches/2.0/doubango/tinySIP/src/tsip_ssession.c +++ b/branches/2.0/doubango/tinySIP/src/tsip_ssession.c @@ -37,6 +37,8 @@ #include "tinysip/dialogs/tsip_dialog_layer.h" #include "tinysip/tsip_message.h" +#include "tinymedia/tmedia_defaults.h" + #include "tsk_debug.h" /**@defgroup tsip_session_group SIP sessions @@ -541,6 +543,7 @@ static tsk_object_t* tsip_ssession_ctor(tsk_object_t * self, va_list * app) // default expires value ss->expires = TSIP_SSESSION_EXPIRES_DEFAULT; // default media values + ss->media.enable_100rel = tmedia_defaults_get_100rel_enabled(); ss->media.type = tmedia_none; ss->media.qos.type = tmedia_qos_stype_none; ss->media.qos.strength = tmedia_qos_strength_none;