本来流程顺序上面做了排版(函数内部的流程,加了tab缩进的)方便理解, 但是发表之后,还是乱了。
流程顺序基本理清了,可以复制到notepad++,手动加下缩进吧。
主流程是序号 1、2、...
函数内部流程,简单点的标“=>”表示下,复杂的就安装节序号标了。
入口在linphonecall.c中,linphone_call_init_media_streams(call),函数内部包含三个函数:
void linphone_call_init_media_streams(LinphoneCall *call){ linphone_call_init_audio_stream(call); linphone_call_init_video_stream(call); linphone_call_init_text_stream(call); }
A、 linphone_call_init_audio_stream(call) 音频流的初始化
1、char* rtcp_tool = linphone_core_get_user_agent(lc)
=>sal_get_user_agent(lc->sal),定义在sal.h,实现在sal_impl.c中;
=>belle_sip_header_user_agent_get_products_as_string(sal->user_agent, char[] user_agent,254),实现在belle_sip_headers_impl.c中;
=>list* list = user_agent->produtcts,
遍历list,将list->data的数据存在char[] user_agent中,并返回user_agent。
2、if call->audiostream !=null , call有问题,return;
3、if (call->sessions[call->main_audio_stream_index].rtp_session = null )
{
3.1、SalMulticastRole multicast_role = linphone_call_get_multicast_role(call,SalStreamType:SalAudio) :明确我发在通话中的角色(字面理解)
=> 检查call->op是否构建。
SalMediaDescription remotedesc = sal_call_get_remote_media_description(call->op),实现在sal_op_call.c中
=> return SalOp->base.remote_media;
SalMediaDescription localdesc = call->localdesc;
如果localDesc和remotedesc都不存在,且call的dir是outgoing,
继续判断, 如果外面的入参SalStreamType是SalAudio,且call->params->audio_multicast_enable 为true
则multicast_role 为SalMulticastSender;
else 如果localldesc存在,且(remotedesc不存在 或 sal_call_is_offerer(call->op)为true),感觉像是别人发起的call,且sdp_offering为ture
其中的sal_call_is_offerer 只是return call->op->sdp_offering;
找到本地支持的最优媒体流,stream_desc = sal_media_description_find_best_stream(localdesc,type)实现在sal.c中;
else 如果remotedesc存在,但sal_call_is_offerer(call->op)为false;
3.2、找到对方支持的最优媒体流,stream_desc = sal_media_description_find_best_stream(remotedesc, type); <==else结束
3.3、如果stream_desc存在,从它里面获取multicast_role;
3.4、外部继续做了remotedesc = sal_call_get_remote_media_description(call->op);
3.5、如果remotedesc存在,从中获取最优流媒体配置 :stream_desc = sal_media_description_find_best_stream(remotedesc, SalAudio);
3.6、初始化call的音频流属性call->audiostream=audiostream=audio_stream_new2() ,定义在mediastream.h,实现在audiostream.c
call->audiostream=audiostream=audio_stream_new2(lc->factory,linphone_call_get_bind_ip_for_stream(call,call->main_audio_stream_index),