相关数据结构
1. tsip_dialog_invite_t
描述:
一个invite_dialog代表了一个invite期间的所有的信令流程,因此,它首先是一个普遍的dialog的特殊化结构,在该结构的起始部分,有一个TSIP_DECLARE_DIALOG声明,该声明展开后是一个tsip_dilog_t __dialog字段的定义,这是一种在C中一个具化对象对通用对象的继承机制,tsip_dialog_t对象代表了更通用的实例,而tsip_dialog_invite_t对象则是tsip_dialog_t对象的具化和拓展。
一个dialog本身有自己的有限状态处理机,有自己的当前状态和当前状态应执行的动作,还有一个状态变化时的回调函数。它还需要有一个字段指向它所属的session,这些字段,反应在数据类型上上,分别是:
tsk_fsm_t(有限状态机),tsip_action_t(状态执行动作),tsip_dialog_state_t(当前状态),
tsip_dialog_event_callback_f(回调函数),tsip_ssession_t(所属session)。
创建时机:
tsip_action_INVITE()函数是上层应用与底层协议栈的接口,当上层应用发起一个INVITE时,便会分层调用到该接口。
tsip_dialog_invite_t类型的实例便是在该接口中创建的,对于创建时,还需要在协议栈的全局dialog队列中寻找一遍,看是否相关的dialog已经在之前被创建,若是,则沿用老的实例,若否,则用tsip_dialog_layer_new()函数创建一个新的实例,并链入到协议栈dialog_layer层的全局队列中。
关键点:
2. tmedia_session_mgr_t
描述:
一个tmedia_session_mgr_t实例是由上述的tsip_dialog_invite_t实例的session_mgr字段记录的,代表了在一个对话期间各种媒体设置的管理者。
当发起一个INVITE时,首先必须存在一个代表信令流程的对象即dialog对象,其次,还要有一个负责管理媒体信息的对象,及该结构的实例。
创建时机:
该结构的首次创建是在invite_dialog的状态转换过程中,c0000_Started_2_Outgoing_X_oINVITE()函数是一个状态转化函数,它代表着当前dialog由初始状态向发起INVITE后状态转化需要执行的操作,在该函数内部,通过tmedia_session_mgr_create()创建tmedia_session_mgr_t实例,然后填写本地媒体信息(即sdp中得各个字段),申请rtp端口号,生成代表rtp的网络传输实例(tnet_transport_t对象),最后在该状态转换函数中,通过协议栈的代表信令的网络传输实例将INVITE消息传递出去。
关键点:
在tmedia_session_mgr_t中,有一个