<div dir="ltr">Resolved. This is NOT a bug with Live555 but simply a misunderstanding of how to use the Groupsocks. This is MY fault, NOT the Live555 code. <br><br>I should change the InitializeRoomClientAudioChannel method to use Groupsock2 pointers instead of passing the address from the stack-based ones. These addresses must be held onto internally, and obviously when the stack unwinds the addresses are blown away. So the values of Groupsock aren't copied by SimpleRTPSource::createNew, but the addresses are held onto. Which is perfectly fine. <br><br>Sorry for the unnecessary post. </div><br><div class="gmail_quote"><div dir="ltr">On Mon, Jun 27, 2016 at 10:57 AM Ben Rush <<a href="mailto:ben@ben-rush.net">ben@ben-rush.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">This has happened to me a couple times while coding up things and I'd like to see if it's something stupid I'm doing, or whether I've uncovered a bug in Live555. <br><br>I've got a class called "RoomClientStreamingServer" which does RTSP + RTP audio. Here is the header file for it: <br><br><div>class RoomClientStreamingServer : public IRoomClient</div><div>{</div><div>public:</div><div>    RoomClientStreamingServer();</div><div>    ~RoomClientStreamingServer();</div><div>    void InitializeServer(); </div><div>    bool InitializeRoomClientAudioChannel(int roomClientAudioListenPort); </div><div>    bool InitializeRoomClientRTSPChannel(int rtspPort, std::string streamName, bool doAudio); </div><div>    void StartServer(); </div><div>    virtual void StopServer() override; </div><div>private:</div><div>    TaskScheduler* _taskScheduler; </div><div>    BasicUsageEnvironment* _usageEnvironment; </div><div><br></div><div>private://audio channel</div><div>    SpeakerSink* _speakerSink; </div><div>    RTPSource* _audioRTPSource; </div><div>    RTCPInstance* _audioRTCPSource;</div><div><br></div><div>private://RTSP channel</div><div>    RTSPServer* _rtspServer; </div><div>    ServerMediaSession* _sms; </div><div>    H264LiveServerMediaSession *_videoSubSession; </div><div>    WindowsAudioMediaSession* _audioSubSession; </div><div>    char _volatile; </div><div>};<br><br>I use it like this: <br><br><div>    RoomClientStreamingServer* roomClient = new RoomClientStreamingServer(); </div><div>    roomClient->InitializeServer(); </div><div>    roomClient->InitializeRoomClientAudioChannel(roomClientAudioListenPort); </div><div>    roomClient->InitializeRoomClientRTSPChannel(rtspPort, streamName, doAudio); </div><div><br></div><div>    roomClient->StartServer(); </div></div><div><br></div><div>The weirdness happens when calling StartServer. StartServer has a very simple implementation: <br><br><div>void RoomClientStreamingServer::StartServer()</div><div>{</div><div>    _taskScheduler->doEventLoop(&_volatile);</div><div>}</div></div><div><br></div><div>This bombs with the following error: <br><br>"BasicTaskScheduler::SingleStep(): select() fails: No error<br>socket numbers used in the select() call: 812(r) 816(r)"<br><br>It appears to be a problem with the InitializeRoomClientAudioChannel() call because I can duplicate this error if I comment out the InitializeRoomClientRTSPChannel(). <br><br>Here is the InitializeRoomClientAudioChannel() implementation: <br><br><div>    _speakerSink = SpeakerSink::createNew(*_usageEnvironment, true, nullptr, false);</div><div><br></div><div>    unsigned int rtpPortNum = roomClientAudioListenPort; // StreamingOptions::RoomClientListenPort;</div><div>    unsigned int rtcpPortNum = rtpPortNum + 1;</div><div>    char* ipAddress = "0.0.0.0";</div><div>    //char* ipAddress = "239.255.42.42"; </div><div><br></div><div>    struct in_addr address;</div><div>    address.S_un.S_addr = our_inet_addr(ipAddress);</div><div>    const Port rtpPort(rtpPortNum);</div><div>    const Port rtcpPort(rtcpPortNum);</div><div><br></div><div>    Groupsock2 rtpGroupSock(*_usageEnvironment, address, rtpPort, 1);</div><div>    Groupsock2 rtcpGroupSock(*_usageEnvironment, address, rtcpPort, 1);</div><div><br></div><div>    _speakerSink->SetGroupSocks(&rtpGroupSock, &rtcpGroupSock);</div><div><br></div><div>    //RTPSource* rtpSource = WaveFormDataStreamer::createNew(*environment, &rtpGroupSock);</div><div>    int payloadFormatCode = 11;</div><div>    const char* mimeType = "L16";</div><div>    int fSamplingFrequency = 44100;</div><div>    int fNumChannels = 1;</div><div>    _audioRTPSource = SimpleRTPSource::createNew(</div><div>        *_usageEnvironment, (Groupsock*)&rtpGroupSock, payloadFormatCode,</div><div>        fSamplingFrequency, "audio/L16", 0, False /*no 'M' bit*/);</div><div><br></div><div>    const unsigned maxCNAMElen = 100;</div><div>    unsigned char CNAME[maxCNAMElen + 1];</div><div>    gethostname((char*)CNAME, maxCNAMElen);</div><div>    CNAME[maxCNAMElen] = '\0'; // just in case</div><div><br></div><div>    _audioRTCPSource =</div><div>        RTCPInstance::createNew(*_usageEnvironment, (Groupsock*)&rtcpGroupSock, 5000, CNAME, NULL, _audioRTPSource);</div><div>    _audioRTCPSource->setByeHandler(subsessionByeHandler, _speakerSink);</div><div>    _speakerSink->startPlaying(*_audioRTPSource, afterAudioListening, NULL);</div><div>    //_taskScheduler->doEventLoop(&_volatile);</div><div>    return true; <br><br>If you'll notice I have <span style="line-height:1.5">_taskScheduler->doEventLoop(&_volatile); commented out because, if I uncomment this line, then I no longer get the crash. <br><br>it's almost as if the _taskScheduler->doEventLoop() needs to be called on the same stack as the rest of the setup code. Again, I've encountered situations like this before when trying to separate the _taskScheduler->doEventLoop() call in another method. <br><br>One final bit of information: if I comment out </span><span style="line-height:1.5">InitializeRoomClientAudioChannel and just let the RTSP stuff go (the webcam), with the _taskScheduler->doEventLoop() in its own method, then everything works fine. <br><br>I recognize this might be a bit tough to follow over email, so if you need source that's fine. However, I also recognize people on this group are busy and so fundamentally I'd like to at least understand what might be the cause of the <br><br></span>"BasicTaskScheduler::SingleStep(): select() fails: No error<br>socket numbers used in the select() call: 812(r) 816(r)" <br><br>error if nothing else. <br><br>If I uncover what I'm doing before I get a response here then I'll send out another email to the group for posterity's sake.  <span style="line-height:1.5"><br></span></div></div></div></blockquote></div>