metartc5_jz源码阅读-yang_ipc_rtcrecv_publishVideoData

//将视频帧数据publish到p2p客户端
int32_t yang_ipc_rtcrecv_publishVideoData(YangIpcRtcSession* session,YangStreamCapture* data){
	int32_t ret=0;
	//循环获取pushs中所有PeerConnection
	for(int32_t i=0;ipushs.vec.vsize;i++){
		YangPeerConnection* rtc=session->pushs.vec.payload[i];

		//判断为已连接状态时,从data->context中拿到视频帧,调用on_video方法发送出去。
		if(rtc->isConnected(&rtc->peer)){
			ret = rtc->on_video(&rtc->peer,data->getVideoFrame(data->context));
		}
	}
	return ret;
}
//设置PeerConnection的on_video的实际执行函数为g_yang_pc_onVideo
	peerconn->on_video=g_yang_pc_onVideo;
//当通过rtc发送视频帧给对端时将调用此方法。
int32_t g_yang_pc_onVideo(YangPeer* peer,YangFrame* videoFrame){
	//容错判断
	if(peer==NULL||peer->conn==NULL||videoFrame==NULL) return  ERROR_RTC_PEERCONNECTION;
	//拿到RtcConnection,调用它的on_video方法。
	YangRtcConnection *session = (YangRtcConnection*) peer->conn;
	return  session->on_video(session->session,videoFrame);
}
//设置RtcConnection的on_video实际执行函数为yang_rtcconn_onVideo
	conn->on_video=yang_rtcconn_onVideo;
//调用此方法将视频帧p通过session发送给rtc的对端。
int32_t yang_rtcconn_onVideo(YangRtcSession *session, YangFrame *p) {

	//如果session为空或者dtls的状态不为Done,则直接return。
	if (session==NULL||session->context.dtls->session.state!=YangDtlsStateClientDone)	
		return Yang_Ok;

	//dtls状态为Done后走到这里。当帧类型为spspps,则发送meta data。
	if (p->frametype == YANG_Frametype_Spspps)
		return yang_rtcconn_send_video_meta(session, p);

	//如果pushH264不为空时,则调用pushH264的on_video方法。
	if (session->pushH264)
		return session->pushH264->on_video(session, session->pushH264->push, p);

	//如果pushH265不为空时,则调用pushH265的on_video方法,一般H264和h265只会有一个if成立。
	if (session->pushH265)
		return session->pushH265->on_video(session, session->pushH265->push, p);
	return Yang_Ok;
}

你可能感兴趣的:(metartc5_jz源码阅读,实时音视频,音视频,p2p,c语言)