metartc5_jz源码阅读-yang_rtcconn_receive

void yang_rtcconn_receive(YangRtcSession *session, char *data, int32_t size) {
	//如果session为空或者session不在活跃状态,直接返回。
	if (session==NULL||!session->activeState)	return;

	//从data中拿出第一个字节数据。
	uint8_t bt=(uint8_t)data[0];

	//设置lastStunTime为当前系统时间。
	session->lastStunTime=yang_get_system_time();
	//根据第一个字节数据判断时rtp和rtcp数据
	if(bt > 127 && bt < 192 && size>12){
		//从data中取出第二个字节数据。
		bt=(uint8_t)data[1];
		//判断是否是rtcp
		if (bt>= 192 && bt <= 223) {//rtcp
			//是rtcp则调用yang_rtcconn_on_rtcp方法处理rtcp数据。
			yang_rtcconn_on_rtcp(session, data, size);
			return;
		}
		//走到这里说明是rtp
		session->startRecv = 1;
		//如果play不为空,则调用play去处理rtp数据。
		if (session->play)	session->play->on_rtp(&session->context, session->play->playStream,data, size);
		return;
	}
	//走到if里边说明是stun的数据
	if(size>0&&(bt==0x00||bt==0x01)){
		int32_t err = 0;
		if(session->isServer){
			//如果当前p2p为server,则调用stun的decode解析数据到request中
			YangStunPacket request;
			memset(&request,0,sizeof(YangStunPacket));
			if ((err = session->ice.session.stun.decode(&request,data, size)) != Yang_Ok) {
				yang_error("decode stun packet failed");
				return;
			}

			//调用createResponseStunPacket方法创建response的stun包。
			if ((err =session->ice.session.stun.createResponseStunPacket(&request,session)) != Yang_Ok) {
				yang_error("create response stun packet failed");
				return;
			}
			if(!session->context.state)	session->context.state=1;

		}else{
			//如果当前p2p是客户端,则调用stun的decode2进行解码。
			if ((err = session->ice.session.stun.decode2(data, size)) != Yang_Ok) {
				yang_error("decode stun packet failed");
				return;
			}

#if Yang_Enable_Dtls
			//通过dtls发起握手操作。
			if (!session->isSendDtls) {
				if (session->context.dtls->startHandShake(&session->context.dtls->session)) yang_error("dtls start handshake failed!");
				session->isSendDtls = 1;
			}
#endif
		}

		return;
	}

	//走到if里边说明是dtls的数据
		if (bt > 19 && bt < 64) {
			//如果dtls为空,则直接返回
			if(session->context.dtls==NULL) return;

			//调用dtls的processData处理数据
			if (session->context.dtls->processData(session->datachannel,&session->context.dtls->session, data,size) == Yang_Ok && session->context.state ==0) {
				if(session->isServer){
					//如果当前是p2p的服务端,则判断握手完成后,将state置为1
					if(session->context.dtls->session.handshake_done) session->context.state = 1;
					//开启timer,一秒执行一次,去处理rtcp
					yang_rtcconn_startTimers(session);
					return;
				}else if (session->context.dtls->session.state == YangDtlsStateClientDone) {
					//如果是p2p的客户端,并且ClientDone,则跳转client_sucess
					goto client_sucess;
				}
			}
		}

	client_sucess:
	//开启timer,一秒执行一次,去处理rtcp
	yang_rtcconn_startTimers(session);
	//将state置为1
	session->context.state = 1;

	//如果sendRequest函数指针不为空,则调用sendRequest回调上层Connected
	if (session->context.streamConfig&&session->context.streamConfig->rtcCallback.sendRequest)
		session->context.streamConfig->rtcCallback.sendRequest(session->context.streamConfig->rtcCallback.context,session->context.streamConfig->uid, 0,Yang_Req_Connected);
	return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王方帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值