⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hust_rtpupdate.c

📁 实现基于ip2022的MPEG2 TS的IP组播接收
💻 C
字号:
/*------------------------------------------------------------------------- * rtpupdate.c - rtpupdate, rtpinitseq, rtpupdateseq *------------------------------------------------------------------------- */#include "hust_rtp.h"#include "hust_util.h"#include "hust_event.h"#include "hust_linux.h"#include "hust_hash.h"///#include <time.h>#define DEBUG(x) x/*------------------------------------------------------------------------ * rtpupdate - update statistics with each RTP packet received.  *------------------------------------------------------------------------ */intrtpupdate(struct session *psn, struct stream *pstm, struct rtp *header){	u32_t		now;	s32_t		delta;	s32_t		D;	////if (pthread_mutex_lock(&pstm->stm_mutex) != 0)	///	return ERROR;	if (rtpupdateseq(psn, pstm, header->rtp_seq) == ERROR) {		////pthread_mutex_unlock(&pstm->stm_mutex);		return ERROR;	}	now=timer_get_ticks();	/*	 * Check for encoding change.	 * Post event if detected.	 */	if (pstm->stm_payload != header->rtp_payload) {		pstm->stm_payload = header->rtp_payload;		rtppostevent(psn, EVENT_PARTICIPANT_ENCODING, pstm->stm_ssrc, NULL, 0);	}  ////检查编码(载荷类型payload)的变化,并发出事件通知	/*	 * If not first packet, update jitter.	 */	if (pstm->stm_packets != 0) {		if (pstm->stm_clkrt != 0) {			delta = timeflatten(timesub(now, pstm->stm_lastrec), pstm->stm_clkrt);			D = delta - (header->rtp_time - pstm->stm_lastts);			D = (D < 0 ? -D : D);			pstm->stm_jitter += ((double) D - pstm->stm_jitter) / (double) 16;		}	}	///刷新时间抖动  	pstm->stm_packets++;	pstm->stm_inactive = 0;	pstm->stm_lastts = header->rtp_time;	pstm->stm_lastrec = now;	////pthread_mutex_unlock(&pstm->stm_mutex);	return OK;}////收到一个包后刷新统计信息/*------------------------------------------------------------------------ * rtpinitseq - initialize variables related to sequence numbers * Adapted from RFC 1889. *------------------------------------------------------------------------ */voidrtpinitseq(struct stream *pstm, seq_t seq){	pstm->stm_firstseq = seq;	pstm->stm_hiseq = seq;	pstm->stm_roll = 0;	pstm->stm_packets = 0;	pstm->stm_recprior = 0;	pstm->stm_expprior = 0;  }/*------------------------------------------------------------------------ * rtpupdateseq - check sequence number of incoming packet and update * appropriate counters. Adapted from RFC 1889. *------------------------------------------------------------------------ */intrtpupdateseq(struct session *psn, struct stream *pstm, seq_t seq)////sep是接收到的rtp包的sequence////pstm是根据接收的rtp包的源标识位查询或创建的stream的指针{	seq_t udelta;	udelta = seq - pstm->stm_hiseq;////计算接收到的包的序列号与所收到的包的最大的序列号的差  	if (pstm->stm_probation) {		/////如果还在检查期(由stm_probation标识)		if (seq == pstm->stm_hiseq + 1) {			////如果收到序列号连续的包			pstm->stm_probation--;////检查期标识减一						pstm->stm_hiseq = seq;///刷新流中的最高序列号记录						if (pstm->stm_probation == 0) {				///过了检查期则为这个流初始化queue				rtpinitseq(pstm, seq);				return OK;			}		} else {			pstm->stm_probation = RTP_MINSEQUENTIAL - 1;			pstm->stm_hiseq = seq;			////连续的包中断,重新设置检查期长度,并把这个包设的序列号			////设置成队列中最大的		}		return ERROR;	} 	else if (udelta < RTP_MAXDROPOUT) {			////限制seq的跳跃不超过RTP_MAXDROPOUT			if (seq < pstm->stm_hiseq)				pstm->stm_roll++;			////表明进入了下一个周期			pstm->stm_hiseq = seq;			///刷新stm_hiseq		}	else if (udelta <= RTP_SEQMOD - RTP_MAXMISORDER) {				////如果跳跃太大,要根据stm_badseq来确定是否需要重新				////初始化队列				if (seq == pstm->stm_badseq) {					rtpinitseq(pstm, seq);					rtppostevent(psn, EVENT_PARTICIPANT_SEQGAP,						     pstm->stm_ssrc, NULL, 0);				}			}	else {				pstm->stm_badseq = (seq + 1) & (RTP_SEQMOD - 1);				////跳跃超出范围,存当前的seq为stm_badseq				return ERROR;			}					return OK;}////通过seq来确定是否让一个stream度过检查期,并解决序列号前////后跳跃过大的情况。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -