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

Reply via email to