?? hust_rtpupdate.c
字號:
/*------------------------------------------------------------------------- * rtpupdate.c - rtpupdate, rtpinitseq, rtpupdateseq *------------------------------------------------------------------------- */#include "hust_rtp.h"#include "hust_util.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 + -