//上一篇文章中读到p2p->receive方法最终会调到这个方法中,设置PeerConnection的sdp,并生成answer。
int32_t yang_ipc_rtcrecv_addPeer(YangIpcRtcSession* session,char* sdp,char* answer,char* remoteIp,int32_t localPort,int* phasplay){
int32_t ret = 0;
//创建PeerConnection结构体
YangPeerConnection* sh=(YangPeerConnection*)calloc(sizeof(YangPeerConnection),1);
//重置流配置
memset(&sh->peer.streamconfig,0,sizeof(sh->peer.streamconfig));
//设置userid
sh->peer.streamconfig.uid=session->uidSeq++;
//设置本地端口号
sh->peer.streamconfig.localPort=localPort;
//设置为Server
sh->peer.streamconfig.isServer=1;
//设置流类型为push和play都支持。
sh->peer.streamconfig.streamOptType=Yang_Stream_Both;
//设置客户端ip地址。
strcpy(sh->peer.streamconfig.remoteIp,remoteIp);
//设置ssl上下文和回调方法
sh->peer.streamconfig.sslCallback.context=session;
sh->peer.streamconfig.sslCallback.sslAlert=g_ipc_rtcrecv_sslAlert;
//设置接收流回调的上下文和接收音频、视频、消息的回调。
sh->peer.streamconfig.recvCallback.context=session;
sh->peer.streamconfig.recvCallback.receiveAudio=g_ipc_rtcrecv_receiveAudio;
sh->peer.streamconfig.recvCallback.receiveVideo=g_ipc_rtcrecv_receiveVideo;
sh->peer.streamconfig.recvCallback.receiveMsg=g_ipc_rtcrecv_receiveMsg;
//将session的rtcCallback拷贝到PeerConnection的流配置中。
memcpy(&sh->peer.streamconfig.rtcCallback,&session->rtcCallback,sizeof(YangRtcCallback));
//将avinfo从session拷贝到PeerConnection中。
sh->peer.avinfo=session->avinfo;
//创建PeerConnection
yang_create_peerConnection(sh);
//初始化peer。
sh->init(&sh->peer);
//如果peer已经连接成功,直接返回OK
if (sh->isConnected(&sh->peer)) return Yang_Ok;
//设置远端sdp
ret = sh->setRemoteDescription(&sh->peer,sdp);
//如果本端为sdp发起方,此时收到对端sdp后则sdp交互结束,返回ret
if (ret) return ret;
//如果本端为sdp接收方,则需要获取answer后传回对端,此方法获取本地answer sdp
ret = sh->createHttpAnswer(&sh->peer,answer);
//将peerConnection插入到pushs的数组向量中。
pthread_mutex_lock(&session->mutex);
session->pushs.insert(&session->pushs.vec,sh);
pthread_mutex_unlock(&session->mutex);
//重置videoBuffer的index
if(session->pushs.vec.vsize==1){
yang_reindex2(session->in_videoBuffer);
}
//如果流类型为Both的话,设置phasplay为1
*phasplay=sh->peer.streamconfig.streamOptType==Yang_Stream_Both?1:0;
return Yang_Ok;
}