//将视频帧数据publish到p2p客户端
int32_t yang_ipc_rtcrecv_publishVideoData(YangIpcRtcSession* session,YangStreamCapture* data){
int32_t ret=0;
//循环获取pushs中所有PeerConnection
for(int32_t i=0;i<session->pushs.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;
}