📄 rtpudpv4transmitter.cpp
字号:
{ 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 struct sockaddr_in saddr; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (len > maxpacksize) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG; } memset(&saddr,0,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; destinations.GotoFirstElement(); while (destinations.HasCurrentElement()) { saddr.sin_port = destinations.GetCurrentElement().GetRTPPort_NBO(); saddr.sin_addr.s_addr = destinations.GetCurrentElement().GetIP_NBO(); sendto(rtpsock,(const char *)data,len,0,(struct sockaddr *)&saddr,sizeof(struct sockaddr_in)); destinations.GotoNextElement(); } rtppackcount++; MAINMUTEX_UNLOCK return 0;}int RTPUDPv4Transmitter::SendRTCPData(const void *data,size_t len){ if (!init) return ERR_RTP_UDPV4TRANS_NOTINIT; MAINMUTEX_LOCK struct sockaddr_in saddr; if (!created) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_NOTCREATED; } if (len > maxpacksize) { MAINMUTEX_UNLOCK return ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG; } memset(&saddr,0,sizeof(struct sockaddr_in)); saddr.sin_family = AF_INET; destinations.GotoFirstElement(); while (destinations.HasCurrentElement()) { saddr.sin_port = destinations.GetCurrentElement().GetRTCPPort_NBO(); saddr.sin_addr.s_addr = destinations.GetCurrentElement().GetIP_NBO(); sendto(rtcpsock,(const char *)data,len,0,(struct sockaddr *)&saddr,sizeof(struct sockaddr_in)); destinations.GotoNextElement(); } rtcppackcount++; MAINMUTEX_UNLOCK return 0;}void RTPUDPv4Transmitter::ResetPacketCount(){ if (!init) return; MAINMUTEX_LOCK if (created) { rtppackcount = 0; rtcppackcount = 0; } MAINMUTEX_UNLOCK }u_int32_t RTPUDPv4Transmitter::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 RTPUDPv4Transmitter::GetNumRTCPPacketsSent(){ if (!init) return 0; MAINMUTEX_LOCK u_int32_t num; if (!created) num = 0; else num = rtcppackcount; MAINMUTEX_UNLOCK return num;} 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; u_int32_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; u_int32_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()) { u_int32_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(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 RTPUDPv4Transmitter::FlushPackets(){ std::list<RTPRawPacket*>::const_iterator it; for (it = rawpacketlist.begin() ; it != rawpacketlist.end() ; ++it) delete (*it); 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,(int)len,0,(struct sockaddr *)&srcaddr,&fromlen); if (recvlen > 0) { bool acceptdata;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -