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

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

?? rtppacketprocessor.cpp

?? 利用rtp庫實現實時語音傳送
?? CPP
字號:
/*  This file is a part of JRTPLIB  Copyright (c) 1999-2004 Jori Liesenborgs  Contact: jori@lumumba.luc.ac.be  This library (JRTPLIB) was partially developed 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 "rtppacketprocessor.h"#include "rtpsources.h"#include "rtpcontributingsources.h"#include "rtppacket.h"#include "rtpconnection.h"#include <stdlib.h>#include <string.h>RTPPacketProcessor::RTPPacketProcessor(){	sources = NULL;	handlers = NULL;	contribsrcs = NULL;	conn = NULL;	initialized = false;}RTPPacketProcessor::~RTPPacketProcessor(){}int RTPPacketProcessor::ProcessRTPBlock(unsigned char *data,int len,unsigned long ip,int port,bool *collis,bool acceptlocalpackets,double localtsunit){	int status;	RTPPacket *packet;	*collis = false;	if (!initialized)	{		delete [] data;		return ERR_RTP_PACKETPROCESSORNOTINITIALIZED;	}	if ((status = GetRTPData(data,len,&packet)) < 0)	{		delete [] data;		return status;	}	if (packet != NULL) // valid packet	{		// check for collision with local ssrc and process further		if (contribsrcs->GetLocalSSRC() == htonl(packet->GetSSRC()))		{			// collision with local ssrc			if (ip == conn->GetLocalIP() && port == conn->GetSendPort())			{				if (!acceptlocalpackets)				{					delete packet;					return 0;				}			}			else			{				if (handlers->handlers[RTP_EXCEPTION_LOCALSSRCCOLLISION].handler != NULL)					CallLocalSSRCCollHandler(packet->GetSSRC(),ip,true,port);							delete packet;				*collis = true;				return 0;			}		}				status = sources->ProcessPacket(packet,ip,port,localtsunit);		if (status < 0)		{			delete packet;			/* On a collision we still want other data to be processed,			   so we will not count this as an error */			if (status == ERR_RTP_COLLISIONBETWEENSSRCS)				return 0;			return status;		}	}	else // invalid packet		delete [] data;		return 0;}int RTPPacketProcessor::ProcessRTCPBlock(unsigned char *data,int len,unsigned long ip,int port,bool *collis,double localtsunit){	RTCPHeader *rtcphdr;	unsigned char *data2;	int type,restlen,calclen;	int status,count;	bool firstblock;	*collis = false;	if (!initialized)	{		delete [] data;		return ERR_RTP_PACKETPROCESSORNOTINITIALIZED;	}	if (ip == conn->GetLocalIP() && port == conn->GetSendPort())	{		CheckRTCPHandler(data,len,ip,port); // let user process packet				/* processing own control information is not useful, so we won't		   do it ... */		delete [] data;		return 0;	}	curip = ip;	curport = port;	data2 = data;	restlen = len;	firstblock = true;	while (restlen >= (int)sizeof(RTCPHeader))	{		rtcphdr = (RTCPHeader *)data2;		data2 += sizeof(RTCPHeader);		restlen -= sizeof(RTCPHeader);		if (rtcphdr->version == RTP_VERSION)		{			type = rtcphdr->packettype;			calclen = ntohs(rtcphdr->length);			calclen *= sizeof(RTPuint32);			count = rtcphdr->blockcount;			if (calclen <= restlen) // otherwise not all the info is included			{				/* Check if the compound packet starts with a SR or RR */				if (firstblock)				{					firstblock = false;					if (type != TYPE_RTCP_SR && type != TYPE_RTCP_RR) // not a rtcp compound packet					{						CheckRTCPHandler(data,len,ip,port); // let user process packet						delete [] data;						return 0;					}				}				/* Just handle the types */				status = 0;				switch(type)				{				case TYPE_RTCP_SR:					status = ProcessSenderReport(data2,calclen,count,collis,localtsunit);					break;				case TYPE_RTCP_RR:					status = ProcessReceiverReport(data2,calclen,count,collis,localtsunit);					break;				case TYPE_RTCP_SDES:					if (count > 0)						status = ProcessSDES(data2,calclen,count,collis,localtsunit);					break;				case TYPE_RTCP_BYE:					if (count > 0)						status = ProcessBYE(data2,calclen,count);					break;				case TYPE_RTCP_APP:					if (handlers->handlers[RTP_EXCEPTION_RECEIVERTCPAPPDATA].handler != NULL)						CallAppDataHandler(data2,calclen,count);					break;				}				if (status < 0)				{					CheckRTCPHandler(data,len,ip,port); // let user process packet					delete [] data;					return status;				}			}		}		else // Not a rtcp compound packet		{			CheckRTCPHandler(data,len,ip,port); // let user process packet			delete [] data;			return 0;		}		restlen -= calclen;		data2 += calclen;	}		if (*collis) // call handler	{		if (handlers->handlers[RTP_EXCEPTION_LOCALSSRCCOLLISION].handler != NULL)			CallLocalSSRCCollHandler(ntohl(contribsrcs->GetLocalSSRC()),ip,false,port);	}	CheckRTCPHandler(data,len,ip,port); // let user process packet	delete [] data;	return 0;}int RTPPacketProcessor::GetRTPData(unsigned char *data,int len,RTPPacket **packet){	RTPPacket *pack;	RTPHeader *hdr;	RTPHeaderExtension *hdrext;	int plen,ccsize,padnum;	unsigned char *pos;	RTPuint16 extlen;	*packet = NULL;	if (len < (int)sizeof(RTPHeader))		return 0;	hdr = (RTPHeader *)data;	if (hdr->version != RTP_VERSION) // check version		return 0;		plen = len;	plen -= sizeof(RTPHeader);	ccsize = ((int)(hdr->cc))*sizeof(RTPuint32);	plen -= ccsize;	if (plen < 0)		return 0;		pos = data+sizeof(RTPHeader)+ccsize;	if (hdr->extension == 1)	{		if (plen < (int)sizeof(RTPHeaderExtension))			return 0;		hdrext = (RTPHeaderExtension *)pos;		extlen = ntohs(hdrext->length);		pos += sizeof(RTPHeaderExtension);		plen -= sizeof(RTPHeaderExtension);		pos += ((int)(extlen))*4;		plen -= ((int)(extlen))*4;		if (plen < 0)			return 0;	}	if (hdr->padding == 1)	{		if (len == 0)			return 0;		if (plen <= 0)			return 0;		padnum = (int)data[len-1];		plen -= padnum;		if (plen < 0)			return 0;	}	pack = new RTPPacket(hdr,data,pos,plen);	if (pack == NULL)		return ERR_RTP_OUTOFMEM;	*packet = pack;	return 0;}int RTPPacketProcessor::ProcessSenderReport(unsigned char *data,int len,int reportcount,bool *collis,double localtsunit){	int len2,status;	unsigned char *data2;	SSRCPrefix *ssrcpref;	RTCPSenderInfo *sendinf;	RTPuint32 senderssrc,ntpmsw,ntplsw,rtpts,packcnt,bytecnt;	data2 = data;	len2 = len;	if (len2 < (int)sizeof(SSRCPrefix)) // not a full report, just skip it		return 0;	ssrcpref = (SSRCPrefix *)data2;	senderssrc = ntohl(ssrcpref->ssrc);	/* Check for a collision with the local SSRC */		if (senderssrc == contribsrcs->GetLocalSSRC()) // both in network byte order	{		*collis = true;		return 0;	}	data2 += sizeof(SSRCPrefix);	len2 -= sizeof(SSRCPrefix);	if (len2 < (int)sizeof(RTCPSenderInfo)) // not a full report, just skip it		return 0;	sendinf = (RTCPSenderInfo *)data2;	ntpmsw = ntohl(sendinf->NTPmsw);	ntplsw = ntohl(sendinf->NTPlsw);	rtpts = ntohl(sendinf->rtptimestamp);	packcnt = ntohl(sendinf->senderpacketcount);	bytecnt = ntohl(sendinf->senderoctetcount);	data2 += sizeof(RTCPSenderInfo);	len2 -= sizeof(RTCPSenderInfo);	status = sources->ProcessSRInfo(senderssrc,ntplsw,ntpmsw,rtpts,packcnt,bytecnt,curip,curport,localtsunit);	if (status < 0)		return status;		if (reportcount > 0)	{		status = ProcessReportBlocks(senderssrc,data2,len2,reportcount,localtsunit);		if (status < 0)			return status;	}			return 0;}int RTPPacketProcessor::ProcessReceiverReport(unsigned char *data,int len,int reportcount,bool *collis,double localtsunit){	int len2,status;	unsigned char *data2;	SSRCPrefix *ssrcpref;	RTPuint32 senderssrc;	len2 = len;	data2 = data;	if (len2 < (int)sizeof(SSRCPrefix)) // not a full report, just skip it		return 0;	ssrcpref = (SSRCPrefix *)data;	senderssrc = ntohl(ssrcpref->ssrc);	/* Check for a collision with the local SSRC */		if (senderssrc == contribsrcs->GetLocalSSRC()) // both in network byte order	{		*collis = true;		return 0;	}	data2 += sizeof(SSRCPrefix);	len2 -= sizeof(SSRCPrefix);	status = ProcessReportBlocks(senderssrc,data2,len2,reportcount,localtsunit);	if (status < 0)		return status;		return 0;}int RTPPacketProcessor::ProcessSDES(unsigned char *data,int len,int sourcecount,bool *collis,double localtsunit){	unsigned char *data2;	int len2,i;	SSRCPrefix *ssrcpref;	SDESPrefix *sdespref;	RTPuint32 ssrc,ssrc_nbo;	int bytecount,mod,adjust;	int sdestype,length,status;	bool done,ssrccollis,newssrccollis;	RTPuint32 localssrc_nbo;		i = 0;	len2 = len;	data2 = data;	localssrc_nbo = contribsrcs->GetLocalSSRC();	ssrccollis = false;	while (i < sourcecount && len2 >= (int)(sizeof(SDESPrefix)+sizeof(SSRCPrefix)))	{		ssrcpref = (struct SSRCPrefix *)data2;		ssrc_nbo = ssrcpref->ssrc;		ssrc = ntohl(ssrc_nbo);				/* Check for a collision with the local SSRC */			newssrccollis = false;		if (ssrc_nbo == localssrc_nbo) // both in network byte order		{			ssrccollis = true;			newssrccollis = true;		}		data2 += sizeof(SSRCPrefix);		len2 -= sizeof(SSRCPrefix);		done = false;		bytecount = 0;		while (!done && len2 >= 1) //  > 1 because at least 1 byte is needed to signal the end of the chunk		{			sdespref = (SDESPrefix *)data2;			sdestype = (int)sdespref->sdestype;			if (sdestype == TYPE_SDES_END) // end of source block			{				done = true;				data2++;				len2--;				bytecount++;				// align to a 32 bit boundary				mod = bytecount%(sizeof(RTPuint32));				if (mod != 0)				{					adjust = sizeof(RTPuint32)-mod;					data2 += adjust;					len2 -= adjust;				}			}			else // a 'normal' type			{				if (len2 < (int)sizeof(SDESPrefix))					done = true;				else				{					data2 += sizeof(SDESPrefix);					len2 -= sizeof(SDESPrefix);					bytecount += sizeof(SDESPrefix);					length = (int)sdespref->length;					if (length <= len2)					{						if (!newssrccollis) // uses own ssrc, just skip it						{							status = sources->ProcessSDESInfo(ssrc,sdestype,data2,length,curip,curport,localtsunit);							if (status < 0)								return status;						}						len2 -= length;						data2 += length;						bytecount += length;					}					else					{						data2 += len2;						len2 = 0;						bytecount +=len2;					}				}			}		}		i++;	}	if (ssrccollis)		*collis = true;	return 0;}int RTPPacketProcessor::ProcessBYE(unsigned char *data,int len,int sourcecount){	unsigned char *data2;	int len2,i;	SSRCPrefix *ssrcpref;	RTPuint32 ssrc;	i = 0;	len2 = len;	data2 = data;	while(i < sourcecount && len2 >= (int)sizeof(SSRCPrefix))	{		ssrcpref = (SSRCPrefix *)data2;		ssrc = ntohl(ssrcpref->ssrc);		sources->ProcessBYEMessage(ssrc,curip,curport);		data2 += sizeof(SSRCPrefix);		len2 -= sizeof(SSRCPrefix);		i++;	}	return 0;}int RTPPacketProcessor::ProcessReportBlocks(RTPuint32 senderssrc,unsigned char *data,int len,int reportcount,double localtsunit){	unsigned char *data2;	int len2,i,status;	bool found;	unsigned char fraclost;	long packetslost,*pl2;	unsigned long pl;	RTCPReportBlock *rb;	RTPuint32 exthighseqnum,jitter,lsr,dlsr;	RTPuint32 nbo_localssrc;	len2 = len;	data2 = data;	found = false;	i = 0;	nbo_localssrc = contribsrcs->GetLocalSSRC();	while (!found && i < reportcount && len2 >= (int)sizeof(RTCPReportBlock))	{		rb = (RTCPReportBlock *)data2;		if (rb->ssrc == nbo_localssrc) // both in network byte order		{			found = true;			fraclost = rb->fractionlost;			/* create the number of packets lost */			pl = 0;			pl |= (rb->packetslost[2]);			pl |= ((rb->packetslost[1])<<8);			pl |= ((rb->packetslost[0])<<16);			if ((rb->packetslost[0])&128) // test the highest bit (to check if it's a negative number)				pl |= ((0xFF)<<24);			pl2 = (long *)&pl;			packetslost = *pl2;			exthighseqnum = ntohl(rb->exthsnr);			jitter = ntohl(rb->jitter);			lsr = ntohl(rb->lsr);			dlsr = ntohl(rb->dlsr);			status = sources->ProcessRRInfo(senderssrc,fraclost,packetslost,exthighseqnum,jitter,lsr,dlsr,curip,curport,localtsunit);			if (status < 0)				return status;		}		else		{			data2 += sizeof(RTCPReportBlock);			len2 -= sizeof(RTCPReportBlock);			i++;		}	}	return 0;}void RTPPacketProcessor::CallAppDataHandler(unsigned char *data,int len,unsigned char subtype){	RTPExceptionHandler handler;	RTCPAPPPrefix *apppref;	void *usrdata;	int numwords;	handler = handlers->handlers[RTP_EXCEPTION_RECEIVERTCPAPPDATA].handler;	usrdata = handlers->handlers[RTP_EXCEPTION_RECEIVERTCPAPPDATA].usrdata;		numwords = len/4;	if (numwords < 2) // invalid packet		return;	apppref = (RTCPAPPPrefix *)data;		ex_appdata.subtype = subtype;	ex_appdata.src = ntohl(apppref->src);	ex_appdata.name[0] = apppref->name[0];	ex_appdata.name[1] = apppref->name[1];	ex_appdata.name[2] = apppref->name[2];	ex_appdata.name[3] = apppref->name[3];	ex_appdata.data = data+sizeof(RTCPAPPPrefix);	ex_appdata.numwords = numwords-2;	ex_appdata.validdata = true;	ex_appdata.prevreturnval = 0;	handler(RTP_EXCEPTION_RECEIVERTCPAPPDATA,&ex_appdata,usrdata);}inline void RTPPacketProcessor::CheckRTCPHandler(unsigned char *data,int len,unsigned long ip, int port){	if (handlers->handlers[RTP_EXCEPTION_RTCPPACKET].handler != NULL)	{		RTPExceptionHandler handler;		void *usrdata;		RTPExcepRTCPPacket packinfo;				packinfo.packet = data;		packinfo.packetlen = len;		packinfo.sourceip = ip;		packinfo.sourceport = port;				handler = handlers->handlers[RTP_EXCEPTION_RTCPPACKET].handler;		usrdata = handlers->handlers[RTP_EXCEPTION_RTCPPACKET].usrdata;		handler(RTP_EXCEPTION_RTCPPACKET,&packinfo,usrdata);	}}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
激情文学综合插| 亚洲国产一区二区三区| 国精品**一区二区三区在线蜜桃 | 欧美三级韩国三级日本三斤| 亚洲一二三专区| 91精品国产91久久久久久一区二区| 秋霞av亚洲一区二区三| 日韩视频免费观看高清完整版 | 日韩高清在线观看| 精品国产免费人成在线观看| 国产传媒日韩欧美成人| 日韩美女精品在线| 欧美精品黑人性xxxx| 精品一区二区三区在线观看国产| 国产欧美一区二区三区沐欲 | 亚洲国产成人tv| 日韩欧美国产电影| 粉嫩13p一区二区三区| 亚洲精品ww久久久久久p站| 欧美日韩精品欧美日韩精品| 激情图区综合网| 亚洲男女毛片无遮挡| 777奇米成人网| 丁香婷婷综合激情五月色| 亚洲精品国产视频| 欧美电影免费观看高清完整版 | 国产午夜精品美女毛片视频| 91国偷自产一区二区三区成为亚洲经典| 亚洲资源在线观看| 精品久久久久一区| 色婷婷国产精品| 久久99国内精品| 亚洲精品中文在线影院| 欧美不卡视频一区| 欧美亚洲图片小说| 国产福利一区二区| 日韩国产欧美一区二区三区| 日本一区二区三区在线不卡 | 91黄色免费观看| 国产不卡视频在线播放| 婷婷中文字幕一区三区| 国产欧美一区二区三区网站| 欧美一区二区日韩| 91香蕉国产在线观看软件| 国产中文字幕精品| 日韩电影在线免费| 亚洲伊人伊色伊影伊综合网 | 夜夜精品视频一区二区| 久久精品免费在线观看| 欧美一级二级三级蜜桃| 色婷婷综合久久久久中文 | 成人国产一区二区三区精品| 日韩电影一区二区三区| 一区二区三区 在线观看视频| 欧美激情在线免费观看| 精品少妇一区二区三区视频免付费 | 成人av资源网站| 精品无人区卡一卡二卡三乱码免费卡| 亚洲香蕉伊在人在线观| 亚洲视频精选在线| 国产精品国产三级国产aⅴ入口 | 精品一区精品二区高清| 人人超碰91尤物精品国产| 亚洲一区二区中文在线| 中文字幕不卡在线观看| www国产成人免费观看视频 深夜成人网| 欧美一区在线视频| 777亚洲妇女| 91精品免费观看| 欧美麻豆精品久久久久久| 在线观看国产精品网站| 欧美自拍偷拍一区| 在线中文字幕不卡| 91久久精品午夜一区二区| 色哟哟国产精品| 91蝌蚪porny| 色婷婷综合久久久| 欧美日韩一区二区电影| 欧美视频中文字幕| 欧美日韩国产乱码电影| 91精品欧美综合在线观看最新| 欧美一区二区在线免费观看| 日韩欧美123| 精品国产三级a在线观看| 26uuu精品一区二区在线观看| 337p日本欧洲亚洲大胆精品| 国产欧美精品一区| 亚洲日本在线视频观看| 一区二区三区91| 日本免费在线视频不卡一不卡二| 美腿丝袜在线亚洲一区| 国产乱子轮精品视频| 成人污污视频在线观看| 91在线视频网址| 欧美精品黑人性xxxx| 亚洲精品在线观看网站| 亚洲欧洲99久久| 亚洲国产欧美一区二区三区丁香婷| 亚洲午夜在线视频| 激情综合色综合久久综合| 成人国产精品视频| 91行情网站电视在线观看高清版| 7777精品伊人久久久大香线蕉 | 99视频一区二区| 91极品美女在线| 日韩欧美的一区| 国产精品久久久久久亚洲毛片| 亚洲资源中文字幕| 激情深爱一区二区| 9i看片成人免费高清| 337p亚洲精品色噜噜| 欧美激情综合五月色丁香小说| 亚洲精品videosex极品| 极品美女销魂一区二区三区免费| 91在线观看免费视频| 欧美一区二区精品在线| 国产精品人成在线观看免费 | 国产麻豆精品一区二区| 在线中文字幕一区| 久久亚洲综合色一区二区三区| 亚洲色大成网站www久久九九| 蜜臀av亚洲一区中文字幕| www.99精品| 日韩区在线观看| 一区二区三区四区视频精品免费 | 亚洲一区国产视频| 成人毛片在线观看| 久久久久久久国产精品影院| 欧美性一级生活| 国产精品萝li| 国产亚洲欧美日韩在线一区| 久久精品夜色噜噜亚洲aⅴ| 亚洲一区二区在线免费看| 国产高清亚洲一区| 制服丝袜国产精品| 亚洲黄色尤物视频| 国产曰批免费观看久久久| 91丨九色丨黑人外教| 久久久久久久久免费| 亚洲国产综合在线| 91玉足脚交白嫩脚丫在线播放| 精品免费国产一区二区三区四区| 亚洲电影你懂得| 成人av先锋影音| 精品国产乱码久久久久久久久| 国产精品2024| 日韩免费高清av| 久久众筹精品私拍模特| 亚洲午夜电影在线观看| 欧美日韩国产欧美日美国产精品| 日韩 欧美一区二区三区| 日韩免费在线观看| 国产精选一区二区三区| 国产精品理论片在线观看| 色吊一区二区三区| 性做久久久久久久久| 7799精品视频| 国产精品18久久久久久久久| 国产精品入口麻豆九色| 91高清视频免费看| 美女在线视频一区| 中文字幕av一区二区三区免费看| 不卡免费追剧大全电视剧网站| 一区二区在线看| 91精品国产高清一区二区三区| 国产一级精品在线| 日韩一区有码在线| 欧美精品高清视频| 国产成人免费av在线| 亚洲精品日韩综合观看成人91| 在线播放/欧美激情| 国产一区二区在线观看免费| 亚洲欧洲日韩女同| 欧美一级精品大片| 成人18精品视频| 日韩在线一区二区| 欧美国产欧美综合| 欧美老女人第四色| 国产成人av一区二区三区在线观看| 亚洲久草在线视频| 久久综合丝袜日本网| 在线观看91精品国产入口| 寂寞少妇一区二区三区| 亚洲美女精品一区| 2023国产精品自拍| 精品视频123区在线观看| 激情欧美日韩一区二区| 亚洲理论在线观看| 久久精品免视看| 91精品国产手机| 91蜜桃在线观看| 国产在线精品不卡| 亚洲国产欧美在线人成| 中文字幕不卡的av| 日韩精品一区二区三区视频在线观看 | 美国毛片一区二区三区| 中文字幕亚洲区| 欧美精品一区二区不卡| 欧美高清视频在线高清观看mv色露露十八| 国产主播一区二区三区|