📄 rtpgsttransmitter.cpp
字号:
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 + -