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