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

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

?? rtpfaketransmitter.cpp

?? Real Transport 流媒體編程資料
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
/*  This class allows for jrtp to process packets without sending them out   anywhere.  The incoming messages are handed in to jrtp through the TransmissionParams   and can be retreived from jrtp through the normal polling mecanisms.  The outgoing RTP/RTCP packets are given to jrtp through the normal  session->SendPacket() and those packets are handed back out to the  client through a callback function (packet_ready_cb).    example usage : Allows for integration of RTP into gstreamer.  THIS HAS NOT BEEN TESTED WITH THREADS SO DON'T TRY  Copyright (c) 2005 Philippe Khalaf <burger@speedy.org>    This file is a part of JRTPLIB  Copyright (c) 1999-2004 Jori Liesenborgs  Contact: jori@lumumba.luc.ac.be  This library was developed at the "Expertisecentrum Digitale Media"  (http://www.edm.luc.ac.be), a research center of the "Limburgs Universitair  Centrum" (http://www.luc.ac.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 "rtpfaketransmitter.h"#include "rtprawpacket.h"#include "rtpipv4address.h"#include "rtptimeutilities.h"#include <stdio.h>#include <net/if.h>#include <string.h>#include <netdb.h>#include <unistd.h>#ifdef RTP_HAVE_SYS_FILIO#include <sys/filio.h>#endif // RTP_HAVE_SYS_FILIO#define RTPIOCTL								ioctl#ifdef RTPDEBUG	#include <iostream>#endif // RTPDEBUG#include "rtpdebug.h"#define RTPFAKETRANS_MAXPACKSIZE							65535#define RTPFAKETRANS_IFREQBUFSIZE							8192//#define RTPFAKETRANS_IS_MCASTADDR(x)							(((x)&0xF0000000) == 0xE0000000)/*#define RTPFAKETRANS_MCASTMEMBERSHIP(socket,type,mcastip,status)	{\										struct ip_mreq mreq;\										\										mreq.imr_multiaddr.s_addr = htonl(mcastip);\										mreq.imr_interface.s_addr = htonl(bindIP);\										status = setsockopt(socket,IPPROTO_IP,type,(const char *)&mreq,sizeof(struct ip_mreq));\									}*/#ifndef RTP_SUPPORT_INLINETEMPLATEPARAM	int RTPFakeTrans_GetHashIndex_IPv4Dest(const RTPIPv4Destination &d)				{ return d.GetIP_HBO()%RTPFAKETRANS_HASHSIZE; }	int RTPFakeTrans_GetHashIndex_uint32_t(const uint32_t &k)					{ return k%RTPFAKETRANS_HASHSIZE; }#endif // !RTP_SUPPORT_INLINETEMPLATEPARAM	#ifdef RTP_SUPPORT_THREAD	#define MAINMUTEX_LOCK 		{ if (threadsafe) mainmutex.Lock(); }	#define MAINMUTEX_UNLOCK	{ if (threadsafe) mainmutex.Unlock(); }	#define WAITMUTEX_LOCK		{ if (threadsafe) waitmutex.Lock(); }	#define WAITMUTEX_UNLOCK	{ if (threadsafe) waitmutex.Unlock(); }#else	#define MAINMUTEX_LOCK	#define MAINMUTEX_UNLOCK	#define WAITMUTEX_LOCK	#define WAITMUTEX_UNLOCK#endif // RTP_SUPPORT_THREADRTPFakeTransmitter::RTPFakeTransmitter(){	created = false;	init = false;}RTPFakeTransmitter::~RTPFakeTransmitter(){	Destroy();}int RTPFakeTransmitter::Init(bool tsafe){	if (init)		return ERR_RTP_FAKETRANS_ALREADYINIT;    // bomb out if trying to use threads    if (tsafe)        return ERR_RTP_NOTHREADSUPPORT;	#ifdef RTP_SUPPORT_THREAD	threadsafe = tsafe;	if (threadsafe)	{		int status;				status = mainmutex.Init();		if (status < 0)			return ERR_RTP_FAKETRANS_CANTINITMUTEX;		status = waitmutex.Init();		if (status < 0)			return ERR_RTP_FAKETRANS_CANTINITMUTEX;	}#else	if (tsafe)		return ERR_RTP_NOTHREADSUPPORT;#endif // RTP_SUPPORT_THREAD	init = true;	return 0;}int RTPFakeTransmitter::Create(size_t maximumpacketsize,const RTPTransmissionParams *transparams){	struct sockaddr_in addr;	int status;	if (!init)		return ERR_RTP_FAKETRANS_NOTINIT;		MAINMUTEX_LOCK	if (created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_ALREADYCREATED;	}		// Obtain transmission parameters		if (transparams == 0)		params = new RTPFakeTransmissionParams;	else	{		if (transparams->GetTransmissionProtocol() != RTPTransmitter::UserDefinedProto)			return ERR_RTP_FAKETRANS_ILLEGALPARAMETERS;		params = (RTPFakeTransmissionParams *)transparams;	}	// Check if portbase is even	//if (params->GetPortbase()%2 != 0)	//{	//	MAINMUTEX_UNLOCK	//	return ERR_RTP_FAKETRANS_PORTBASENOTEVEN;	//}	// Try to obtain local IP addresses	localIPs = params->GetLocalIPList();	if (localIPs.empty()) // User did not provide list of local IP addresses, calculate them	{		int status;				if ((status = CreateLocalIPList()) < 0)		{			MAINMUTEX_UNLOCK			return status;		}#ifdef RTPDEBUG		std::cout << "Found these local IP addresses:" << std::endl;				std::list<uint32_t>::const_iterator it;		for (it = localIPs.begin() ; it != localIPs.end() ; it++)		{			RTPIPv4Address a(*it);			std::cout << a.GetAddressString() << std::endl;		}#endif // RTPDEBUG	}//#ifdef RTP_SUPPORT_IPV4MULTICAST//	if (SetMulticastTTL(params->GetMulticastTTL()))//		supportsmulticasting = true;//	else//		supportsmulticasting = false;//#else // no multicast support enabled	supportsmulticasting = false;//#endif // RTP_SUPPORT_IPV4MULTICAST	if (maximumpacketsize > RTPFAKETRANS_MAXPACKSIZE)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_SPECIFIEDSIZETOOBIG;	}		maxpacksize = maximumpacketsize;	portbase = params->GetPortbase();	multicastTTL = params->GetMulticastTTL();	receivemode = RTPTransmitter::AcceptAll;	localhostname = 0;	localhostnamelength = 0;	rtppackcount = 0;	rtcppackcount = 0;		waitingfordata = false;	created = true;	MAINMUTEX_UNLOCK	return 0;}void RTPFakeTransmitter::Destroy(){	if (!init)		return;	MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK;		return;	}	if (localhostname)	{		delete [] localhostname;		localhostname = 0;		localhostnamelength = 0;	}		destinations.Clear();#ifdef RTP_SUPPORT_IPV4MULTICAST//	multicastgroups.Clear();#endif // RTP_SUPPORT_IPV4MULTICAST	FlushPackets();	ClearAcceptIgnoreInfo();	localIPs.clear();	created = false;    delete params;		MAINMUTEX_UNLOCK}RTPTransmissionInfo *RTPFakeTransmitter::GetTransmissionInfo(){	if (!init)		return 0;	MAINMUTEX_LOCK	RTPTransmissionInfo *tinf = new RTPFakeTransmissionInfo(localIPs,             params);	MAINMUTEX_UNLOCK	return tinf;}int RTPFakeTransmitter::GetLocalHostName(uint8_t *buffer,size_t *bufferlength){	if (!init)		return ERR_RTP_FAKETRANS_NOTINIT;	MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_NOTCREATED;	}	if (localhostname == 0)	{		if (localIPs.empty())		{			MAINMUTEX_UNLOCK			return ERR_RTP_FAKETRANS_NOLOCALIPS;		}				std::list<uint32_t>::const_iterator it;		std::list<std::string> hostnames;			for (it = localIPs.begin() ; it != localIPs.end() ; it++)		{			struct hostent *he;			uint8_t addr[4];			uint32_t ip = (*it);				addr[0] = (uint8_t)((ip>>24)&0xFF);			addr[1] = (uint8_t)((ip>>16)&0xFF);			addr[2] = (uint8_t)((ip>>8)&0xFF);			addr[3] = (uint8_t)(ip&0xFF);			he = gethostbyaddr((char *)addr,4,AF_INET);			if (he != 0)			{				std::string hname = std::string(he->h_name);				hostnames.push_back(hname);			}		}			bool found  = false;				if (!hostnames.empty())	// try to select the most appropriate hostname		{			std::list<std::string>::const_iterator it;						for (it = hostnames.begin() ; !found && it != hostnames.end() ; it++)			{				if ((*it).find('.') != std::string::npos)				{					found = true;					localhostnamelength = (*it).length();					localhostname = new uint8_t [localhostnamelength+1];					if (localhostname == 0)					{						MAINMUTEX_UNLOCK						return ERR_RTP_OUTOFMEM;					}					memcpy(localhostname,(*it).c_str(),localhostnamelength);					localhostname[localhostnamelength] = 0;				}			}		}			if (!found) // use an IP address		{			uint32_t ip;			int len;			char str[16];						it = localIPs.begin();			ip = (*it);						snprintf(str,16,"%d.%d.%d.%d",(int)((ip>>24)&0xFF),(int)((ip>>16)&0xFF),(int)((ip>>8)&0xFF),(int)(ip&0xFF));			len = strlen(str);				localhostnamelength = len;			localhostname = new uint8_t [localhostnamelength + 1];			if (localhostname == 0)			{				MAINMUTEX_UNLOCK				return ERR_RTP_OUTOFMEM;			}			memcpy(localhostname,str,localhostnamelength);			localhostname[localhostnamelength] = 0;		}	}		if ((*bufferlength) < localhostnamelength)	{		*bufferlength = localhostnamelength; // tell the application the required size of the buffer		MAINMUTEX_UNLOCK		return ERR_RTP_TRANS_BUFFERLENGTHTOOSMALL;	}	memcpy(buffer,localhostname,localhostnamelength);	*bufferlength = localhostnamelength;		MAINMUTEX_UNLOCK	return 0;}bool RTPFakeTransmitter::ComesFromThisTransmitter(const RTPAddress *addr){	if (!init)		return false;	if (addr == 0)		return false;		MAINMUTEX_LOCK		bool v;			if (created && addr->GetAddressType() == RTPAddress::IPv4Address)	{			const RTPIPv4Address *addr2 = (const RTPIPv4Address *)addr;		bool found = false;		std::list<uint32_t>::const_iterator it;			it = localIPs.begin();		while (!found && it != localIPs.end())		{			if (addr2->GetIP() == *it)				found = true;			else				++it;		}			if (!found)			v = false;		else		{			if (addr2->GetPort() == params->GetPortbase()) // check for RTP port				v = true;			else if (addr2->GetPort() == (params->GetPortbase()+1)) // check for RTCP port				v = true;			else 				v = false;		}	}	else		v = false;	MAINMUTEX_UNLOCK	return v;}int RTPFakeTransmitter::Poll(){	if (!init)		return ERR_RTP_FAKETRANS_NOTINIT;	int status;		MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_NOTCREATED;	}	status = FakePoll(); // poll RTP socket    params->SetCurrentData(NULL);	MAINMUTEX_UNLOCK	return status;}int RTPFakeTransmitter::WaitForIncomingData(const RTPTime &delay,bool *dataavailable){/*	if (!init)		return ERR_RTP_FAKETRANS_NOTINIT;		MAINMUTEX_LOCK		fd_set fdset;	struct timeval tv;		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_NOTCREATED;	}	if (waitingfordata)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_ALREADYWAITING;	}		FD_ZERO(&fdset);	FD_SET(rtpsock,&fdset);	FD_SET(rtcpsock,&fdset);	FD_SET(abortdesc[0],&fdset);	tv.tv_sec = delay.GetSeconds();	tv.tv_usec = delay.GetMicroSeconds();		waitingfordata = true;		WAITMUTEX_LOCK	MAINMUTEX_UNLOCK	if (select(FD_SETSIZE,&fdset,0,0,&tv) < 0)	{		MAINMUTEX_LOCK		waitingfordata = false;		MAINMUTEX_UNLOCK		WAITMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_ERRORINSELECT;	}		MAINMUTEX_LOCK	waitingfordata = false;	if (!created) // destroy called	{		MAINMUTEX_UNLOCK;		WAITMUTEX_UNLOCK		return 0;	}			// if aborted, read from abort buffer	if (FD_ISSET(abortdesc[0],&fdset))	{#ifdef WIN32		char buf[1];				recv(abortdesc[0],buf,1,0);#else 		unsigned char buf[1];		read(abortdesc[0],buf,1);#endif // WIN32	}		MAINMUTEX_UNLOCK	WAITMUTEX_UNLOCK	return 0;*/	return ERR_RTP_FAKETRANS_WAITNOTIMPLEMENTED;}int RTPFakeTransmitter::AbortWait(){/*	if (!init)		return ERR_RTP_FAKETRANS_NOTINIT;		MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_NOTCREATED;	}	if (!waitingfordata)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_NOTWAITING;	}	AbortWaitInternal();		MAINMUTEX_UNLOCK	return 0;*/	return 0;}int RTPFakeTransmitter::SendRTPData(const void *data,size_t len)	{	if (!init)		return ERR_RTP_FAKETRANS_NOTINIT;	MAINMUTEX_LOCK		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_NOTCREATED;	}	if (len > maxpacksize)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_SPECIFIEDSIZETOOBIG;	}	destinations.GotoFirstElement();    // send to each destination	while (destinations.HasCurrentElement())	{        (*params->GetPacketReadyCB())((uint8_t*)data, len,        destinations.GetCurrentElement().GetIP_NBO(),        destinations.GetCurrentElement().GetRTPPort_NBO(),        1);		destinations.GotoNextElement();	}		rtppackcount++;	MAINMUTEX_UNLOCK	return 0;}int RTPFakeTransmitter::SendRTCPData(const void *data,size_t len){	if (!init)		return ERR_RTP_FAKETRANS_NOTINIT;	MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_NOTCREATED;	}	if (len > maxpacksize)	{		MAINMUTEX_UNLOCK		return ERR_RTP_FAKETRANS_SPECIFIEDSIZETOOBIG;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品黄色在线观看| 国产精品资源在线观看| 日本一区二区视频在线观看| 精品99一区二区| 精品国产区一区| 亚洲男女一区二区三区| 亚洲一区二区欧美激情| 亚洲成人tv网| 老汉av免费一区二区三区| 日韩精品久久理论片| 蜜臀精品一区二区三区在线观看| 蜜臀a∨国产成人精品| 日本韩国一区二区三区视频| 欧美日韩亚洲国产综合| 56国语精品自产拍在线观看| 日韩精品专区在线影院重磅| 中文字幕乱码久久午夜不卡 | 韩国视频一区二区| 国产精品69久久久久水密桃| 91精品蜜臀在线一区尤物| 国产精品白丝在线| 国产成人av电影在线观看| 国产另类ts人妖一区二区| 4hu四虎永久在线影院成人| 一区二区三区欧美在线观看| 性感美女久久精品| 欧美视频在线一区| 久久影音资源网| 亚洲午夜电影网| 国产高清精品网站| 久久久久久电影| 亚洲国产精品自拍| 欧美综合天天夜夜久久| 久久久久国产精品麻豆| 国产资源在线一区| 精品国一区二区三区| 韩国精品主播一区二区在线观看| 日韩欧美一区在线观看| 国产精品二三区| 99国产精品久久| 久久综合色综合88| 国产丶欧美丶日本不卡视频| 日本一区二区三级电影在线观看| 国产成人亚洲精品青草天美| 欧美高清一级片在线观看| 99久久国产综合精品麻豆| 一区二区三区中文字幕电影| 在线不卡的av| 一区二区三区四区激情| 欧美日韩美少妇| 亚洲综合区在线| 欧美乱妇15p| 国产一区二区日韩精品| 日韩西西人体444www| 久久电影网电视剧免费观看| 日本一区二区视频在线观看| 91久久精品国产91性色tv| 亚洲va欧美va人人爽午夜| 精品剧情v国产在线观看在线| 五月天久久比比资源色| 欧美性生活大片视频| 美女精品一区二区| 国产精品天美传媒| 国产91精品露脸国语对白| 国产精品国产三级国产三级人妇| 欧美三级在线看| 国产成人在线色| 亚洲电影第三页| 国产午夜精品久久久久久免费视| 国产在线播放一区二区三区| 亚洲图片激情小说| 91国在线观看| 国产一区二区日韩精品| 一区二区三区四区在线播放| 精品奇米国产一区二区三区| 色婷婷av一区二区三区之一色屋| 日韩一区在线看| 97se亚洲国产综合自在线| 日韩精品色哟哟| 亚洲精品久久久蜜桃| 欧美日韩中文一区| 福利一区福利二区| 美腿丝袜亚洲一区| 亚洲午夜久久久久久久久电影院 | 欧美在线不卡一区| 国产一区不卡视频| 日韩精品亚洲专区| 一个色在线综合| 国产精品情趣视频| 欧美videos大乳护士334| 欧美在线|欧美| 91麻豆成人久久精品二区三区| 亚洲在线视频免费观看| 日本一区二区三区在线观看| 7777女厕盗摄久久久| 色婷婷av一区| 成人app网站| 轻轻草成人在线| 久久九九99视频| 日韩一区二区在线观看| 在线精品视频一区二区| 成人18精品视频| 99这里只有久久精品视频| 尤物av一区二区| 亚洲日本青草视频在线怡红院| 久久久久久久久久电影| 26uuu亚洲综合色欧美| 欧美一级艳片视频免费观看| 99久久免费精品高清特色大片| 国产呦萝稀缺另类资源| 国产精品一级黄| 国产精品亚洲成人| 国产呦萝稀缺另类资源| 国产一区二区调教| 精品一区二区三区在线播放视频 | 国产亚洲欧洲997久久综合 | 国产清纯美女被跳蛋高潮一区二区久久w| 欧美精选在线播放| 日韩欧美第一区| 久久亚洲捆绑美女| 国产日本欧洲亚洲| 中文字幕一区二区不卡 | 2024国产精品视频| 欧美精品一区二区在线观看| 国产欧美一区二区三区在线看蜜臀| 久久精品视频一区| 亚洲三级在线观看| 五月激情综合色| 韩国欧美国产1区| av影院午夜一区| 欧美三级日韩三级国产三级| 欧美一区二区大片| 久久精品视频一区二区| 自拍av一区二区三区| 亚洲成人动漫精品| 国内精品免费在线观看| 成人免费视频播放| 国产一区欧美日韩| 国产91精品露脸国语对白| 91蜜桃网址入口| 欧美一级高清片| 国产精品日产欧美久久久久| 一区二区激情视频| 久久99精品国产| 色综合久久综合中文综合网| 7777精品伊人久久久大香线蕉最新版 | 国产综合成人久久大片91| 成人aa视频在线观看| 欧美久久高跟鞋激| 中文字幕精品—区二区四季| 午夜久久久久久久久| 懂色av中文字幕一区二区三区| 欧美午夜一区二区三区免费大片| 日韩欧美色综合网站| 日韩理论在线观看| 国产在线不卡视频| 欧美三级电影在线看| 国产三级精品在线| 天天操天天色综合| 99视频一区二区| 久久亚洲一区二区三区四区| 亚洲午夜日本在线观看| 成人动漫视频在线| 欧美xxxxx牲另类人与| 亚洲激情在线播放| 成人午夜激情在线| 日韩丝袜情趣美女图片| 一区二区三区在线观看欧美| 国产乱码精品一区二区三区av | 欧美大片一区二区三区| 成人免费在线视频| 国产曰批免费观看久久久| 欧美日韩视频在线一区二区| 国产精品天天看| 国产一区欧美二区| 日韩精品一区二区三区中文精品| 亚洲精品视频在线观看网站| 国产福利视频一区二区三区| 欧美成人一区二区三区在线观看| 依依成人综合视频| 91免费观看在线| 欧美国产日韩亚洲一区| 国产乱一区二区| 欧美大片在线观看一区| 日本va欧美va欧美va精品| 欧美日韩国产美女| 亚洲综合色成人| 91福利精品第一导航| 一区二区三区在线视频观看58| 大美女一区二区三区| 2024国产精品视频| 极品瑜伽女神91| 精品精品国产高清a毛片牛牛| 日本免费在线视频不卡一不卡二| 国产一区在线观看视频| 日韩欧美亚洲另类制服综合在线| 日韩国产欧美在线视频| 欧美一区二区三区日韩| 美女视频网站久久| 26uuu国产一区二区三区|