⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtpgsttransmitter.cpp

📁 jrtplib3.3.0 最新下载的jrtplib. 我现在正在用jrtplib2.7版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		return ERR_RTP_GSTV4TRANS_SPECIFIEDSIZETOOBIG;	}	destinations.GotoFirstElement();    // send to each destination	while (destinations.HasCurrentElement())	{        // create GstNetBuffer from data        out_buf = gst_netbuffer_new ();        GST_BUFFER_DATA (out_buf) = (guint8 *)data;        GST_BUFFER_SIZE (out_buf) = len;        gst_netaddress_set_ip4_address (&out_buf->to, destinations.GetCurrentElement().GetIP_NBO(),                destinations.GetCurrentElement().GetRTCPPort_NBO());        GST_DEBUG("Sending RTCP packet");        // push data        gst_pad_push( params->GetGstRTCPSrc(), GST_BUFFER(out_buf) );		destinations.GotoNextElement();	}		rtcppackcount++;	MAINMUTEX_UNLOCK	return 0;}void RTPGSTv4Transmitter::ResetPacketCount(){	if (!init)		return;	MAINMUTEX_LOCK	if (created)	{		rtppackcount = 0;		rtcppackcount = 0;		}	MAINMUTEX_UNLOCK	}u_int32_t RTPGSTv4Transmitter::GetNumRTPPacketsSent(){	if (!init)		return 0;	MAINMUTEX_LOCK		u_int32_t num;	if (!created)		num = 0;	else		num = rtppackcount;	MAINMUTEX_UNLOCK	return num;}u_int32_t RTPGSTv4Transmitter::GetNumRTCPPacketsSent(){	if (!init)		return 0;		MAINMUTEX_LOCK		u_int32_t num;	if (!created)		num = 0;	else		num = rtcppackcount;	MAINMUTEX_UNLOCK	return num;}	int RTPGSTv4Transmitter::AddDestination(const RTPAddress &addr){	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;		MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}		RTPIPv4Address &address = (RTPIPv4Address &)addr;	RTPIPv4Destination dest(address.GetIP(),address.GetPort());	int status = destinations.AddElement(dest);	MAINMUTEX_UNLOCK	return status;}int RTPGSTv4Transmitter::DeleteDestination(const RTPAddress &addr){	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;		MAINMUTEX_LOCK		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}		RTPIPv4Address &address = (RTPIPv4Address &)addr;		RTPIPv4Destination dest(address.GetIP(),address.GetPort());	int status = destinations.DeleteElement(dest);		MAINMUTEX_UNLOCK	return status;}void RTPGSTv4Transmitter::ClearDestinations(){	if (!init)		return;		MAINMUTEX_LOCK	if (created)		destinations.Clear();	MAINMUTEX_UNLOCK}bool RTPGSTv4Transmitter::SupportsMulticasting(){	if (!init)		return false;		MAINMUTEX_LOCK		bool v;			if (!created)		v = false;	else		v = supportsmulticasting;	MAINMUTEX_UNLOCK	return v;}#ifdef RTP_SUPPORT_IPV4MULTICASTint RTPGSTv4Transmitter::JoinMulticastGroup(const RTPAddress &addr){// hrrm wonder how will manage to get multicast info thru to the UDPSINK/*	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;	MAINMUTEX_LOCK		int status;		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}		const RTPIPv4Address &address = (const RTPIPv4Address &)addr;	u_int32_t mcastIP = address.GetIP();		if (!RTPGSTv4TRANS_IS_MCASTADDR(mcastIP))	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTAMULTICASTADDRESS;	}		status = multicastgroups.AddElement(mcastIP);	if (status >= 0)	{		RTPGSTv4TRANS_MCASTMEMBERSHIP(rtpsock,IP_ADD_MEMBERSHIP,mcastIP,status);		if (status != 0)		{			multicastgroups.DeleteElement(mcastIP);			MAINMUTEX_UNLOCK			return ERR_RTP_GSTV4TRANS_COULDNTJOINMULTICASTGROUP;		}		RTPGSTv4TRANS_MCASTMEMBERSHIP(rtcpsock,IP_ADD_MEMBERSHIP,mcastIP,status);		if (status != 0)		{			RTPGSTv4TRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status);			multicastgroups.DeleteElement(mcastIP);			MAINMUTEX_UNLOCK			return ERR_RTP_GSTV4TRANS_COULDNTJOINMULTICASTGROUP;		}	}	MAINMUTEX_UNLOCK		return status;*/	return ERR_RTP_GSTV4TRANS_NOMULTICASTSUPPORT;}int RTPGSTv4Transmitter::LeaveMulticastGroup(const RTPAddress &addr){    /*	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;	MAINMUTEX_LOCK		int status;		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}		const RTPIPv4Address &address = (const RTPIPv4Address &)addr;	u_int32_t mcastIP = address.GetIP();		if (!RTPGSTv4TRANS_IS_MCASTADDR(mcastIP))	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTAMULTICASTADDRESS;	}		status = multicastgroups.DeleteElement(mcastIP);	if (status >= 0)	{			RTPGSTv4TRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status);		RTPGSTv4TRANS_MCASTMEMBERSHIP(rtcpsock,IP_DROP_MEMBERSHIP,mcastIP,status);		status = 0;	}		MAINMUTEX_UNLOCK	return status;    */	return ERR_RTP_GSTV4TRANS_NOMULTICASTSUPPORT;}void RTPGSTv4Transmitter::LeaveAllMulticastGroups(){/*	if (!init)		return;		MAINMUTEX_LOCK	if (created)	{		multicastgroups.GotoFirstElement();		while (multicastgroups.HasCurrentElement())		{			u_int32_t mcastIP;			int status = 0;			mcastIP = multicastgroups.GetCurrentElement();			RTPGSTv4TRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status);			RTPGSTv4TRANS_MCASTMEMBERSHIP(rtcpsock,IP_DROP_MEMBERSHIP,mcastIP,status);			multicastgroups.GotoNextElement();		}		multicastgroups.Clear();	}	MAINMUTEX_UNLOCK*/}#else // no multicast supportint RTPGSTv4Transmitter::JoinMulticastGroup(const RTPAddress &addr){	return ERR_RTP_GSTV4TRANS_NOMULTICASTSUPPORT;}int RTPGSTv4Transmitter::LeaveMulticastGroup(const RTPAddress &addr){	return ERR_RTP_GSTV4TRANS_NOMULTICASTSUPPORT;}void RTPGSTv4Transmitter::LeaveAllMulticastGroups(){}#endif // RTP_SUPPORT_IPV4MULTICASTint RTPGSTv4Transmitter::SetReceiveMode(RTPTransmitter::ReceiveMode m){	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;		MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (m != receivemode)	{		receivemode = m;		acceptignoreinfo.Clear();	}	MAINMUTEX_UNLOCK	return 0;}int RTPGSTv4Transmitter::AddToIgnoreList(const RTPAddress &addr){	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;	MAINMUTEX_LOCK		int status;	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}	if (receivemode != RTPTransmitter::IgnoreSome)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_DIFFERENTRECEIVEMODE;	}		const RTPIPv4Address &address = (const RTPIPv4Address &)addr;	status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort());		MAINMUTEX_UNLOCK	return status;}int RTPGSTv4Transmitter::DeleteFromIgnoreList(const RTPAddress &addr){	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;		MAINMUTEX_LOCK		int status;		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}	if (receivemode != RTPTransmitter::IgnoreSome)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_DIFFERENTRECEIVEMODE;	}		const RTPIPv4Address &address = (const RTPIPv4Address &)addr;		status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort());	MAINMUTEX_UNLOCK	return status;}void RTPGSTv4Transmitter::ClearIgnoreList(){	if (!init)		return;		MAINMUTEX_LOCK	if (created && receivemode == RTPTransmitter::IgnoreSome)		ClearAcceptIgnoreInfo();	MAINMUTEX_UNLOCK}int RTPGSTv4Transmitter::AddToAcceptList(const RTPAddress &addr){	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;		MAINMUTEX_LOCK		int status;		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}	if (receivemode != RTPTransmitter::AcceptSome)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_DIFFERENTRECEIVEMODE;	}		const RTPIPv4Address &address = (const RTPIPv4Address &)addr;	status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort());	MAINMUTEX_UNLOCK	return status;}int RTPGSTv4Transmitter::DeleteFromAcceptList(const RTPAddress &addr){	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;		MAINMUTEX_LOCK		int status;		if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (addr.GetAddressType() != RTPAddress::IPv4Address)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE;	}	if (receivemode != RTPTransmitter::AcceptSome)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_DIFFERENTRECEIVEMODE;	}		const RTPIPv4Address &address = (const RTPIPv4Address &)addr;	status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort());	MAINMUTEX_UNLOCK	return status;}void RTPGSTv4Transmitter::ClearAcceptList(){	if (!init)		return;		MAINMUTEX_LOCK	if (created && receivemode == RTPTransmitter::AcceptSome)		ClearAcceptIgnoreInfo();	MAINMUTEX_UNLOCK}int RTPGSTv4Transmitter::SetMaximumPacketSize(size_t s)	{	if (!init)		return ERR_RTP_GSTV4TRANS_NOTINIT;		MAINMUTEX_LOCK	if (!created)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_NOTCREATED;	}	if (s > RTPGSTv4TRANS_MAXPACKSIZE)	{		MAINMUTEX_UNLOCK		return ERR_RTP_GSTV4TRANS_SPECIFIEDSIZETOOBIG;	}	maxpacksize = s;	MAINMUTEX_UNLOCK	return 0;}bool RTPGSTv4Transmitter::NewDataAvailable(){	if (!init)		return false;		MAINMUTEX_LOCK		bool v;			if (!created)		v = false;	else	{		if (rawpacketlist.empty())			v = false;		else			v = true;	}		MAINMUTEX_UNLOCK	return v;}RTPRawPacket *RTPGSTv4Transmitter::GetNextPacket(){	if (!init)		return 0;		MAINMUTEX_LOCK		RTPRawPacket *p;		if (!created)	{		MAINMUTEX_UNLOCK		return 0;	}	if (rawpacketlist.empty())	{		MAINMUTEX_UNLOCK		return 0;	}	p = *(rawpacketlist.begin());	rawpacketlist.pop_front();	MAINMUTEX_UNLOCK	return p;}// Here the private functions start...#ifdef RTP_SUPPORT_IPV4MULTICASTbool RTPGSTv4Transmitter::SetMulticastTTL(u_int8_t ttl){/*	int ttl2,status;	ttl2 = (int)ttl;	status = setsockopt(rtpsock,IPPROTO_IP,IP_MULTICAST_TTL,(const char *)&ttl2,sizeof(int));	if (status != 0)		return false;	status = setsockopt(rtcpsock,IPPROTO_IP,IP_MULTICAST_TTL,(const char *)&ttl2,sizeof(int));	if (status != 0)		return false;	return true;*/}#endif // RTP_SUPPORT_IPV4MULTICASTvoid RTPGSTv4Transmitter::FlushPackets(){	std::list<RTPRawPacket*>::const_iterator it;	for (it = rawpacketlist.begin() ; it != rawpacketlist.end() ; ++it)		delete (*it);	rawpacketlist.clear();}int RTPGSTv4Transmitter::FakePoll(){    int recvlen;    GstNetBuffer *packetbuffer;    RTPTime curtime = RTPTime::CurrentTime();    packetbuffer = params->GetCurrentData();    bool rtp = params->GetCurrentDataType();    // lets make sure we got something    if (packetbuffer == NULL )    {        //GST_DEBUG("No packetbuffer to poll");        return 0;    }    // should be a netbuffer    if (GST_IS_NETBUFFER (packetbuffer))    {        guint16 senderport;        guint32 senderaddr;        // let's get the address from the netbuffer        gst_netaddress_get_ip4_address (&packetbuffer->from, &senderaddr, &senderport);        RTPIPv4Address *addr = new RTPIPv4Address(ntohl(senderaddr), ntohs(senderport));        if (addr == 0)        {            return ERR_RTP_OUTOFMEM;        }        GST_DEBUG("Got netbuffer, saving src info %d %d", addr->GetIP(), addr->GetPort());        // ok we got the src addr, now this should be the actual packet        recvlen = GST_BUFFER_SIZE(packetbuffer);        if (GST_BUFFER_DATA(packetbuffer) && recvlen > 0)        {            GST_DEBUG("Got packet %d", recvlen);            bool acceptdata;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -