亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? hust_rtcpcycle_qiu_5.20.c

?? 實(shí)現(xiàn)基于ip2022的MPEG2 TS的IP組播接收
?? C
字號:
/*------------------------------------------------------------------------- * rtcpcycle.c - rtcpcycle, rtcpcycleupdate *------------------------------------------------------------------------- */#include <ipOS.h>#include <ipHAL.h>#include <ipStack.h>#include <ipEthernet.h>#include "hust_rtp.h"#include "hust_rtplibcommon.h"#include "hust_rtcp.h"#include "hust_event.h"#include "hust_hash.h"#include "hust_util.h"///#include <time.h>///#include <util.h>///#include <rtp.h>///#include <hash.h>///#include <rtcp.h>///#include <unistd.h>///#include <stdlib.h>/*------------------------------------------------------------------------ * rtcpcycle - do cyclic update on streams and genereate receiver reports. * Rtcycle returns seconds to wait until next rtcpcycle. *------------------------------------------------------------------------ */doublertcpcycle(struct session *psn){	struct rtcp         *prtcp, *ppacket;	struct rr           *prr;	struct rblock       *prb;	int                 i, count, packets, bytes, active;	int                 streamcount;	ssrc_t              *sources;	struct stream       **pstreams;	/*	 * Get pointers to pre-allocated (in rtpopen) memory.	 */	////sources = psn->sn_cyclesources;	sources=(ssrc_t*)heap_alloc(sizeof(ssrc_t)*RTCP_RRMAXRBLOCKS);	pstreams = (struct stream **) sources;	/* 	 * Get list of sources in session.	 */	streamcount = rtpsources(psn, sources, RTCP_RRMAXRBLOCKS);	if (streamcount <= 0)		return rtcpinterval(1, 0,				    psn->sn_bw * RTCP_BWFRAC, FALSE, 				    0, &psn->sn_avgrtcp, FALSE);  	/*	 * Iterate over SSRC list. Lookup each stream and	 * determins if stream was active in previous RTCP	 * cycle.	 */	for (i = 0, active = 0; i < streamcount; i++) {		/*		 * Hold on to the 32-bit pointers that will be returned		 * by rtpgetstream in the space previously used by the		 * 32-bit SSRC ID. The pointer is needed to release the		 * stream structure later by calling rtpreleasestream.		 */		pstreams[i] = rtpgetstream(psn, sources[i]);		if (pstreams[i] == NULL)			continue;		if (!RTP_INACTIVE(pstreams[i]->stm_inactive) && RTP_DATASEEN(pstreams[i])) {			active++;			/*			 * Mark this stream for rblock generation.			 */			pstreams[i]->stm_mark = TRUE;		}	}	/*	 * Determine how many RTCP packets (within a compund packet	 * must be sent. Each RTCP receiver report packet can hold only	 * 31 reveiver report blocks (rblocks).	 */	packets = active / RTCP_MAXRBLOCKS + ((active % RTCP_MAXRBLOCKS) != 0);	bytes = active * sizeof(struct rblock) + packets * (RTCP_HEADERSZ + sizeof(ssrc_t));	////ppacket = (struct rtcp *) psn->sn_cyclebuf;	ppacket=(struct rtcp*)heap_alloc(packets*(sizeof(struct rr)+sizeof(struct rtcp))+active*sizeof(struct rblock));	prtcp = ppacket;	prr = (struct rr *) prtcp->rtcp_data;	prb = (struct rblock *) prr->rr_rb;	/*	 * Iterate over the list of streams again, calling 	 * rtcpcycleupdate on each to update its statistics	 * and generate an rblock if the streams stm_mark	 * flag is set.	 */	for (i = 0, count = 0; i < streamcount; i++) {		if (pstreams[i] == NULL)			continue;		if (rtcpcycleupdate(psn, pstreams[i], prb) == FALSE) 			continue;		count++;		prb++;          		if (count == RTCP_MAXRBLOCKS || i + 1 == streamcount) {  			/* 			 * An RTCP receiver report can only hold 31 report blocks.			 * When the maximum is reached *or* the last source in 			 * the list of SSRCs is processed, generate an RTCP header.			 */			rtcpheader(prtcp, count, RTCP_RR, sizeof(struct rblock) * count + RTCP_HEADERSZ + sizeof(ssrc_t));			///prtcp->rtcp_length = htons(prtcp->rtcp_length);			///prr->rr_ssrc = htonl(psn->sn_ssrc);      			/*			 * If there are streams remaining in the list,			 * advance the pointers to the next rtcp packet.			 */			if (i + 1 != streamcount) {				prtcp = (struct rtcp *) (prb + 1);				prr = (struct rr *) prtcp->rtcp_data;				prb = (struct rblock *) prr->rr_rb;				count = 0;			}		}	}  	/*	 * Send the compound RTCP packet.	 */////	rtcpsend(psn, ppacket, bytes);	rtcpsend(psn,ppacket,bytes);	/* 	 * Release all the streams.	 */	for (i = 0; i < streamcount; i++) 		if (pstreams[i] != NULL)			rtpreleasestream(psn, pstreams[i]);	/*	 * Return the number of seconds to wait before invoking	 * rtcpcycle again.	 */	return rtcpinterval(streamcount + 1, active, psn->sn_bw * RTCP_BWFRAC, FALSE, bytes + 28, &psn->sn_avgrtcp, FALSE);}/*------------------------------------------------------------------------ * rtcpcycleupdate - update stream stats and generate an rblock if * requested. Rtcpcycleupdate returns TRUE if an rblock is generated. *------------------------------------------------------------------------ */boolrtcpcycleupdate(struct session *psn, struct stream *pstm, struct rblock *prb){	int	        exthiseq, cumexpected, lostcycle, expcycle, reccycle;	int		cumlost;	u32_t	now;///	pthread_mutex_lock(&pstm->stm_mutex);	/* 	 * Determine if the participant has timed out.	 */	if (RTP_DATASEEN(pstm) == FALSE && !RTP_INACTIVE(pstm->stm_inactive))		if (++pstm->stm_inactive >= pstm->stm_inactthresh &&		    pstm->stm_inactthresh != RTP_INFINITEINACTIVETHRESH) {			pstm->stm_inactive = RTP_TIMEDOUT;///			pthread_mutex_unlock(&pstm->stm_mutex);			rtpstreamcleanup(psn, pstm);			rtppostevent(psn, EVENT_PARTICIPANT_TIMEOUT, pstm->stm_ssrc, NULL, 0);			return FALSE;		}	/*	 * Update statistics that must be updated once per 	 * RTCP cycle.	 */	exthiseq = (pstm->stm_roll << 16) | pstm->stm_hiseq;	/////擴(kuò)展的最大序列號	cumexpected = exthiseq - pstm->stm_firstseq + 1;	/////期望收到的包數(shù)	cumlost = cumexpected - pstm->stm_packets;	///丟失的包數(shù)  	/*	 * If the stream is marked for rblock generation	 * write the rblock in the area pointed to by prb.	 */	if (pstm->stm_mark == TRUE && prb != NULL) {///		prb->rb_ssrc = htonl(pstm->stm_ssrc);///		prb->rb_hiseq = htonl(exthiseq);///		prb->rb_jitter = htonl((unsigned int) pstm->stm_jitter);		prb->rb_ssrc = pstm->stm_ssrc;		prb->rb_hiseq =exthiseq;		prb->rb_jitter =(unsigned long int) pstm->stm_jitter;		/*		 * Cap cumlost to appropriate max/min values for 		 * a 24-bit signed integer.		 */////		prb->rb_cumlost = hton24(max(min(cumexpected - (int) pstm->stm_packets, 0x7fffff), -(1 << 23)));		prb->rb_cumlost = min(cumlost, 0x7fffff);		expcycle = cumexpected - pstm->stm_expprior;		reccycle = pstm->stm_packets - pstm->stm_recprior;		lostcycle = max(expcycle - reccycle, 0);		prb->rb_fraclost = (expcycle == 0 ? 0 : (lostcycle << 8) / expcycle);    		/*		 * Extract middle 32 bits of last sender		 * report NTP timestamp.		 *////		prb->rb_lastsrts = htonl(((pstm->stm_lastntp[1] & 0x0000ffff) << 16) |///					 ((pstm->stm_lastntp[0] & 0xffff0000) >> 16));		prb->rb_lastsrts =((pstm->stm_lastntp[1] & 0x0000ffff) << 16)|((pstm->stm_lastntp[0] & 0xffff0000) >> 16);		/*		 * Compute the delay since last sender		 * report, if one has been received.		 */		if (pstm->stm_lastsr!= 0) {			now=timer_get_ticks();///			prb->rb_delay = htonl(timeflatten(timesub(now, pstm->stm_lastsr), 65536));			prb->rb_delay = timeflatten((now-pstm->stm_lastsr),65536);//////時間的最小精度由time_init設(shè)定,這里不是標(biāo)準(zhǔn)的做法			//////標(biāo)準(zhǔn):delay的單位為1/65536秒		}    	}	pstm->stm_expprior = cumexpected;	pstm->stm_recprior = pstm->stm_packets;///	pthread_mutex_unlock(&pstm->stm_mutex);	if (pstm->stm_mark == TRUE) {		pstm->stm_mark = FALSE;		return TRUE;	}	else		return FALSE;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99视频国产精品| 亚洲小少妇裸体bbw| 亚洲欧洲性图库| 亚洲一区二区四区蜜桃| 日本在线不卡一区| 国产一区二区三区精品欧美日韩一区二区三区| 国产99久久精品| 欧美综合色免费| 337p日本欧洲亚洲大胆精品 | 美女诱惑一区二区| 国产成人在线观看| 日本韩国欧美一区| 欧美精品一区二区三区高清aⅴ| 一区视频在线播放| 蜜臀av在线播放一区二区三区| jvid福利写真一区二区三区| 91精品国产色综合久久ai换脸| 国产精品久久久久四虎| 蜜桃精品在线观看| 91电影在线观看| 久久久精品黄色| 91麻豆精品国产综合久久久久久 | 日韩影视精彩在线| 粉嫩aⅴ一区二区三区四区| 欧美三级韩国三级日本三斤| 中文字幕av不卡| 日本在线不卡视频一二三区| 91免费看片在线观看| 精品国产免费人成电影在线观看四季| 一区二区三区精密机械公司| 国产.欧美.日韩| 日韩一区二区精品在线观看| 亚洲日本韩国一区| 国产精品亚洲午夜一区二区三区 | 天堂在线一区二区| 91免费看片在线观看| 久久精品亚洲国产奇米99| 奇米色一区二区| 欧美综合一区二区三区| 亚洲欧洲一区二区在线播放| 国产一区二区精品久久| 91麻豆精品国产91久久久资源速度 | 亚洲一区二区三区四区在线观看| 国产91在线观看| 精品久久久久久久久久久久久久久久久 | 国产一区二区在线影院| 3atv一区二区三区| 夜夜爽夜夜爽精品视频| 97se亚洲国产综合在线| 日韩和欧美的一区| 91国偷自产一区二区三区成为亚洲经典| 久久亚洲综合色一区二区三区 | 欧美不卡在线视频| 偷拍自拍另类欧美| 欧美亚洲尤物久久| 亚洲欧美日韩中文播放| 丁香婷婷综合激情五月色| 久久夜色精品国产噜噜av| 免费成人美女在线观看.| 欧美人牲a欧美精品| 依依成人综合视频| 91蜜桃视频在线| 亚洲欧美在线aaa| 成年人国产精品| 中文字幕一区二区三区蜜月| 成人黄色免费短视频| 中文一区二区完整视频在线观看| 国产一区二区三区精品视频| 欧美精品一区二区在线播放| 久久99精品国产麻豆婷婷| 欧美xxxx在线观看| 国内国产精品久久| 久久久电影一区二区三区| 国产福利一区二区三区视频 | 波多野结衣中文字幕一区| 欧美经典三级视频一区二区三区| 国产成人啪免费观看软件| 国产女同性恋一区二区| 国产成人精品免费网站| 久久超碰97中文字幕| 欧美精品一区二| 福利视频网站一区二区三区| 中文字幕一区二区三中文字幕| 97aⅴ精品视频一二三区| 成人欧美一区二区三区视频网页| 在线中文字幕一区| 丝袜a∨在线一区二区三区不卡| 欧美一级理论性理论a| 国产一区二区精品久久99| 国产精品三级电影| 91精品91久久久中77777| 亚洲国产欧美一区二区三区丁香婷| 6080yy午夜一二三区久久| 九色综合狠狠综合久久| 国产欧美日韩三级| 一本久道中文字幕精品亚洲嫩| 亚洲第一会所有码转帖| 欧美成人a在线| 播五月开心婷婷综合| 亚洲午夜一区二区| 精品卡一卡二卡三卡四在线| www.久久久久久久久| 一区二区三区日本| 精品国产一区二区国模嫣然| 成人高清在线视频| 亚洲国产视频一区| 精品电影一区二区三区 | 一区二区三区资源| 欧美一二三区在线| 不卡的av电影| 日本欧美韩国一区三区| 国产日韩欧美高清| 在线免费不卡电影| 国内精品久久久久影院色| 亚洲女子a中天字幕| 日韩亚洲欧美高清| 成人国产精品视频| 亚洲一区二区欧美日韩| 久久久久综合网| 在线观看亚洲专区| 精品一区二区影视| 一区二区高清免费观看影视大全| 欧美一区二区精美| 91免费国产视频网站| 久久99国产精品成人| 国产一区二区三区免费| 一区二区三区四区乱视频| 欧美videos大乳护士334| 色琪琪一区二区三区亚洲区| 久久爱www久久做| 一区二区不卡在线播放| 久久久久久麻豆| 欧美欧美午夜aⅴ在线观看| 国产v日产∨综合v精品视频| 日韩电影在线免费| 亚洲另类一区二区| 国产亚洲综合在线| 欧美一区二区三区色| 色综合久久久久综合99| 激情综合网最新| 日韩—二三区免费观看av| 亚洲欧美aⅴ...| 中国色在线观看另类| 日韩天堂在线观看| 欧美日韩一区成人| 97se亚洲国产综合在线| 国产成人在线视频免费播放| 日韩电影在线免费| 亚洲国产aⅴ天堂久久| 亚洲丝袜精品丝袜在线| 久久精品亚洲精品国产欧美kt∨| 91精品国产综合久久久久久| 欧洲亚洲精品在线| av亚洲精华国产精华精| 国产精品中文字幕一区二区三区| 婷婷一区二区三区| 夜夜嗨av一区二区三区中文字幕| 国产精品免费久久| 国产亚洲一区字幕| 久久久久久久综合日本| 精品黑人一区二区三区久久| 91精品国产色综合久久不卡电影 | 五月天激情综合网| 樱花草国产18久久久久| 亚洲欧美一区二区三区极速播放| 国产精品女同一区二区三区| 国产午夜精品一区二区 | av成人动漫在线观看| 国产精品69毛片高清亚洲| 精品一区二区三区香蕉蜜桃| 免费观看成人av| 免费欧美日韩国产三级电影| 波多野结衣视频一区| 国产精品69久久久久水密桃| 精品一区精品二区高清| 国内精品久久久久影院薰衣草| 久久福利资源站| 久久不见久久见免费视频1| 精品一区二区三区在线观看国产| 九色|91porny| 国产乱码精品一品二品| 国产精品一区二区在线观看不卡| 国产麻豆91精品| 福利电影一区二区三区| 99久久免费视频.com| 91丨porny丨国产入口| 色老综合老女人久久久| 色域天天综合网| 欧美日韩一级视频| 日韩情涩欧美日韩视频| 久久综合五月天婷婷伊人| 国产日韩av一区| 日韩美女久久久| 午夜精品一区在线观看| 日本欧美加勒比视频| 国产乱码精品1区2区3区| 成人av网址在线观看| 色久优优欧美色久优优| 欧美日韩美少妇| 精品少妇一区二区三区免费观看 |