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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rtcpscheduler.cpp

?? jrtp庫
?? CPP
字號:
/*  This file is a part of JRTPLIB  Copyright (c) 1999-2007 Jori Liesenborgs  Contact: jori.liesenborgs@gmail.com  This library was developed at the "Expertisecentrum Digitale Media"  (http://www.edm.uhasselt.be), a research center of the Hasselt University  (http://www.uhasselt.be). The library is based upon work done for   my thesis at the School for Knowledge Technology (Belgium/The Netherlands).  Permission is hereby granted, free of charge, to any person obtaining a  copy of this software and associated documentation files (the "Software"),  to deal in the Software without restriction, including without limitation  the rights to use, copy, modify, merge, publish, distribute, sublicense,  and/or sell copies of the Software, and to permit persons to whom the  Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included  in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS  IN THE SOFTWARE.*/#include "rtcpscheduler.h"#include "rtpsources.h"#include "rtpdefines.h"#include "rtcppacket.h"#include "rtppacket.h"#include "rtcpcompoundpacket.h"#include "rtpsourcedata.h"#include "rtpdebug.h"#define RTCPSCHED_MININTERVAL						1.0RTCPSchedulerParams::RTCPSchedulerParams() : mininterval(RTCP_DEFAULTMININTERVAL){	bandwidth = 1000; // TODO What is a good value here? 	senderfraction = RTCP_DEFAULTSENDERFRACTION;	usehalfatstartup = RTCP_DEFAULTHALFATSTARTUP;	immediatebye = RTCP_DEFAULTIMMEDIATEBYE;#if (defined(WIN32) || defined(_WIN32_WCE))	timeinit.Dummy();#endif // WIN32 || _WIN32_WCE}RTCPSchedulerParams::~RTCPSchedulerParams(){}int RTCPSchedulerParams::SetRTCPBandwidth(double bw){	if (bw < 0.0)		return ERR_RTP_SCHEDPARAMS_INVALIDBANDWIDTH;	bandwidth = bw;	return 0;}int RTCPSchedulerParams::SetSenderBandwidthFraction(double fraction){	if (fraction < 0.0 || fraction > 1.0)		return ERR_RTP_SCHEDPARAMS_BADFRACTION;	senderfraction = fraction;	return 0;}int RTCPSchedulerParams::SetMinimumTransmissionInterval(const RTPTime &t){	double t2 = t.GetDouble();	if (t2 < RTCPSCHED_MININTERVAL)		return ERR_RTP_SCHEDPARAMS_BADMINIMUMINTERVAL;	mininterval = t;	return 0;}RTCPScheduler::RTCPScheduler(RTPSources &s) : sources(s),nextrtcptime(0,0),prevrtcptime(0,0){	Reset();}RTCPScheduler::~RTCPScheduler(){}void RTCPScheduler::Reset(){	headeroverhead = 0; // user has to set this to an appropriate value	hassentrtcp = false;	firstcall = true;	avgrtcppacksize = 1000; // TODO: what is a good value for this?	byescheduled = false;	sendbyenow = false;}void RTCPScheduler::AnalyseIncoming(RTCPCompoundPacket &rtcpcomppack){	bool isbye = false;	RTCPPacket *p;		rtcpcomppack.GotoFirstPacket();	while (!isbye && ((p = rtcpcomppack.GetNextPacket()) != 0))	{		if (p->GetPacketType() == RTCPPacket::BYE)			isbye = true;	}		if (!isbye)	{		size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();		avgrtcppacksize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgrtcppacksize));	}	else	{		if (byescheduled)		{			size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();			avgbyepacketsize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgbyepacketsize));			byemembers++;		}	}}void RTCPScheduler::AnalyseOutgoing(RTCPCompoundPacket &rtcpcomppack){	bool isbye = false;	RTCPPacket *p;		rtcpcomppack.GotoFirstPacket();	while (!isbye && ((p = rtcpcomppack.GetNextPacket()) != 0))	{		if (p->GetPacketType() == RTCPPacket::BYE)			isbye = true;	}		if (!isbye)	{		size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();		avgrtcppacksize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgrtcppacksize));	}	hassentrtcp = true;}RTPTime RTCPScheduler::GetTransmissionDelay(){	if (firstcall)	{		firstcall = false;		prevrtcptime = RTPTime::CurrentTime();		pmembers = sources.GetActiveMemberCount();		CalculateNextRTCPTime();	}		RTPTime curtime = RTPTime::CurrentTime();	if (curtime > nextrtcptime) // packet should be sent		return RTPTime(0,0);	RTPTime diff = nextrtcptime;	diff -= curtime;		return diff;}bool RTCPScheduler::IsTime(){	if (firstcall)	{		firstcall = false;		prevrtcptime = RTPTime::CurrentTime();		pmembers = sources.GetActiveMemberCount();		CalculateNextRTCPTime();		return false;	}	RTPTime currenttime = RTPTime::CurrentTime();//	// TODO: for debugging//	double diff = nextrtcptime.GetDouble() - currenttime.GetDouble();////	std::cout << "Delay till next RTCP interval: " << diff << std::endl;		if (currenttime < nextrtcptime) // timer has not yet expired		return false;	RTPTime checktime(0,0);		if (!byescheduled)	{		bool aresender = false;		RTPSourceData *srcdat;				if ((srcdat = sources.GetOwnSourceInfo()) != 0)			aresender = srcdat->IsSender();				checktime = CalculateTransmissionInterval(aresender);	}	else		checktime = CalculateBYETransmissionInterval();	//	std::cout << "Calculated checktime: " << checktime.GetDouble() << std::endl;		checktime += prevrtcptime;		if (checktime <= currenttime) // Okay	{		byescheduled = false;		prevrtcptime = currenttime;		pmembers = sources.GetActiveMemberCount();		CalculateNextRTCPTime();		return true;	}//	std::cout << "New delay: " << nextrtcptime.GetDouble() - currenttime.GetDouble() << std::endl;		nextrtcptime = checktime;	pmembers = sources.GetActiveMemberCount();		return false;}void RTCPScheduler::CalculateNextRTCPTime(){	bool aresender = false;	RTPSourceData *srcdat;		if ((srcdat = sources.GetOwnSourceInfo()) != 0)		aresender = srcdat->IsSender();		nextrtcptime = RTPTime::CurrentTime();		nextrtcptime += CalculateTransmissionInterval(aresender);}RTPTime RTCPScheduler::CalculateDeterministicInterval(bool sender /* = false */){	int numsenders = sources.GetSenderCount();	int numtotal = sources.GetActiveMemberCount();//	std::cout << "CalculateDeterministicInterval" << std::endl;//	std::cout << "  numsenders: " << numsenders << std::endl;//	std::cout << "  numtotal: " << numtotal << std::endl;	// Try to avoid division by zero:	if (numtotal == 0)		numtotal++;	double sfraction = ((double)numsenders)/((double)numtotal);	double C,n;	if (sfraction <= schedparams.GetSenderBandwidthFraction())	{		if (sender)		{			C = ((double)avgrtcppacksize)/(schedparams.GetSenderBandwidthFraction()*schedparams.GetRTCPBandwidth());			n = (double)numsenders;		}		else		{			C = ((double)avgrtcppacksize)/((1.0-schedparams.GetSenderBandwidthFraction())*schedparams.GetRTCPBandwidth());			n = (double)(numtotal-numsenders);		}	}	else	{		C = ((double)avgrtcppacksize)/schedparams.GetRTCPBandwidth();		n = (double)numtotal;	}		RTPTime Tmin = schedparams.GetMinimumTransmissionInterval();	double tmin = Tmin.GetDouble();		if (!hassentrtcp && schedparams.GetUseHalfAtStartup())		tmin /= 2.0;	double ntimesC = n*C;	double Td = (tmin>ntimesC)?tmin:ntimesC;	// TODO: for debugging//	std::cout << "  Td: " << Td << std::endl;	return RTPTime(Td);}RTPTime RTCPScheduler::CalculateTransmissionInterval(bool sender){	RTPTime Td = CalculateDeterministicInterval(sender);	double td,mul,T;//	std::cout << "CalculateTransmissionInterval" << std::endl;	td = Td.GetDouble();	mul = rtprand.GetRandomDouble()+0.5; // gives random value between 0.5 and 1.5	T = (td*mul)/1.21828; // see RFC 3550 p 30//	std::cout << "  Td: " << td << std::endl;//	std::cout << "  mul: " << mul << std::endl;//	std::cout << "  T: " << T << std::endl;	return RTPTime(T);}void RTCPScheduler::PerformReverseReconsideration(){	if (firstcall)		return;		double diff1,diff2;	int members = sources.GetActiveMemberCount();		RTPTime tc = RTPTime::CurrentTime();	RTPTime tn_min_tc = nextrtcptime;	if (tn_min_tc > tc)		tn_min_tc -= tc;	else		tn_min_tc = RTPTime(0,0);//	std::cout << "+tn_min_tc0 " << nextrtcptime.GetDouble()-tc.GetDouble() << std::endl;//	std::cout << "-tn_min_tc0 " << -nextrtcptime.GetDouble()+tc.GetDouble() << std::endl;//	std::cout << "tn_min_tc " << tn_min_tc.GetDouble() << std::endl;		RTPTime tc_min_tp = tc;	if (tc_min_tp > prevrtcptime)		tc_min_tp -= prevrtcptime;	else		tc_min_tp = 0;		if (pmembers == 0) // avoid division by zero		pmembers++;		diff1 = (((double)members)/((double)pmembers))*tn_min_tc.GetDouble();	diff2 = (((double)members)/((double)pmembers))*tc_min_tp.GetDouble();	nextrtcptime = tc;	prevrtcptime = tc;	nextrtcptime += RTPTime(diff1);	prevrtcptime -= RTPTime(diff2);		pmembers = members;}void RTCPScheduler::ScheduleBYEPacket(size_t packetsize){	if (byescheduled)		return;		if (firstcall)	{		firstcall = false;		pmembers = sources.GetActiveMemberCount();	}	byescheduled = true;	avgbyepacketsize = packetsize+headeroverhead;	// For now, we will always use the BYE backoff algorithm as described in rfc 3550 p 33		byemembers = 1;	pbyemembers = 1;	if (schedparams.GetRequestImmediateBYE() && sources.GetActiveMemberCount() < 50) // p 34 (top)		sendbyenow = true;	else		sendbyenow = false;		prevrtcptime = RTPTime::CurrentTime();	nextrtcptime = prevrtcptime;	nextrtcptime += CalculateBYETransmissionInterval();}void RTCPScheduler::ActiveMemberDecrease(){	if (sources.GetActiveMemberCount() < pmembers)		PerformReverseReconsideration();}RTPTime RTCPScheduler::CalculateBYETransmissionInterval(){	if (!byescheduled)		return RTPTime(0,0);		if (sendbyenow)		return RTPTime(0,0);		double C,n;	C = ((double)avgbyepacketsize)/((1.0-schedparams.GetSenderBandwidthFraction())*schedparams.GetRTCPBandwidth());	n = (double)byemembers;		RTPTime Tmin = schedparams.GetMinimumTransmissionInterval();	double tmin = Tmin.GetDouble();		if (schedparams.GetUseHalfAtStartup())		tmin /= 2.0;	double ntimesC = n*C;	double Td = (tmin>ntimesC)?tmin:ntimesC;	double mul = rtprand.GetRandomDouble()+0.5; // gives random value between 0.5 and 1.5	double T = (Td*mul)/1.21828; // see RFC 3550 p 30		return RTPTime(T);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区在线视频| 国产精品私房写真福利视频| 午夜在线成人av| 日本伦理一区二区| 亚洲伦在线观看| 在线观看91视频| 亚洲国产成人av网| 欧美一区二区三区免费视频| 老司机精品视频一区二区三区| 日韩精品综合一本久道在线视频| 精品亚洲成a人| 欧美国产精品v| 91麻豆成人久久精品二区三区| 亚洲影视在线播放| 91精品国产乱码久久蜜臀| 精品一区二区三区欧美| 国产精品青草综合久久久久99| 99riav一区二区三区| 亚洲国产综合人成综合网站| 欧美一区二区三区色| 国产精品羞羞答答xxdd| 亚洲欧美一区二区三区极速播放| 欧美日韩一区高清| 精品午夜一区二区三区在线观看| 国产女同性恋一区二区| 欧美在线观看你懂的| 麻豆国产91在线播放| 中文字幕亚洲区| 欧美一区二区三区日韩| 成人免费福利片| 日韩av二区在线播放| 欧美激情综合在线| 欧美视频一区在线观看| 国产一区二区在线免费观看| 亚洲欧美日韩国产另类专区| 日韩视频一区二区| 91视频在线观看| 加勒比av一区二区| 一区二区三区欧美久久| 久久综合九色综合97婷婷| 日本道精品一区二区三区| 久久99久久99精品免视看婷婷 | 国产美女视频91| 国产精品白丝在线| 欧美不卡123| 91欧美一区二区| 国产在线一区二区综合免费视频| 亚洲综合一区二区三区| 国产亚洲欧美中文| 91精品国产全国免费观看| www.日韩大片| 国内外精品视频| 天天色天天爱天天射综合| 亚洲久草在线视频| 中文字幕免费一区| 久久亚洲捆绑美女| 日韩免费看的电影| 欧美剧情片在线观看| 色综合天天综合网天天看片| 国产乱码精品一区二区三区五月婷| 日韩国产欧美在线视频| 亚洲国产精品人人做人人爽| 亚洲欧美自拍偷拍色图| 久久欧美中文字幕| 欧美成人a视频| 日韩欧美一级片| 正在播放一区二区| 欧美老年两性高潮| 欧美午夜不卡在线观看免费| 色婷婷av一区二区三区gif| 国产精品18久久久久久vr| 日韩av电影免费观看高清完整版在线观看| 精品久久一区二区| 欧美日韩国产高清一区| 成人av资源下载| 国产在线不卡一区| 亚洲精品成人少妇| 一个色在线综合| 亚洲三级视频在线观看| 久久久一区二区| www激情久久| 日韩欧美一区中文| 欧美一区二区三区爱爱| 欧美亚洲高清一区| 日本韩国精品在线| 成人av中文字幕| 国产高清不卡一区二区| 国内精品久久久久影院薰衣草| 天天综合色天天| 亚洲成人在线观看视频| 亚洲18色成人| 亚洲国产精品一区二区www| 亚洲午夜三级在线| 婷婷成人综合网| 日韩精品每日更新| 视频一区在线播放| 日本中文一区二区三区| 美女视频黄免费的久久 | 精品少妇一区二区| 日韩欧美综合在线| 精品国产乱码久久久久久夜甘婷婷| 日韩欧美一级二级三级久久久| 日韩西西人体444www| 日韩女优视频免费观看| 日韩精品一区二区三区四区| 欧美r级在线观看| 精品噜噜噜噜久久久久久久久试看| 欧美videossexotv100| 亚洲精品一区二区三区香蕉 | 欧美一激情一区二区三区| 56国语精品自产拍在线观看| 色哦色哦哦色天天综合| 欧美伦理电影网| 日韩精品一区二区三区视频播放| 久久久91精品国产一区二区精品| 国产无一区二区| 亚洲一区二区三区四区在线| 三级在线观看一区二区| 久久国产生活片100| 国产1区2区3区精品美女| 97久久超碰精品国产| 欧美三级电影网站| 欧美videos大乳护士334| 久久精品亚洲乱码伦伦中文| 国产精品家庭影院| 国产精品激情偷乱一区二区∴| 日本一区二区视频在线观看| 亚洲免费高清视频在线| 青青草原综合久久大伊人精品优势| 国产裸体歌舞团一区二区| 国产91综合一区在线观看| 日本高清无吗v一区| 欧美一级片免费看| 国产欧美日产一区| 午夜婷婷国产麻豆精品| 国产精品88888| 欧美区在线观看| 久久看人人爽人人| 亚洲一区二区三区国产| 国产美女在线观看一区| 91黄视频在线| 国产亚洲一区二区在线观看| 亚洲在线成人精品| 捆绑调教美女网站视频一区| 色乱码一区二区三区88| 久久婷婷综合激情| 亚洲成在人线免费| 国产成人午夜电影网| 欧美日韩aaaaaa| 国产精品每日更新在线播放网址 | 欧美自拍丝袜亚洲| 久久尤物电影视频在线观看| 亚洲五码中文字幕| 黄色资源网久久资源365| 不卡一区二区中文字幕| 欧美电影免费观看完整版 | 欧美一卡二卡在线| 亚洲视频在线一区| 极品瑜伽女神91| 欧美久久一二区| 亚洲婷婷综合色高清在线| 视频在线观看一区| 欧美性受xxxx| 一区二区在线观看免费| 国产白丝网站精品污在线入口| 久久品道一品道久久精品| 日本欧美一区二区| 日韩一级片网址| 亚洲一区av在线| 色悠悠亚洲一区二区| 久久免费国产精品| 国产综合色视频| 欧美成人在线直播| 天堂成人国产精品一区| 在线观看免费视频综合| 日韩美女久久久| 91视频在线观看| 亚洲手机成人高清视频| 97久久精品人人做人人爽| 久久久不卡网国产精品二区| 精品亚洲欧美一区| xf在线a精品一区二区视频网站| 国产一区二区三区在线观看免费 | 亚洲免费在线电影| 日本韩国一区二区| 亚洲国产精品天堂| 日韩午夜在线观看| 久久激情五月激情| 国产精品污网站| 国产成人综合视频| 亚洲三级免费电影| 欧美精品久久99| 蜜桃精品视频在线| 欧美国产欧美综合| 成人免费视频免费观看| 亚洲一线二线三线视频| 欧美男人的天堂一二区| 国产美女视频91| 精品美女在线观看| www.日韩大片|