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

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

?? rtcppacketbuilder.cpp

?? Real Transport 流媒體編程資料
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*  This file is a part of JRTPLIB  Copyright (c) 1999-2006 Jori Liesenborgs  Contact: jori@lumumba.uhasselt.be  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 "rtcppacketbuilder.h"#include "rtpsources.h"#include "rtppacketbuilder.h"#include "rtcpscheduler.h"#include "rtpsourcedata.h"#include "rtcpcompoundpacketbuilder.h"#include "rtpdebug.h"RTCPPacketBuilder::RTCPPacketBuilder(RTPSources &s,RTPPacketBuilder &pb)	: sources(s),rtppacketbuilder(pb),prevbuildtime(0,0),transmissiondelay(0,0){	init = false;#if (defined(WIN32) || defined(_WIN32_WCE))	timeinit.Dummy();#endif // WIN32 || _WIN32_WCE}RTCPPacketBuilder::~RTCPPacketBuilder(){	Destroy();}int RTCPPacketBuilder::Init(size_t maxpacksize,double tsunit,const void *cname,size_t cnamelen){	if (init)		return ERR_RTP_RTCPPACKETBUILDER_ALREADYINIT;	if (maxpacksize < RTP_MINPACKETSIZE)		return ERR_RTP_RTCPPACKETBUILDER_ILLEGALMAXPACKSIZE;	if (tsunit < 0.0)		return ERR_RTP_RTCPPACKETBUILDER_ILLEGALTIMESTAMPUNIT;	if (cnamelen>255)		cnamelen = 255;		maxpacketsize = maxpacksize;	timestampunit = tsunit;		int status;		if ((status = ownsdesinfo.SetCNAME((const uint8_t *)cname,cnamelen)) < 0)		return status;		ClearAllSourceFlags();		interval_name = -1;	interval_email = -1;	interval_location = -1;	interval_phone = -1;	interval_tool = -1;	interval_note = -1;	sdesbuildcount = 0;	transmissiondelay = RTPTime(0,0);	firstpacket = true;	processingsdes = false;	init = true;	return 0;}void RTCPPacketBuilder::Destroy(){	if (!init)		return;	ownsdesinfo.Clear();	init = false;}int RTCPPacketBuilder::BuildNextPacket(RTCPCompoundPacket **pack){	if (!init)		return ERR_RTP_RTCPPACKETBUILDER_NOTINIT;	RTCPCompoundPacketBuilder *rtcpcomppack;	int status;	bool sender = false;	RTPSourceData *srcdat;		*pack = 0;		rtcpcomppack = new RTCPCompoundPacketBuilder();	if (rtcpcomppack == 0)		return ERR_RTP_OUTOFMEM;		if ((status = rtcpcomppack->InitBuild(maxpacketsize)) < 0)	{		delete rtcpcomppack;		return status;	}		if ((srcdat = sources.GetOwnSourceInfo()) != 0)	{		if (srcdat->IsSender())			sender = true;	}		uint32_t ssrc = rtppacketbuilder.GetSSRC();	RTPTime curtime = RTPTime::CurrentTime();	if (sender)	{		RTPTime rtppacktime = rtppacketbuilder.GetPacketTime();		uint32_t rtppacktimestamp = rtppacketbuilder.GetPacketTimestamp();		uint32_t packcount = rtppacketbuilder.GetPacketCount();		uint32_t octetcount = rtppacketbuilder.GetPayloadOctetCount();		RTPTime diff = curtime;		diff -= rtppacktime;		diff += transmissiondelay; // the sample being sampled at this very instant will need a larger timestamp				uint32_t tsdiff = (uint32_t)((diff.GetDouble()/timestampunit)+0.5);		uint32_t rtptimestamp = rtppacktimestamp+tsdiff;		RTPNTPTime ntptimestamp = curtime.GetNTPTime();		if ((status = rtcpcomppack->StartSenderReport(ssrc,ntptimestamp,rtptimestamp,packcount,octetcount)) < 0)		{			delete rtcpcomppack;			if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)				return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;			return status;		}	}	else	{		if ((status = rtcpcomppack->StartReceiverReport(ssrc)) < 0)		{			delete rtcpcomppack;			if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)				return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;			return status;		}	}	uint8_t *owncname;	size_t owncnamelen;	owncname = ownsdesinfo.GetCNAME(&owncnamelen);	if ((status = rtcpcomppack->AddSDESSource(ssrc)) < 0)	{		delete rtcpcomppack;		if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)			return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;		return status;	}	if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::CNAME,owncname,owncnamelen)) < 0)	{		delete rtcpcomppack;		if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)			return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;		return status;	}	if (!processingsdes)	{		int added,skipped;		bool full,atendoflist;		if ((status = FillInReportBlocks(rtcpcomppack,curtime,sources.GetTotalCount(),&full,&added,&skipped,&atendoflist)) < 0)		{			delete rtcpcomppack;			return status;		}				if (full && added == 0)		{			delete rtcpcomppack;			return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;		}			if (!full)		{			processingsdes = true;			sdesbuildcount++;						ClearAllSourceFlags();				doname = false;			doemail = false;			doloc = false;			dophone = false;			dotool = false;			donote = false;			if (interval_name > 0 && ((sdesbuildcount%interval_name) == 0)) doname = true;			if (interval_email > 0 && ((sdesbuildcount%interval_email) == 0)) doemail = true;			if (interval_location > 0 && ((sdesbuildcount%interval_location) == 0)) doloc = true;			if (interval_phone > 0 && ((sdesbuildcount%interval_phone) == 0)) dophone = true;			if (interval_tool > 0 && ((sdesbuildcount%interval_tool) == 0)) dotool = true;			if (interval_note > 0 && ((sdesbuildcount%interval_note) == 0)) donote = true;						bool processedall;			int itemcount;						if ((status = FillInSDES(rtcpcomppack,&full,&processedall,&itemcount)) < 0)			{				delete rtcpcomppack;				return status;			}			if (processedall)			{				processingsdes = false;				ClearAllSDESFlags();				if (!full && skipped > 0) 				{					// if the packet isn't full and we skipped some				        // sources that we already got in a previous packet,					// we can add some of them now										bool atendoflist;					 					if ((status = FillInReportBlocks(rtcpcomppack,curtime,skipped,&full,&added,&skipped,&atendoflist)) < 0)					{						delete rtcpcomppack;						return status;					}				}			}		}	}	else // previous sdes processing wasn't finished	{		bool processedall;		int itemcount;		bool full;					if ((status = FillInSDES(rtcpcomppack,&full,&processedall,&itemcount)) < 0)		{			delete rtcpcomppack;			return status;		}		if (itemcount == 0) // Big problem: packet size is too small to let any progress happen		{			delete rtcpcomppack;			return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;		}		if (processedall)		{			processingsdes = false;			ClearAllSDESFlags();			if (!full) 			{				// if the packet isn't full and we skipped some				// we can add some report blocks								int added,skipped;				bool atendoflist;				if ((status = FillInReportBlocks(rtcpcomppack,curtime,sources.GetTotalCount(),&full,&added,&skipped,&atendoflist)) < 0)				{					delete rtcpcomppack;					return status;				}				if (atendoflist) // filled in all possible sources					ClearAllSourceFlags();			}		}	}			if ((status = rtcpcomppack->EndBuild()) < 0)	{		delete rtcpcomppack;		return status;	}	*pack = rtcpcomppack;	firstpacket = false;	prevbuildtime = curtime;	return 0;}void RTCPPacketBuilder::ClearAllSourceFlags(){	if (sources.GotoFirstSource())	{		do		{			RTPSourceData *srcdat = sources.GetCurrentSourceInfo();			srcdat->SetProcessedInRTCP(false);		} while (sources.GotoNextSource());	}}int RTCPPacketBuilder::FillInReportBlocks(RTCPCompoundPacketBuilder *rtcpcomppack,const RTPTime &curtime,int maxcount,bool *full,int *added,int *skipped,bool *atendoflist){	RTPSourceData *srcdat;	int addedcount = 0;	int skippedcount = 0;	bool done = false;	bool filled = false;	bool atend = false;	int status;	if (sources.GotoFirstSource())	{		do		{			bool shouldprocess = false;						srcdat = sources.GetCurrentSourceInfo();			if (!srcdat->IsOwnSSRC()) // don't send to ourselves			{				if (!srcdat->IsCSRC()) // p 35: no reports should go to CSRCs				{					if (srcdat->INF_HasSentData()) // if this isn't true, INF_GetLastRTPPacketTime() won't make any sense					{						if (firstpacket)							shouldprocess = true;						else						{							// p 35: only if rtp packets were received since the last RTP packet, a report block							// should be added														RTPTime lastrtptime = srcdat->INF_GetLastRTPPacketTime();														if (lastrtptime > prevbuildtime)								shouldprocess = true;						}					}				}			}			if (shouldprocess)			{				if (srcdat->IsProcessedInRTCP()) // already covered this one				{					skippedcount++;				}				else				{					uint32_t rr_ssrc = srcdat->GetSSRC();					uint32_t num = srcdat->INF_GetNumPacketsReceivedInInterval();					uint32_t prevseq = srcdat->INF_GetSavedExtendedSequenceNumber();					uint32_t curseq = srcdat->INF_GetExtendedHighestSequenceNumber();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩片之四级片| 国产欧美日韩久久| 成人毛片老司机大片| 亚洲五码中文字幕| 久久久亚洲午夜电影| 欧美日本一道本| 不卡视频在线看| 久久精品国产精品亚洲精品| 亚洲日本在线视频观看| 久久精品一区四区| 欧美片网站yy| 在线观看不卡一区| 成人激情小说网站| 精品制服美女丁香| 日韩黄色免费电影| 亚洲午夜久久久久中文字幕久| 久久欧美一区二区| 日韩视频免费观看高清完整版在线观看 | 国产精品高潮呻吟久久| 欧美成人一区二区三区在线观看 | 久久青草国产手机看片福利盒子 | 麻豆一区二区三区| 亚洲一区二区高清| 亚洲视频资源在线| 国产免费观看久久| 久久嫩草精品久久久精品| 欧美一级专区免费大片| 欧美猛男超大videosgay| 99国产精品久久久久| 国产a精品视频| 国产一区二区三区香蕉| 麻豆精品在线播放| 日韩国产精品大片| 日韩高清不卡一区| 日韩精品亚洲一区二区三区免费| 亚洲精品成人在线| 亚洲综合在线电影| 亚洲另类在线视频| 爽好久久久欧美精品| 国内精品久久久久影院薰衣草 | 国产毛片精品国产一区二区三区| 日本午夜精品一区二区三区电影| 午夜欧美视频在线观看| 亚洲成人综合视频| 天天操天天色综合| 日本美女视频一区二区| 另类小说欧美激情| 狠狠v欧美v日韩v亚洲ⅴ| 久久电影网站中文字幕| 精东粉嫩av免费一区二区三区| 精品在线观看免费| 韩国v欧美v日本v亚洲v| 国产成人av电影在线观看| 东方aⅴ免费观看久久av| 成人av在线电影| 一本色道久久综合亚洲aⅴ蜜桃| 色老头久久综合| 91精品在线观看入口| 欧美一区二区高清| 久久精品日产第一区二区三区高清版| 久久免费精品国产久精品久久久久| 欧美激情资源网| 亚洲精品国产无天堂网2021| 又紧又大又爽精品一区二区| 亚洲一区二区三区美女| 裸体一区二区三区| 国产精品自产自拍| 91久久精品国产91性色tv| 制服丝袜亚洲色图| 精品国产乱码久久久久久免费| 欧美韩日一区二区三区四区| 伊人色综合久久天天| 日韩专区欧美专区| 国产高清无密码一区二区三区| 99久久久精品| 日韩你懂的电影在线观看| 国产欧美久久久精品影院| 亚洲影院理伦片| 激情综合网激情| 色综合咪咪久久| 日韩精品一区二区在线| 1区2区3区国产精品| 日本麻豆一区二区三区视频| 成人av资源下载| 91麻豆精品国产91久久久| 国产日韩高清在线| 无码av免费一区二区三区试看| 国产麻豆视频精品| 欧洲一区在线观看| 久久久国产精品不卡| 亚洲一区二区三区视频在线播放 | 久久99精品网久久| 色视频成人在线观看免| 久久男人中文字幕资源站| 亚洲成a天堂v人片| 99精品欧美一区二区三区小说 | 成人高清视频在线| 欧美一区二区精品| 亚洲一区二区三区在线| 国产成人8x视频一区二区| 欧美日本韩国一区| 亚洲婷婷综合色高清在线| 黄页视频在线91| 欧美精品免费视频| 亚洲欧美日韩成人高清在线一区| 激情综合亚洲精品| 欧美高清性hdvideosex| 亚洲欧美日韩一区二区| 国产乱码精品一区二区三 | 久久久久88色偷偷免费| 亚洲高清免费观看高清完整版在线观看 | 专区另类欧美日韩| 粉嫩高潮美女一区二区三区| 欧美不卡一二三| 日本成人在线视频网站| 在线精品视频一区二区| 日韩美女久久久| 成人av免费网站| 久久久久国产精品人| 麻豆91精品91久久久的内涵| 欧美高清视频www夜色资源网| 亚洲精品成人在线| 日本道精品一区二区三区| 国产精品国产三级国产aⅴ原创| 极品少妇xxxx精品少妇偷拍| 欧美一级爆毛片| 日韩国产欧美在线播放| 91麻豆精品国产自产在线| 亚洲一级片在线观看| 欧美综合一区二区| 亚洲综合一区在线| 欧美日韩中文精品| 亚洲成人午夜影院| 欧美日韩一本到| 性感美女极品91精品| 欧美日韩视频在线一区二区 | 午夜国产精品影院在线观看| 欧美性一区二区| 同产精品九九九| 3d动漫精品啪啪1区2区免费 | 95精品视频在线| 亚洲裸体在线观看| 欧美亚洲日本国产| 丝瓜av网站精品一区二区| 欧美二区三区91| 男男视频亚洲欧美| 精品精品国产高清一毛片一天堂| 精品一二三四在线| 国产三级久久久| av亚洲精华国产精华精华| 亚洲欧美激情一区二区| 欧美日本一区二区三区四区| 日本不卡免费在线视频| 欧美精品一区二区三区蜜桃视频| 国产精品1区二区.| 亚洲婷婷综合色高清在线| 欧美日韩成人激情| 精品亚洲国产成人av制服丝袜 | 青青草国产成人av片免费| 欧美刺激午夜性久久久久久久 | 91免费国产在线观看| 亚洲午夜免费福利视频| 精品日韩一区二区| 成人教育av在线| 调教+趴+乳夹+国产+精品| 欧美xxxxxxxx| av在线不卡免费看| 丝袜美腿亚洲一区| 国产欧美精品在线观看| 在线日韩av片| 国精品**一区二区三区在线蜜桃| 国产精品免费aⅴ片在线观看| 欧美色精品在线视频| 国产经典欧美精品| 樱花影视一区二区| 欧美成人激情免费网| 99re这里都是精品| 日韩电影一区二区三区| 国产精品国产精品国产专区不片| 欧美老肥妇做.爰bbww视频| 国产精品中文欧美| 婷婷开心久久网| 亚洲欧洲av另类| 日韩色在线观看| 91久久香蕉国产日韩欧美9色| 久久99国产精品麻豆| 一区二区三区四区在线免费观看| 日韩精品一区二区三区蜜臀| 91一区二区在线| 狠狠久久亚洲欧美| 亚洲午夜免费福利视频| 日本一区二区视频在线| 91精品免费在线| 色嗨嗨av一区二区三区| 国产一区二区三区不卡在线观看| 亚洲宅男天堂在线观看无病毒| 久久久久久**毛片大全| 91麻豆精品国产自产在线| 色视频成人在线观看免| 高清不卡一二三区|