📄 hust_rtpupdate.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 + -