跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

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; }

相关文章