diff --git a/inc/V4l2RTSPServer.h b/inc/V4l2RTSPServer.h index e13eeb5..868a876 100644 --- a/inc/V4l2RTSPServer.h +++ b/inc/V4l2RTSPServer.h @@ -164,7 +164,42 @@ class V4l2RTSPServer { return this->addSession(url, subSession); } - + void decodeMulticastUrl(const std::string & maddr, in_addr & destinationAddress, unsigned short & rtpPortNum, unsigned short & rtcpPortNum) + { + std::istringstream is(maddr); + std::string ip; + getline(is, ip, ':'); + if (!ip.empty()) + { + destinationAddress.s_addr = inet_addr(ip.c_str()); + } else { + destinationAddress.s_addr = chooseRandomIPv4SSMAddress(*this->env()); + } + + rtpPortNum = 20000; + std::string port; + getline(is, port, ':'); + if (!port.empty()) + { + rtpPortNum = atoi(port.c_str()); + } + rtcpPortNum = rtpPortNum+1; + getline(is, port, ':'); + if (!port.empty()) + { + rtcpPortNum = atoi(port.c_str()); + } + } + + ServerMediaSession* AddMulticastSession(const std::string& url, std::string& multicasturi, StreamReplicator* videoReplicator, StreamReplicator* audioReplicator) { + struct in_addr destinationAddress; + unsigned short rtpPortNum; + unsigned short rtcpPortNum; + this->decodeMulticastUrl(multicasturi, destinationAddress, rtpPortNum, rtcpPortNum); + multicasturi = inet_ntoa(destinationAddress) + std::string(":") + std::to_string(rtpPortNum) + std::string(":") + std::to_string(rtcpPortNum); + return this->AddMulticastSession(url, destinationAddress, rtpPortNum, rtcpPortNum, videoReplicator, audioReplicator); + } + // ----------------------------------------- // get rtsp url // ----------------------------------------- diff --git a/main.cpp b/main.cpp index a6bbbb6..6de2c47 100755 --- a/main.cpp +++ b/main.cpp @@ -45,29 +45,6 @@ void sighandler(int n) quit =1; } -// ------------------------------------------------------- -// decode multicast url :: -// ------------------------------------------------------- -void decodeMulticastUrl(const std::string & maddr, in_addr & destinationAddress, unsigned short & rtpPortNum, unsigned short & rtcpPortNum) -{ - std::istringstream is(maddr); - std::string ip; - getline(is, ip, ':'); - if (!ip.empty()) - { - destinationAddress.s_addr = inet_addr(ip.c_str()); - } - - std::string port; - getline(is, port, ':'); - rtpPortNum = 20000; - if (!port.empty()) - { - rtpPortNum = atoi(port.c_str()); - } - rtcpPortNum = rtpPortNum+1; -} - // ------------------------------------------------------- // split video,audio device // ------------------------------------------------------- @@ -280,10 +257,9 @@ int main(int argc, char** argv) { // decode multicast info struct in_addr destinationAddress; - destinationAddress.s_addr = chooseRandomIPv4SSMAddress(*rtspServer.env()); - unsigned short rtpPortNum = 20000; - unsigned short rtcpPortNum = rtpPortNum+1; - decodeMulticastUrl(maddr, destinationAddress, rtpPortNum, rtcpPortNum); + unsigned short rtpPortNum; + unsigned short rtcpPortNum; + rtspServer.decodeMulticastUrl(maddr, destinationAddress, rtpPortNum, rtcpPortNum); std::list outList; int nbSource = 0;