Dear Sir: The fourth parameter "forceMulticastOnUnspecified" of RTSPClient::setupMediaSubsession() will guide the client agent to setup a multicast subsession if the IP address is not specified in SDP. The client will then join the multicast group later by calling subsession.setDestinations(fServerAddress) which then invokes fRTPSocket->changeDestinationParameters(destAddr, destPort, destTTL). However, Groupsock::changeDestinationParameters() doesn't consider if it has a source filter address specified in SDP and just try a regular multicast address group leave and join.
Hence, I suggest to modify as follows: Groupsock::changeDestinationParameters(...) { ... ... if (newDestAddr.s_addr != 0) { if (newDestAddr.s_addr != destAddr.s_addr && IsMulticastAddress(newDestAddr.s_addr)) { // If the new destination is a multicast address, then we assume that // we want to join it also. (If this is not in fact the case, then // call "multicastSendOnly()" afterwards.) if (isSSM()) { if (!socketLeaveGroupSSM(env(), socketNum(), destAddr.s_addr, sourceFilterAddress().s_addr)) socketLeaveGroup(env(), socketNum(), destAddr.s_addr); else socketLeaveGroup(env(), socketNum(), groupAddress().s_addr); if (!socketJoinGroupSSM(env(), socketNum(), newDestAddr.s_addr, sourceFilterAddress().s_addr)) { if (DebugLevel >= 3) { env() << *this << ": SSM join failed: " << env().getResultMsg(); env() << " - trying regular join instead\n"; } if (!socketJoinGroup(env(), socketNum(), newDestAddr.s_addr)) { if (DebugLevel >= 1) env() << *this << ": failed to join group: " << env().getResultMsg() << "\n"; } } } else { socketLeaveGroup(env(), socketNum(), destAddr.s_addr); socketJoinGroup(env(), socketNum(), newDestAddr.s_addr); } } destAddr.s_addr = newDestAddr.s_addr; } ... } Besides, the ws2tcpip.h provided in a newly installed Visual Studio C++ 6 doesn't define IP_ADD_SOURCE_MEMBERSHIP and IP_DROP_SOURCE_MEMBERSHIP so the following conditional macro in GroupHelper.cpp wiill define them as wrong values on Windows. #ifdef LINUX #define IP_ADD_SOURCE_MEMBERSHIP 39 #define IP_DROP_SOURCE_MEMBERSHIP 40 #else #define IP_ADD_SOURCE_MEMBERSHIP 25 // should be 15 on Windows #define IP_DROP_SOURCE_MEMBERSHIP 26 // should be 16 on Windows #endif Therefore, I suggest modify the above as the following: #ifdef LINUX #define IP_ADD_SOURCE_MEMBERSHIP 39 #define IP_DROP_SOURCE_MEMBERSHIP 40 #elif defined(WINNT) || defined(_WINNT) #define IP_ADD_SOURCE_MEMBERSHIP 15 /* join IP group/source */ #define IP_DROP_SOURCE_MEMBERSHIP 16 /* leave IP group/source */ #define IP_BLOCK_SOURCE 17 /* block IP group/source */ #define IP_UNBLOCK_SOURCE 18 /* unblock IP group/source */ #define IP_PKTINFO 19 /* receive packet information for ipv4*/ #define IP_RECEIVE_BROADCAST 22 /* allow/block broadcast reception */ #else #define IP_ADD_SOURCE_MEMBERSHIP 25 #define IP_DROP_SOURCE_MEMBERSHIP 26 #endif BR Brain Lai
_______________________________________________ live-devel mailing list live-devel@lists.live555.com http://lists.live555.com/mailman/listinfo/live-devel