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