On 17/12/12 12:18, Ross Finlayson wrote:
Since the "testOnDemandRTSPServer" demonstrates how to stream from
*files* to (unicast) clients, it does not 'demonstrate' multicast to
unicast RTSP relaying at all. Therefore, you must have modified the
supplied application's code in some (unspecified) way. So I don't
really see how I can help you.
I have copied testOnDemandRTSPServer.cpp to another file and modified it
- the modification is simply the removal of all available streams with
the exception of the following block:
// A MPEG-2 Transport Stream, coming from a live UDP (raw-UDP or
RTP/UDP) source:
{
char const* streamName = "mpeg2TransportStreamFromUDPSourceTest";
char const* inputAddressStr = "239.255.42.42";
// This causes the server to take its input from the stream
sent by the "testMPEG2TransportStreamer" demo application.
// (Note: If the input UDP source is unicast rather than
multicast, then change this to NULL.)
portNumBits const inputPortNum = 1234;
// This causes the server to take its input from the stream
sent by the "testMPEG2TransportStreamer" demo application.
Boolean const inputStreamIsRawUDP = False;
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
sms->addSubsession(MPEG2TransportUDPServerMediaSubsession
::createNew(*env, inputAddressStr, inputPortNum,
inputStreamIsRawUDP));
rtspServer->addServerMediaSession(sms);
char* url = rtspServer->rtspURL(sms);
*env << "\n\"" << streamName << "\" stream, from a UDP Transport
Stream input source \n\t(";
if (inputAddressStr != NULL) {
*env << "IP multicast address " << inputAddressStr << ",";
} else {
*env << "unicast;";
}
*env << " port " << inputPortNum << ")\n";
*env << "Play this stream using the URL \"" << url << "\"\n";
delete[] url;
}
Once again, you haven't said how you have modified the supplied code,
but it sounds like you added a new "OnDemandServerMediaSubsession"
subclass that (1) correctly sets "reuseFirstSource" to True, and (2)
redefines the "createNewStreamSource()" virtual function to create a
new input source object (of some unspecified type...).
Correct, I have specified reuseFirstSource as true. As above, I have
used the code block from the supplied test program, with the multicast
group and port modified to suit local conditions.
If you do this, then, yes, the input source object will get closed
(and its destructor called) whenever the last RTSP client leaves.
This is the proper behavior, because we want the input source to be
closed when noone is requesting its data. (Similarly, when another
client arrives later, "createNewStreamSource()" will get called again,
and a new input source object will get created.)
Now, if that was the behaviour I am observing, then I would be quite
happy with that! However, when another client arrives later, the
multicast stream source does not appear to become active again. I can
confirm however that createNewStreamSource from
MPEG2TransportUDPServerMediaSubsession.cpp is being called as you say it
should be when the client arrives.
I am confident the source is still present on the network, as the source
is directly connected to an ethernet port on the testing machine. I can
see no reason why the library shouldn't be able to resubscribe to this
source, either.
Thanks and regards,
-Tim
_______________________________________________
live-devel mailing list
live-devel@lists.live555.com
http://lists.live555.com/mailman/listinfo/live-devel