metartc5_jz源码阅读-yang_ipc_rtcrecv_addPeer

2024-01-01 04:26:32
//上一篇文章中读到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;
}

文章来源:https://blog.csdn.net/fsmpeg/article/details/135311170
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。