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

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

?? rtpsources.cpp

?? jrtp庫
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/*  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 "rtpsources.h"#include "rtperrors.h"#include "rtprawpacket.h"#include "rtpinternalsourcedata.h"#include "rtptimeutilities.h"#include "rtpdefines.h"#include "rtcpcompoundpacket.h"#include "rtcppacket.h"#include "rtcpapppacket.h"#include "rtcpbyepacket.h"#include "rtcpsdespacket.h"#include "rtcpsrpacket.h"#include "rtcprrpacket.h"#include "rtptransmitter.h"#ifdef RTPDEBUG	#include <iostream>#endif // RTPDEBUG#include "rtpdebug.h"RTPSources::RTPSources(ProbationType probtype,RTPMemoryManager *mgr) : RTPMemoryObject(mgr),sourcelist(mgr,RTPMEM_TYPE_CLASS_SOURCETABLEHASHELEMENT){	totalcount = 0;	sendercount = 0;	activecount = 0;	owndata = 0;#ifdef RTP_SUPPORT_PROBATION	probationtype = probtype;#endif // RTP_SUPPORT_PROBATION}RTPSources::~RTPSources(){	Clear();}void RTPSources::Clear(){	ClearSourceList();}void RTPSources::ClearSourceList(){	sourcelist.GotoFirstElement();	while (sourcelist.HasCurrentElement())	{		RTPInternalSourceData *sourcedata;		sourcedata = sourcelist.GetCurrentElement();		RTPDelete(sourcedata,GetMemoryManager());		sourcelist.GotoNextElement();	}	sourcelist.Clear();	owndata = 0;	totalcount = 0;	sendercount = 0;	activecount = 0;}int RTPSources::CreateOwnSSRC(uint32_t ssrc){	if (owndata != 0)		return ERR_RTP_SOURCES_ALREADYHAVEOWNSSRC;	if (GotEntry(ssrc))		return ERR_RTP_SOURCES_SSRCEXISTS;	int status;	bool created;		status = ObtainSourceDataInstance(ssrc,&owndata,&created);	if (status < 0)	{		owndata = 0; // just to make sure		return status;	}	owndata->SetOwnSSRC();		owndata->SetRTPDataAddress(0);	owndata->SetRTCPDataAddress(0);	// we've created a validated ssrc, so we should increase activecount	activecount++;	OnNewSource(owndata);	return 0;}int RTPSources::DeleteOwnSSRC(){	if (owndata == 0)		return ERR_RTP_SOURCES_DONTHAVEOWNSSRC;	uint32_t ssrc = owndata->GetSSRC();	sourcelist.GotoElement(ssrc);	sourcelist.DeleteCurrentElement();	totalcount--;	if (owndata->IsSender())		sendercount--;	if (owndata->IsActive())		activecount--;	OnRemoveSource(owndata);		RTPDelete(owndata,GetMemoryManager());	owndata = 0;	return 0;}void RTPSources::SentRTPPacket(){	if (owndata == 0)		return;	bool prevsender = owndata->IsSender();		owndata->SentRTPPacket();	if (!prevsender && owndata->IsSender())		sendercount++;}int RTPSources::ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *rtptrans,bool acceptownpackets){	RTPTransmitter *transmitters[1];	int num;		transmitters[0] = rtptrans;	if (rtptrans == 0)		num = 0;	else		num = 1;	return ProcessRawPacket(rawpack,transmitters,num,acceptownpackets);}int RTPSources::ProcessRawPacket(RTPRawPacket *rawpack,RTPTransmitter *rtptrans[],int numtrans,bool acceptownpackets){	int status;		if (rawpack->IsRTP()) // RTP packet	{		RTPPacket *rtppack;				// First, we'll see if the packet can be parsed		rtppack = RTPNew(GetMemoryManager(),RTPMEM_TYPE_CLASS_RTPPACKET) RTPPacket(*rawpack,GetMemoryManager());		if (rtppack == 0)			return ERR_RTP_OUTOFMEM;		if ((status = rtppack->GetCreationError()) < 0)		{			if (status == ERR_RTP_PACKET_INVALIDPACKET)			{				RTPDelete(rtppack,GetMemoryManager());				rtppack = 0;			}			else			{				RTPDelete(rtppack,GetMemoryManager());				return status;			}		}						// Check if the packet was valid		if (rtppack != 0)		{			bool stored = false;			bool ownpacket = false;			int i;			const RTPAddress *senderaddress = rawpack->GetSenderAddress();			for (i = 0 ; !ownpacket && i < numtrans ; i++)			{				if (rtptrans[i]->ComesFromThisTransmitter(senderaddress))					ownpacket = true;			}						// Check if the packet is our own.			if (ownpacket)			{				// Now it depends on the user's preference				// what to do with this packet:				if (acceptownpackets)				{					// sender addres for own packets has to be NULL!					if ((status = ProcessRTPPacket(rtppack,rawpack->GetReceiveTime(),0,&stored)) < 0)					{						if (!stored)							RTPDelete(rtppack,GetMemoryManager());						return status;					}				}			}			else 			{				if ((status = ProcessRTPPacket(rtppack,rawpack->GetReceiveTime(),senderaddress,&stored)) < 0)				{					if (!stored)						RTPDelete(rtppack,GetMemoryManager());					return status;				}			}			if (!stored)				RTPDelete(rtppack,GetMemoryManager());		}	}	else // RTCP packet	{		RTCPCompoundPacket rtcpcomppack(*rawpack,GetMemoryManager());		bool valid = false;				if ((status = rtcpcomppack.GetCreationError()) < 0)		{			if (status != ERR_RTP_RTCPCOMPOUND_INVALIDPACKET)				return status;		}		else			valid = true;		if (valid)		{			bool ownpacket = false;			int i;			const RTPAddress *senderaddress = rawpack->GetSenderAddress();			for (i = 0 ; !ownpacket && i < numtrans ; i++)			{				if (rtptrans[i]->ComesFromThisTransmitter(senderaddress))					ownpacket = true;			}			// First check if it's a packet of this session.			if (ownpacket)			{				if (acceptownpackets)				{					// sender address for own packets has to be NULL					status = ProcessRTCPCompoundPacket(&rtcpcomppack,rawpack->GetReceiveTime(),0);					if (status < 0)						return status;				}			}			else // not our own packet			{				status = ProcessRTCPCompoundPacket(&rtcpcomppack,rawpack->GetReceiveTime(),rawpack->GetSenderAddress());				if (status < 0)					return status;			}		}	}		return 0;}int RTPSources::ProcessRTPPacket(RTPPacket *rtppack,const RTPTime &receivetime,const RTPAddress *senderaddress,bool *stored){	uint32_t ssrc;	RTPInternalSourceData *srcdat;	int status;	bool created;	OnRTPPacket(rtppack,receivetime,senderaddress);	*stored = false;		ssrc = rtppack->GetSSRC();	if ((status = ObtainSourceDataInstance(ssrc,&srcdat,&created)) < 0)		return status;	if (created)	{		if ((status = srcdat->SetRTPDataAddress(senderaddress)) < 0)			return status;	}	else // got a previously existing source	{		if (CheckCollision(srcdat,senderaddress,true))			return 0; // ignore packet on collision	}		bool prevsender = srcdat->IsSender();	bool prevactive = srcdat->IsActive();		// The packet comes from a valid source, we can process it further now	// The following function should delete rtppack itself if something goes	// wrong	if ((status = srcdat->ProcessRTPPacket(rtppack,receivetime,stored)) < 0)		return status;	if (!prevsender && srcdat->IsSender())		sendercount++;	if (!prevactive && srcdat->IsActive())		activecount++;	if (created)		OnNewSource(srcdat);	if (srcdat->IsValidated()) // process the CSRCs	{		RTPInternalSourceData *csrcdat;		bool createdcsrc;		int num = rtppack->GetCSRCCount();		int i;		for (i = 0 ; i < num ; i++)		{			if ((status = ObtainSourceDataInstance(rtppack->GetCSRC(i),&csrcdat,&createdcsrc)) < 0)				return status;			if (createdcsrc)			{				csrcdat->SetCSRC();				if (csrcdat->IsActive())					activecount++;				OnNewSource(csrcdat);			}			else // already found an entry, possibly because of RTCP data			{				if (!CheckCollision(csrcdat,senderaddress,true))					csrcdat->SetCSRC();			}		}	}		return 0;}int RTPSources::ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcomppack,const RTPTime &receivetime,const RTPAddress *senderaddress){	RTCPPacket *rtcppack;	int status;	bool gotownssrc = ((owndata == 0)?false:true);	uint32_t ownssrc = ((owndata != 0)?owndata->GetSSRC():0);		OnRTCPCompoundPacket(rtcpcomppack,receivetime,senderaddress);		rtcpcomppack->GotoFirstPacket();		while ((rtcppack = rtcpcomppack->GetNextPacket()) != 0)	{		if (rtcppack->IsKnownFormat())		{			switch (rtcppack->GetPacketType())			{			case RTCPPacket::SR:				{					RTCPSRPacket *p = (RTCPSRPacket *)rtcppack;					uint32_t senderssrc = p->GetSenderSSRC();										status = ProcessRTCPSenderInfo(senderssrc,p->GetNTPTimestamp(),p->GetRTPTimestamp(),						                       p->GetSenderPacketCount(),p->GetSenderOctetCount(),								       receivetime,senderaddress);					if (status < 0)						return status;										bool gotinfo = false;					if (gotownssrc)					{						int i;						int num = p->GetReceptionReportCount();						for (i = 0 ; i < num ; i++)						{							if (p->GetSSRC(i) == ownssrc) // data is meant for us							{								gotinfo = true;								status = ProcessRTCPReportBlock(senderssrc,p->GetFractionLost(i),p->GetLostPacketCount(i),										                        p->GetExtendedHighestSequenceNumber(i),p->GetJitter(i),p->GetLSR(i),													p->GetDLSR(i),receivetime,senderaddress);								if (status < 0)									return status;							}						}					}					if (!gotinfo)					{						status = UpdateReceiveTime(senderssrc,receivetime,senderaddress);						if (status < 0)							return status;					}				}				break;			case RTCPPacket::RR:				{					RTCPRRPacket *p = (RTCPRRPacket *)rtcppack;					uint32_t senderssrc = p->GetSenderSSRC();										bool gotinfo = false;					if (gotownssrc)					{						int i;						int num = p->GetReceptionReportCount();						for (i = 0 ; i < num ; i++)						{							if (p->GetSSRC(i) == ownssrc)							{								gotinfo = true;								status = ProcessRTCPReportBlock(senderssrc,p->GetFractionLost(i),p->GetLostPacketCount(i),										                        p->GetExtendedHighestSequenceNumber(i),p->GetJitter(i),p->GetLSR(i),													p->GetDLSR(i),receivetime,senderaddress);								if (status < 0)									return status;							}						}					}					if (!gotinfo)					{						status = UpdateReceiveTime(senderssrc,receivetime,senderaddress);						if (status < 0)							return status;					}				}				break;			case RTCPPacket::SDES:				{					RTCPSDESPacket *p = (RTCPSDESPacket *)rtcppack;										if (p->GotoFirstChunk())					{						do						{							uint32_t sdesssrc = p->GetChunkSSRC();							bool updated = false;							if (p->GotoFirstItem())							{								do								{									RTCPSDESPacket::ItemType t;													if ((t = p->GetItemType()) != RTCPSDESPacket::PRIV)									{										updated = true;										status = ProcessSDESNormalItem(sdesssrc,t,p->GetItemLength(),p->GetItemData(),receivetime,senderaddress);										if (status < 0)											return status;									}#ifdef RTP_SUPPORT_SDESPRIV									else									{										updated = true;										status = ProcessSDESPrivateItem(sdesssrc,p->GetPRIVPrefixLength(),p->GetPRIVPrefixData(),p->GetPRIVValueLength(),

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本久久电影网| 中文字幕第一区| 久久亚洲影视婷婷| 国产精品久久二区二区| 国产精品二三区| 亚洲一区二区精品久久av| 日韩不卡手机在线v区| 久久精品国产第一区二区三区| 久久精品噜噜噜成人88aⅴ| 26uuu国产一区二区三区| 成人午夜私人影院| 不卡免费追剧大全电视剧网站| 99这里都是精品| 538在线一区二区精品国产| 国产亚洲欧美日韩日本| 亚洲午夜视频在线观看| 精品一区二区三区久久久| 97久久人人超碰| 欧美成人欧美edvon| 亚洲视频一区在线| 国产精品白丝jk黑袜喷水| 99久久综合狠狠综合久久| 制服.丝袜.亚洲.另类.中文 | 国产精品系列在线| 视频一区视频二区中文字幕| 成人免费电影视频| 日韩女优电影在线观看| 一二三区精品视频| 国产成人免费视频一区| 欧美一区二区三区电影| 亚洲综合在线视频| a级高清视频欧美日韩| 久久欧美一区二区| 麻豆精品新av中文字幕| 欧美日韩中文字幕精品| 亚洲欧美日韩久久| 高清成人免费视频| 国产欧美久久久精品影院| 国产中文一区二区三区| 91精品婷婷国产综合久久性色 | 97久久精品人人做人人爽| 久久无码av三级| 国产一区二区久久| 精品av久久707| 国产黄色91视频| 国产无人区一区二区三区| 国产精品一区二区无线| 久久精品视频一区二区| 国产成人一级电影| 欧美激情自拍偷拍| 99久久99久久久精品齐齐| 中文字幕日本不卡| 欧美色图在线观看| 日韩国产在线一| 欧美成人一区二区三区片免费 | 日本高清视频一区二区| 亚洲欧洲av在线| 欧美日韩免费视频| 蜜臀a∨国产成人精品| 亚洲精品一区二区精华| 国产宾馆实践打屁股91| 亚洲综合色网站| 精品国产一区二区精华| 国产成人aaaa| 香蕉成人伊视频在线观看| 欧美mv日韩mv国产网站app| 成人av网站免费| 天天操天天色综合| 国产偷国产偷亚洲高清人白洁| 色一情一乱一乱一91av| 激情综合色播五月| 亚洲在线中文字幕| 久久综合九色欧美综合狠狠| 色综合色狠狠综合色| 日韩精品欧美精品| 椎名由奈av一区二区三区| 9191国产精品| 色综合天天狠狠| 狠狠狠色丁香婷婷综合激情 | 欧美二区乱c少妇| 成+人+亚洲+综合天堂| 国产欧美一区二区在线| 日韩黄色在线观看| 亚洲精品一区二区三区99| 色噜噜狠狠色综合欧洲selulu| 日本在线不卡视频一二三区| 亚洲蜜臀av乱码久久精品| 久久色中文字幕| 欧美成人猛片aaaaaaa| 欧美日韩在线综合| 一本到三区不卡视频| 成人av集中营| 99精品黄色片免费大全| 国产丶欧美丶日本不卡视频| 麻豆91在线观看| 日韩av在线发布| 午夜精品久久久久| 亚洲va欧美va天堂v国产综合| 亚洲精品国产精华液| 国产精品传媒视频| 中文字幕一区二区三区精华液| 国产欧美日韩精品在线| 欧美国产日韩精品免费观看| 国产亚洲欧美在线| 国产精品女主播在线观看| 国产免费成人在线视频| 亚洲欧洲精品一区二区精品久久久| 日本一区二区三区国色天香| 欧美韩国日本综合| 亚洲麻豆国产自偷在线| 亚洲午夜一区二区| 久久精品国产精品亚洲红杏| 国产毛片精品视频| 成人精品一区二区三区中文字幕| 成人听书哪个软件好| 色老头久久综合| 在线电影一区二区三区| 久久综合五月天婷婷伊人| 国产精品美女久久久久aⅴ| 依依成人综合视频| 狠狠色丁香久久婷婷综| 色伊人久久综合中文字幕| 欧美日韩国产免费一区二区 | 狠狠色丁香久久婷婷综合_中| 国产成人鲁色资源国产91色综| 91麻豆产精品久久久久久| 欧美精品色一区二区三区| 国产欧美精品一区二区色综合| 一区二区三区欧美久久| 精品一二三四区| 91国偷自产一区二区开放时间| 欧美变态口味重另类| 亚洲一区二区三区中文字幕 | 亚洲国产乱码最新视频 | 亚洲午夜免费电影| 国产一区二区三区黄视频| 欧美精品在欧美一区二区少妇| 久久久国产精品午夜一区ai换脸| 亚洲丰满少妇videoshd| a亚洲天堂av| 久久这里都是精品| 蜜芽一区二区三区| 欧美日韩在线播放三区四区| 国产精品久99| 国产激情一区二区三区| 精品国产乱码久久久久久浪潮| 一区二区三区久久久| av网站免费线看精品| 久久精品亚洲国产奇米99| 免费在线一区观看| 91精品国产综合久久久蜜臀图片| 亚洲黄色免费网站| 91麻豆自制传媒国产之光| 国产精品成人一区二区艾草 | 中文字幕中文字幕在线一区| 福利一区二区在线观看| 国产精品网站在线播放| 国产成人aaaa| 日韩美女视频一区二区| 9l国产精品久久久久麻豆| 国产精品高潮久久久久无| 99精品久久只有精品| 亚洲一区二区三区中文字幕在线| 欧美在线制服丝袜| 日韩高清不卡在线| 精品久久久久99| 国产精品综合一区二区| 国产精品乱码一区二区三区软件| 国产一区二区三区观看| 91在线视频网址| 精品欧美一区二区久久| 国产精品资源站在线| 国产精品色哟哟| 欧美午夜在线一二页| 日本成人在线电影网| 久久影院午夜片一区| 99久久99久久精品国产片果冻| 亚洲线精品一区二区三区八戒| 9191久久久久久久久久久| 国产精品资源在线观看| 一区二区三区免费网站| 久久久综合视频| 欧美亚洲国产一区在线观看网站 | 日韩久久精品一区| 99视频有精品| 国产精品99久久久久久久女警 | 中文字幕巨乱亚洲| 欧美一区二区啪啪| 91视视频在线直接观看在线看网页在线看| 亚洲一线二线三线久久久| 欧美激情艳妇裸体舞| 欧美一区二区播放| 欧美亚洲日本国产| av在线播放成人| 国产精品一线二线三线精华| 亚洲成av人片在线观看| 亚洲日本韩国一区| 中文字幕在线一区免费| 久久理论电影网| 久久一二三国产|