Hi,

Just wanted to share a small caveat that's been biting me for several days. 
It's not
a Live555 bug, but something that's easy to do wrong in any kind of application 
that
is a bit more complex than the sample apps.

Most of the examples that do multicast streaming have this code:

  const unsigned short rtpPortNum = 18888;
  const Port rtpPort(rtpPortNum);
  Groupsock rtpGroupsock(*env, destinationAddress, rtpPort, ttl);
  rtpGroupsock.multicastSendOnly(); // we're a SSM source

This sets up the Groupsock, there's usually some more, but that's irrelevant. 
Then the
rtpGroupsock instance is used like this:

  videoSink = H264VideoRTPSink::createNew(*env, &rtpGroupsock, 96);

This is all fine as long as control stays in the same method/function until the 
streaming
is done! In my case I was setting up the sinks in a method and then returning 
to my main
loop which handled the Live555 loop. What happens here is that rtpGroupsock is 
a local
variable passed as a pointer to createNew(). We all know what happens when it 
goes out
of scope. In my case I didn't see any crashes, only "bad file descriptor" 
errors for days
that had me debugging all kinds of code. It's not particularly clear when 
Live555 takes
ownership of something or gives it to your code. Smart pointers would be the 
way to
go here, of course.

Just in case someone googles for "bad file descriptor", this could help.

-- 
Jan Ekholm
jan.ekh...@d-pointer.com




_______________________________________________
live-devel mailing list
live-devel@lists.live555.com
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to