📄 rtpfaketransmitter.cpp
字号:
} destinations.GotoFirstElement(); // send to each destination while (destinations.HasCurrentElement()) { (*params->GetPacketReadyCB())((uint8_t*)data, len, destinations.GetCurrentElement().GetIP_NBO(), destinations.GetCurrentElement().GetRTCPPort_NBO(), 0); destinations.GotoNextElement(); } rtcppackcount++; MAINMUTEX_UNLOCK return 0;}void RTPFakeTransmitter::ResetPacketCount(){ if (!init) return; MAINMUTEX_LOCK if (created) { rtppackcount = 0; rtcppackcount = 0; } MAINMUTEX_UNLOCK }uint32_t RTPFakeTransmitter::GetNumRTPPacketsSent(){ if (!init) return 0; MAINMUTEX_LOCK uint32_t num; if (!created) num = 0; else num = rtppackcount; MAINMUTEX_UNLOCK return num;}uint32_t RTPFakeTransmitter::GetNumRTCPPacketsSent(){ if (!init) return 0; MAINMUTEX_LOCK uint32_t num; if (!created) num = 0; else num = rtcppackcount; MAINMUTEX_UNLOCK return num;} int RTPFakeTransmitter::AddDestination(const RTPAddress &addr){ if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } RTPIPv4Address &address = (RTPIPv4Address &)addr; RTPIPv4Destination dest(address.GetIP(),address.GetPort()); int status = destinations.AddElement(dest); MAINMUTEX_UNLOCK return status;}int RTPFakeTransmitter::DeleteDestination(const RTPAddress &addr){ if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } RTPIPv4Address &address = (RTPIPv4Address &)addr; RTPIPv4Destination dest(address.GetIP(),address.GetPort()); int status = destinations.DeleteElement(dest); MAINMUTEX_UNLOCK return status;}void RTPFakeTransmitter::ClearDestinations(){ if (!init) return; MAINMUTEX_LOCK if (created) destinations.Clear(); MAINMUTEX_UNLOCK}bool RTPFakeTransmitter::SupportsMulticasting(){ if (!init) return false; MAINMUTEX_LOCK bool v; if (!created) v = false; else v = supportsmulticasting; MAINMUTEX_UNLOCK return v;}#ifdef RTP_SUPPORT_IPV4MULTICASTint RTPFakeTransmitter::JoinMulticastGroup(const RTPAddress &addr){// hrrm wonder how will manage to get multicast info thru to the UDPSINK/* if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; uint32_t mcastIP = address.GetIP(); if (!RTPFakeTRANS_IS_MCASTADDR(mcastIP)) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTAMULTICASTADDRESS; } status = multicastgroups.AddElement(mcastIP); if (status >= 0) { RTPFakeTRANS_MCASTMEMBERSHIP(rtpsock,IP_ADD_MEMBERSHIP,mcastIP,status); if (status != 0) { multicastgroups.DeleteElement(mcastIP); MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_COULDNTJOINMULTICASTGROUP; } RTPFakeTRANS_MCASTMEMBERSHIP(rtcpsock,IP_ADD_MEMBERSHIP,mcastIP,status); if (status != 0) { RTPFakeTRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status); multicastgroups.DeleteElement(mcastIP); MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_COULDNTJOINMULTICASTGROUP; } } MAINMUTEX_UNLOCK return status;*/ return ERR_RTP_FAKETRANS_NOMULTICASTSUPPORT;}int RTPFakeTransmitter::LeaveMulticastGroup(const RTPAddress &addr){ /* if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; uint32_t mcastIP = address.GetIP(); if (!RTPFakeTRANS_IS_MCASTADDR(mcastIP)) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTAMULTICASTADDRESS; } status = multicastgroups.DeleteElement(mcastIP); if (status >= 0) { RTPFakeTRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status); RTPFakeTRANS_MCASTMEMBERSHIP(rtcpsock,IP_DROP_MEMBERSHIP,mcastIP,status); status = 0; } MAINMUTEX_UNLOCK return status; */ return ERR_RTP_FAKETRANS_NOMULTICASTSUPPORT;}void RTPFakeTransmitter::LeaveAllMulticastGroups(){/* if (!init) return; MAINMUTEX_LOCK if (created) { multicastgroups.GotoFirstElement(); while (multicastgroups.HasCurrentElement()) { uint32_t mcastIP; int status = 0; mcastIP = multicastgroups.GetCurrentElement(); RTPFakeTRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status); RTPFakeTRANS_MCASTMEMBERSHIP(rtcpsock,IP_DROP_MEMBERSHIP,mcastIP,status); multicastgroups.GotoNextElement(); } multicastgroups.Clear(); } MAINMUTEX_UNLOCK*/}#else // no multicast supportint RTPFakeTransmitter::JoinMulticastGroup(const RTPAddress &addr){ return ERR_RTP_FAKETRANS_NOMULTICASTSUPPORT;}int RTPFakeTransmitter::LeaveMulticastGroup(const RTPAddress &addr){ return ERR_RTP_FAKETRANS_NOMULTICASTSUPPORT;}void RTPFakeTransmitter::LeaveAllMulticastGroups(){}#endif // RTP_SUPPORT_IPV4MULTICASTint RTPFakeTransmitter::SetReceiveMode(RTPTransmitter::ReceiveMode m){ if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (m != receivemode) { receivemode = m; acceptignoreinfo.Clear(); } MAINMUTEX_UNLOCK return 0;}int RTPFakeTransmitter::AddToIgnoreList(const RTPAddress &addr){ if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::IgnoreSome) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}int RTPFakeTransmitter::DeleteFromIgnoreList(const RTPAddress &addr){ if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::IgnoreSome) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}void RTPFakeTransmitter::ClearIgnoreList(){ if (!init) return; MAINMUTEX_LOCK if (created && receivemode == RTPTransmitter::IgnoreSome) ClearAcceptIgnoreInfo(); MAINMUTEX_UNLOCK}int RTPFakeTransmitter::AddToAcceptList(const RTPAddress &addr){ if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::AcceptSome) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}int RTPFakeTransmitter::DeleteFromAcceptList(const RTPAddress &addr){ if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::AcceptSome) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}void RTPFakeTransmitter::ClearAcceptList(){ if (!init) return; MAINMUTEX_LOCK if (created && receivemode == RTPTransmitter::AcceptSome) ClearAcceptIgnoreInfo(); MAINMUTEX_UNLOCK}int RTPFakeTransmitter::SetMaximumPacketSize(size_t s) { if (!init) return ERR_RTP_FAKETRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_NOTCREATED; } if (s > RTPFAKETRANS_MAXPACKSIZE) { MAINMUTEX_UNLOCK return ERR_RTP_FAKETRANS_SPECIFIEDSIZETOOBIG; } maxpacksize = s; MAINMUTEX_UNLOCK return 0;}bool RTPFakeTransmitter::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 *RTPFakeTransmitter::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 RTPFakeTransmitter::SetMulticastTTL(uint8_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 RTPFakeTransmitter::FlushPackets(){ std::list<RTPRawPacket*>::const_iterator it; for (it = rawpacketlist.begin() ; it != rawpacketlist.end() ; ++it) delete (*it); rawpacketlist.clear();}int RTPFakeTransmitter::FakePoll(){ uint8_t *data = NULL; int data_len = 0; uint32_t sourceaddr; uint16_t sourceport; bool rtp; bool acceptdata; RTPTime curtime = RTPTime::CurrentTime(); data = params->GetCurrentData(); data_len = params->GetCurrentDataLen(); rtp = params->GetCurrentDataType(); sourceaddr = params->GetCurrentDataAddr(); sourceport = params->GetCurrentDataPort(); // lets make sure we got something if (data == NULL || data_len <= 0) { return 0; } // let's make a RTPIPv4Address RTPIPv4Address *addr = new RTPIPv4Address(sourceaddr, sourceport); if (addr == 0) { return ERR_RTP_OUTOFMEM; } // ok we got the src addr, now this should be the actual packet uint8_t *datacopy;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -