linphone源码分析----初始化部分

这几天比较轻松,所以打算好好来看看linphone的代码,源码版本为3.5.2。从linphone初始化的过程开始,首先来看linphone_core_new函数。 
[cpp]  view plain  copy
  1. LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable,  
  2.                         const char *config_path, const char *factory_config_path, void * userdata)  
  3. {  
  4.     LinphoneCore *core=ms_new(LinphoneCore,1);  
  5.     linphone_core_init(core,vtable,config_path, factory_config_path, userdata);  
  6.     return core;  
  7. }  

主要工作基本上在函数linphone_core_init中实现
[plain]  view plain  copy
  1. static void linphone_core_init (LinphoneCore * lc, const LinphoneCoreVTable *vtable, const char *config_path,  
  2.     const char *factory_config_path, void * userdata)  
  3. {  
  4.     memset (lc, 0, sizeof (LinphoneCore));  
  5.     lc->data=userdata;  
  6.     lc->ringstream_autorelease=TRUE;  
  7.   
  8.   
  9.     memcpy(&lc->vtable,vtable,sizeof(LinphoneCoreVTable));  //保存了回调函数表  
  10.   
  11.   
  12.     linphone_core_set_state(lc,LinphoneGlobalStartup,"Starting up");  //设置linphone内部状态  
  13.     ortp_init();  //ortp模块初始化  
  14.     lc->dyn_pt=96;  //负载类型从96开始都是动态负载类型  
  15.     linphone_core_assign_payload_type(lc,&payload_type_pcmu8000,0,NULL);  
  16.     linphone_core_assign_payload_type(lc,&payload_type_gsm,3,NULL);  
  17.     linphone_core_assign_payload_type(lc,&payload_type_pcma8000,8,NULL);  
  18.     linphone_core_assign_payload_type(lc,&payload_type_speex_nb,110,"vbr=on");  
  19.     linphone_core_assign_payload_type(lc,&payload_type_speex_wb,111,"vbr=on");  
  20.     linphone_core_assign_payload_type(lc,&payload_type_speex_uwb,112,"vbr=on");  
  21.     linphone_core_assign_payload_type(lc,&payload_type_telephone_event,101,"0-11");  
  22.     linphone_core_assign_payload_type(lc,&payload_type_g722,9,NULL);  
  23.   
  24.   
  25. #if defined(ANDROID) || defined (__IPHONE_OS_VERSION_MIN_REQUIRED)  
  26.     /*shorten the DNS lookup time and send more retransmissions on mobiles:  
  27.      - to workaround potential packet losses  
  28.      - to avoid hanging for 30 seconds when the network doesn't work despite the phone thinks it does.  
  29.      */  
  30.     _linphone_core_configure_resolver();  
  31. #endif  
  32.   
  33.   
  34. #ifdef ENABLE_NONSTANDARD_GSM  
  35.     {  
  36.         PayloadType *pt;  
  37.         pt=payload_type_clone(&payload_type_gsm);  
  38.         pt->clock_rate=11025;  
  39.         linphone_core_assign_payload_type(lc,pt,-1,NULL);  
  40.         pt->clock_rate=22050;  
  41.         linphone_core_assign_payload_type(lc,pt,-1,NULL);  
  42.         payload_type_destroy(pt);  
  43.     }  
  44. #endif  
  45.   
  46.   
  47. #ifdef VIDEO_ENABLED  
  48.     linphone_core_assign_payload_type(lc,&payload_type_h263,34,NULL);  
  49.     linphone_core_assign_payload_type(lc,&payload_type_theora,97,NULL);  
  50.     linphone_core_assign_payload_type(lc,&payload_type_h263_1998,98,"CIF=1;QCIF=1");  
  51.     linphone_core_assign_payload_type(lc,&payload_type_mp4v,99,"profile-level-id=3");  
  52.     linphone_core_assign_payload_type(lc,&payload_type_h264,102,"profile-level-id=428014");  
  53.     linphone_core_assign_payload_type(lc,&payload_type_vp8,103,NULL);  
  54.     linphone_core_assign_payload_type(lc,&payload_type_x_snow,-1,NULL);  
  55.     /* due to limited space in SDP, we have to disable this h264 line which is normally no more necessary */  
  56.     /* linphone_core_assign_payload_type(&payload_type_h264,-1,"packetization-mode=1;profile-level-id=428014");*/  
  57. #endif  
  58.   
  59.   
  60.     //下面的这些负载类型,没有指定类型号  
  61.     /*add all payload type for which we don't care about the number */  
  62.     linphone_core_assign_payload_type(lc,&payload_type_ilbc,-1,"mode=30");  
  63.     linphone_core_assign_payload_type(lc,&payload_type_amr,-1,"octet-align=1");  
  64.         linphone_core_assign_payload_type(lc,&payload_type_amrwb,-1,"octet-align=1");  
  65.     linphone_core_assign_payload_type(lc,&payload_type_lpc1015,-1,NULL);  
  66.     linphone_core_assign_payload_type(lc,&payload_type_g726_16,-1,NULL);  
  67.     linphone_core_assign_payload_type(lc,&payload_type_g726_24,-1,NULL);  
  68.     linphone_core_assign_payload_type(lc,&payload_type_g726_32,-1,NULL);  
  69.     linphone_core_assign_payload_type(lc,&payload_type_g726_40,-1,NULL);  
  70.     linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_16,-1,NULL);  
  71.     linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_24,-1,NULL);  
  72.     linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_32,-1,NULL);  
  73.     linphone_core_assign_payload_type(lc,&payload_type_aal2_g726_40,-1,NULL);  
  74.     linphone_core_assign_payload_type(lc,&payload_type_silk_nb,-1,NULL);  
  75.     linphone_core_assign_payload_type(lc,&payload_type_silk_mb,-1,NULL);  
  76.     linphone_core_assign_payload_type(lc,&payload_type_silk_wb,-1,NULL);  
  77.     linphone_core_assign_payload_type(lc,&payload_type_silk_swb,-1,NULL);  
  78.     linphone_core_assign_payload_type(lc,&payload_type_g729,18,"annexb=no");  
  79.       
  80.     ms_init();  //初始化mediastreamer模块  
  81.     /* create a mediastreamer2 event queue and set it as global */  
  82.     /* This allows to run event's callback in linphone_core_iterate() */  
  83.     lc->msevq=ms_event_queue_new();  //事件队列,linphone_core_iterate函数中取出事件并调用相应的回调函数  
  84.     ms_set_global_event_queue(lc->msevq);  //队列指针保存到一个全局的变量ms_global_event_queue里  
  85.   
  86.   
  87.     lc->config=lp_config_new(config_path);  //读取配置文件,config保存的是一个ini文档,类似xml文档    
  88.     if (factory_config_path)  //出厂配置文件是只读的,用于恢复出厂配置  
  89.         lp_config_read_file(lc->config,factory_config_path);  
  90.   
  91.   
  92.     lc->sal=sal_init();  //初始化exosip模块,sal是什么的缩写呢?  
  93.     sal_set_user_pointer(lc->sal,lc);  
  94.     sal_set_callbacks(lc->sal,&linphone_sal_callbacks);  //设置sal回调函数  
  95.   
  96.   
  97.     sip_setup_register_all();  //这里将加载所有插件  
  98.     sound_config_read(lc);  //读取音频相关配置  
  99.     net_config_read(lc);  //读取网络相关配置  
  100.     rtp_config_read(lc);  //读取rtp相关配置  
  101.     codecs_config_read(lc);  //读取编码器相关配置  
  102.     sip_config_read(lc);   //读取sip协议相关配置,/* this will start eXosip*/  
  103.     video_config_read(lc); //视频相关配置  
  104.     //autoreplier_config_init(&lc->autoreplier_conf);  
  105.     lc->presence_mode=LinphoneStatusOnline;  //在线、离线,还是其它  
  106.     misc_config_read(lc);  //配置最大历史记录条数等  
  107.     ui_config_read(lc);  //读取联系人(朋友),读取通话记录  
  108. #ifdef TUNNEL_ENABLED  
  109.     lc->tunnel=linphone_core_tunnel_new(lc);  
  110.     if (lc->tunnel) linphone_tunnel_configure(lc->tunnel);  
  111. #endif  
  112.     if (lc->vtable.display_status)  
  113.         lc->vtable.display_status(lc,_("Ready"));  //更新状态  
  114.     lc->auto_net_state_mon=lc->sip_conf.auto_net_state_mon;  
  115.     linphone_core_set_state(lc,LinphoneGlobalOn,"Ready");  //这里将会调用状态改变的回调函数  
  116. }  
上面的代码做了大量的工作,分配负载类型,初始化了各子模块,如ortp、sal(对exosip的封装吧)、mediastream2,加载了所有的插件,最后读取配置文件。

再来看看分配负载类型的函数linphone_core_assign_payload_type的实现
[plain]  view plain  copy
  1. static void linphone_core_assign_payload_type(LinphoneCore *lc, PayloadType *const_pt, int number, const char *recv_fmtp){  
  2.     PayloadType *pt;  
  3.     pt=payload_type_clone(const_pt);  
  4.   
  5.   
  6.     //找一个未分配的负载类型码,分配给本负载类型  
  7.     if (number==-1){  
  8.         /*look for a free number */  
  9.         MSList *elem;  
  10.         int i;  
  11.         for(i=lc->dyn_pt;i<=127;++i){  
  12.             bool_t already_assigned=FALSE;  
  13.             for(elem=lc->payload_types;elem!=NULL;elem=elem->next){  
  14.                 PayloadType *it=(PayloadType*)elem->data;  
  15.                 if (payload_type_get_number(it)==i){  
  16.                     already_assigned=TRUE;  
  17.                     break;  
  18.                 }  
  19.             }  
  20.             if (!already_assigned){  
  21.                 number=i;  
  22.                 lc->dyn_pt=i+1;  
  23.                 break;  
  24.             }  
  25.         }  
  26.         if (number==-1){  
  27.             ms_fatal("FIXME: too many codecs, no more free numbers.");  
  28.         }  
  29.     }  
  30.     ms_message("assigning %s/%i payload type number %i",pt->mime_type,pt->clock_rate,number);  
  31.     payload_type_set_number(pt,number);  
  32.     if (recv_fmtp!=NULL) payload_type_set_recv_fmtp(pt,recv_fmtp);  
  33.     rtp_profile_set_payload(&av_profile,number,pt);  //将负载类型的对应关系保存到全局的RtpProfile结构中  
  34.     lc->payload_types=ms_list_append(lc->payload_types,pt);  //将支持的负载类型添加到链表中  
  35. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值