www.pudn.com > RTP通用开发库(for Linux).rar > rtcpsr.c
/*------------------------------------------------------------------------- * rtcpsr.c - rtcpsr *------------------------------------------------------------------------- */ #include#include #include /*------------------------------------------------------------------------ * rtcpsr - process an incoming RTCP sender report *------------------------------------------------------------------------ */ int rtcpsr(struct session *psn, struct rtcp *prtcp) { struct sr *psr; struct stream *pstm; ssrc_t ssrc; if (prtcp->rtcp_type != RTCP_SR) return ERROR; psr = (struct sr *) prtcp->rtcp_data; ssrc = ntohl(psr->sr_ssrc); pstm = rtpgetstream(psn, ssrc); if (pstm == NULL) if ((pstm = rtpnewstream(psn, ssrc)) == NULL) return ERROR; if (!RTP_INACTIVE(pstm->stm_inactive)) pstm->stm_inactive = 0; else { rtpreleasestream(psn, pstm); return OK; } /* * Record data needed to generate receiver report. */ pthread_mutex_lock(&pstm->stm_mutex); clock_gettime(CLOCK_REALTIME, &pstm->stm_lastsr); pstm->stm_lastsrts = ntohl(psr->sr_rtpts); pstm->stm_lastntp[RTP_NTPFRAC] = ntohl(psr->sr_fracts); pstm->stm_lastntp[RTP_NTPINT] = ntohl(psr->sr_intts); pthread_mutex_unlock(&pstm->stm_mutex); /* * Post an event with the sender report as data. */ rtppostevent(psn, EVENT_RTCP_SR, pstm->stm_ssrc, (char *) prtcp, RTCP_LENGTH_BYTE(prtcp)); rtpreleasestream(psn, pstm); return OK; }