<div dir="ltr"><div dir="ltr"><span style="font-size:12.8000001907349px">An RTSP client application that connects to my RTSP server is launched in multi instances. However, it always start with client_port 9000. </span><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><div><div>SETUP rtsp://<a href="http://192.168.0.60:9395/live005/sub.sdp/track1" target="_blank">192.168.0.60:9395/live005/sub.sdp/track1</a> RTSP/1.0</div><div>CSeq: 2</div><div>Transport: RTP/AVP;unicast;client_port=9000-9001</div></div><div>etc...</div></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">When the first instance is launched, it works with port 9000. The second instance is then launched and tries port 9000 again. It doesn't work, so a TEARDOWN is performed. The problem is that the teardown of the second instance is stopping the video of the first instance.<div><br></div><div>By debugging, I discovered that, inside StreamState::endPlaying(), the following call:</div><div>if (fRTPgs != NULL) fRTPgs->removeDestination(dests->addr, dests->rtpPort);<br></div><div>if (fRTCPgs != NULL) fRTCPgs->removeDestination(dests->addr, dests->rtcpPort);<br></div><div>will stop the video from the first instance, since the ports are the same.</div><div><br></div><div><br></div><div>I coded the following workaround:</div></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">In ::handleCmd_SETUP(), before the call to subsession->getStreamParameters(), I added a custom function that checks if the address/ports are already in use:</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><div>bool bAlreadyInUse = subsession->destinationsAlreadyInUse(ourClientConnection->fClientAddr.sin_addr.s_addr, clientRTPPort, clientRTCPPort, tcpSocketNum, rtpChannelId, rtcpChannelId, destinationAddress);</div><div>    if (bAlreadyInUse)</div><div>       break;</div></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">Here's the code to my custom function:</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><div>bool OnDemandServerMediaSubsession::destinationsAlreadyInUse(netAddressBits clientAddress, Port const& clientRTPPort,</div><div>   Port const& clientRTCPPort,</div><div>   int tcpSocketNum,</div><div>   unsigned char rtpChannelId,</div><div>   unsigned char rtcpChannelId,</div><div>   netAddressBits& destinationAddress)</div><div>{</div><div>   if (tcpSocketNum >= 0)  // TCP</div><div>      return false;</div><div><br></div><div>   if (destinationAddress == 0) destinationAddress = clientAddress;</div><div>   struct in_addr destinationAddr; destinationAddr.s_addr = destinationAddress;</div><div><br></div><div>   Destinations* destinations;</div><div>   if (tcpSocketNum < 0) { // UDP</div><div>      destinations = new Destinations(destinationAddr, clientRTPPort, clientRTCPPort);</div><div>   }</div><div>   else { // TCP</div><div>      destinations = new Destinations(tcpSocketNum, rtpChannelId, rtcpChannelId);</div><div>   }</div><div><br></div><div>   HashTable::Iterator* iter = HashTable::Iterator::create(*fDestinationsHashTable);</div><div>   Destinations* dests;</div><div>   char const* key; // dummy</div><div>   bool bAlreadyExist = false;</div><div>   while ((dests = (Destinations*)(iter->next(key))) != NULL)</div><div>   {</div><div>      if (dests->addr.S_un.S_addr == destinations->addr.S_un.S_addr)</div><div>      {</div><div>         if ((dests->rtcpPort.num() == destinations->rtcpPort.num()) || (dests->rtpPort.num() == destinations->rtpPort.num()))</div><div>            bAlreadyExist = true;</div><div>      }</div><div>   }</div><div>   delete iter;</div><div>   return bAlreadyExist;</div><div>}</div></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">With this workaround, the second instance won't stop the video of the first instance, and it will receive RTSP/1.0 454 Session Not Found.</div><div style="font-size:12.8000001907349px"><br></div><div style="font-size:12.8000001907349px">I consider this as a patch, not sure what the best solution should be... any suggestions?</div></div></div>