📄 rtpudpv4transmitter.cpp
字号:
if (FD_ISSET(abortdesc[0],&fdset)) {#if (defined(WIN32) || defined(_WIN32_WCE)) char buf[1]; recv(abortdesc[0],buf,1,0);#else unsigned char buf[1]; read(abortdesc[0],buf,1);#endif // WIN32 } if (dataavailable != 0) { if (FD_ISSET(rtpsock,&fdset) || FD_ISSET(rtcpsock,&fdset)) *dataavailable = true; else *dataavailable = false; } MAINMUTEX_UNLOCK WAITMUTEX_UNLOCK return 0;}int RTPUDPv4Transmitter::AbortWait(){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (!waitingfordata) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTWAITING; } AbortWaitInternal(); MAINMUTEX_UNLOCK return 0;}int RTPUDPv4Transmitter::SendRTPData(const void *data,size_t len) { if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (len > maxpacksize) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG; } destinations.GotoFirstElement(); while (destinations.HasCurrentElement()) { sendto(rtpsock,(const char *)data,len,0,(const struct sockaddr *)destinations.GetCurrentElement().GetRTPSockAddr(),sizeof(struct sockaddr_in)); destinations.GotoNextElement(); } MAINMUTEX_UNLOCK return 0;}int RTPUDPv4Transmitter::SendRTCPData(const void *data,size_t len){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (len > maxpacksize) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG; } destinations.GotoFirstElement(); while (destinations.HasCurrentElement()) { sendto(rtcpsock,(const char *)data,len,0,(const struct sockaddr *)destinations.GetCurrentElement().GetRTCPSockAddr(),sizeof(struct sockaddr_in)); destinations.GotoNextElement(); } MAINMUTEX_UNLOCK return 0;}int RTPUDPv4Transmitter::AddDestination(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } RTPIPv4Address &address = (RTPIPv4Address &)addr; RTPIPv4Destination dest(address.GetIP(),address.GetPort()); int status = destinations.AddElement(dest); MAINMUTEX_UNLOCK return status;}int RTPUDPv4Transmitter::DeleteDestination(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } RTPIPv4Address &address = (RTPIPv4Address &)addr; RTPIPv4Destination dest(address.GetIP(),address.GetPort()); int status = destinations.DeleteElement(dest); MAINMUTEX_UNLOCK return status;}void RTPUDPv4Transmitter::ClearDestinations(){ if (!init) return; MAINMUTEX_LOCK if (created) destinations.Clear(); MAINMUTEX_UNLOCK}bool RTPUDPv4Transmitter::SupportsMulticasting(){ if (!init) return false; MAINMUTEX_LOCK bool v; if (!created) v = false; else v = supportsmulticasting; MAINMUTEX_UNLOCK return v;}#ifdef RTP_SUPPORT_IPV4MULTICASTint RTPUDPv4Transmitter::JoinMulticastGroup(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; uint32_t mcastIP = address.GetIP(); if (!RTPUDPV4TRANS_IS_MCASTADDR(mcastIP)) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTAMULTICASTADDRESS; } status = multicastgroups.AddElement(mcastIP); if (status >= 0) { RTPUDPV4TRANS_MCASTMEMBERSHIP(rtpsock,IP_ADD_MEMBERSHIP,mcastIP,status); if (status != 0) { multicastgroups.DeleteElement(mcastIP); MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_COULDNTJOINMULTICASTGROUP; } RTPUDPV4TRANS_MCASTMEMBERSHIP(rtcpsock,IP_ADD_MEMBERSHIP,mcastIP,status); if (status != 0) { RTPUDPV4TRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status); multicastgroups.DeleteElement(mcastIP); MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_COULDNTJOINMULTICASTGROUP; } } MAINMUTEX_UNLOCK return status;}int RTPUDPv4Transmitter::LeaveMulticastGroup(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; uint32_t mcastIP = address.GetIP(); if (!RTPUDPV4TRANS_IS_MCASTADDR(mcastIP)) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTAMULTICASTADDRESS; } status = multicastgroups.DeleteElement(mcastIP); if (status >= 0) { RTPUDPV4TRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status); RTPUDPV4TRANS_MCASTMEMBERSHIP(rtcpsock,IP_DROP_MEMBERSHIP,mcastIP,status); status = 0; } MAINMUTEX_UNLOCK return status;}void RTPUDPv4Transmitter::LeaveAllMulticastGroups(){ if (!init) return; MAINMUTEX_LOCK if (created) { multicastgroups.GotoFirstElement(); while (multicastgroups.HasCurrentElement()) { uint32_t mcastIP; int status = 0; mcastIP = multicastgroups.GetCurrentElement(); RTPUDPV4TRANS_MCASTMEMBERSHIP(rtpsock,IP_DROP_MEMBERSHIP,mcastIP,status); RTPUDPV4TRANS_MCASTMEMBERSHIP(rtcpsock,IP_DROP_MEMBERSHIP,mcastIP,status); multicastgroups.GotoNextElement(); } multicastgroups.Clear(); } MAINMUTEX_UNLOCK}#else // no multicast supportint RTPUDPv4Transmitter::JoinMulticastGroup(const RTPAddress &addr){ return ERR_RTP_UDPV4TRANS_NOMULTICASTSUPPORT;}int RTPUDPv4Transmitter::LeaveMulticastGroup(const RTPAddress &addr){ return ERR_RTP_UDPV4TRANS_NOMULTICASTSUPPORT;}void RTPUDPv4Transmitter::LeaveAllMulticastGroups(){}#endif // RTP_SUPPORT_IPV4MULTICASTint RTPUDPv4Transmitter::SetReceiveMode(RTPTransmitter::ReceiveMode m){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (m != receivemode) { receivemode = m; acceptignoreinfo.Clear(); } MAINMUTEX_UNLOCK return 0;}int RTPUDPv4Transmitter::AddToIgnoreList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::IgnoreSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}int RTPUDPv4Transmitter::DeleteFromIgnoreList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::IgnoreSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}void RTPUDPv4Transmitter::ClearIgnoreList(){ if (!init) return; MAINMUTEX_LOCK if (created && receivemode == RTPTransmitter::IgnoreSome) ClearAcceptIgnoreInfo(); MAINMUTEX_UNLOCK}int RTPUDPv4Transmitter::AddToAcceptList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::AcceptSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessAddAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}int RTPUDPv4Transmitter::DeleteFromAcceptList(const RTPAddress &addr){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK int status; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (addr.GetAddressType() != RTPAddress::IPv4Address) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE; } if (receivemode != RTPTransmitter::AcceptSome) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_DIFFERENTRECEIVEMODE; } const RTPIPv4Address &address = (const RTPIPv4Address &)addr; status = ProcessDeleteAcceptIgnoreEntry(address.GetIP(),address.GetPort()); MAINMUTEX_UNLOCK return status;}void RTPUDPv4Transmitter::ClearAcceptList(){ if (!init) return; MAINMUTEX_LOCK if (created && receivemode == RTPTransmitter::AcceptSome) ClearAcceptIgnoreInfo(); MAINMUTEX_UNLOCK}int RTPUDPv4Transmitter::SetMaximumPacketSize(size_t s) { if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (s > RTPUDPV4TRANS_MAXPACKSIZE) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG; } maxpacksize = s; MAINMUTEX_UNLOCK return 0;}bool RTPUDPv4Transmitter::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 *RTPUDPv4Transmitter::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 RTPUDPv4Transmitter::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 RTPUDPv4Transmitter::FlushPackets(){ std::list<RTPRawPacket*>::const_iterator it; for (it = rawpacketlist.begin() ; it != rawpacketlist.end() ; ++it) RTPDelete(*it,GetMemoryManager()); rawpacketlist.clear();}int RTPUDPv4Transmitter::PollSocket(bool rtp){ RTPSOCKLENTYPE fromlen; int recvlen; char packetbuffer[RTPUDPV4TRANS_MAXPACKSIZE];#if (defined(WIN32) || defined(_WIN32_WCE)) SOCKET sock; unsigned long len;#else size_t len; int sock;#endif // WIN32 struct sockaddr_in srcaddr; if (rtp) sock = rtpsock; else sock = rtcpsock; len = 0; RTPIOCTL(sock,FIONREAD,&len); if (len <= 0) return 0; while (len > 0) { RTPTime curtime = RTPTime::CurrentTime(); fromlen = sizeof(struct sockaddr_in); recvlen = recvfrom(sock,packetbuffer,RTPUDPV4TRANS_MAXPACKSIZE,0,(struct sockaddr *)&srcaddr,&fromlen); if (recvlen > 0) { bool acceptdata; // got data, process it if (receivemode == RTPTransmitter::AcceptAll) acceptdata = true; else acceptdata = ShouldAcceptData(ntohl(srcaddr.sin_addr.s_addr),ntohs(srcaddr.sin_port)); if (acceptdata) { RTPRawPacket *pack; RTPIPv4Address *addr; uint8_t *datacopy; addr = RTPNew(GetMemoryManager(),RTPMEM_TYPE_CLASS_RTPADDRESS) RTPIPv4Address(ntohl(srcaddr.sin_addr.s_addr),ntohs(srcaddr.sin_port)); if (addr == 0) return ERR_RTP_OUTOFMEM; datacopy = RTPNew(GetMemoryManager(),(rtp)?RTPMEM_TYPE_BUFFER_RECEIVEDRTPPACKET:RTPMEM_TYPE_BUFFER_RECEIVEDRTCPPACKET) uint8_t[recvlen];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -