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;
}
metartc5_jz源码阅读-yang_rtcconn_receive
最新推荐文章于 2024-09-16 17:44:00 发布