Dear all,

we are trying to use the live555MediaServer to stream MPEG2 transport stream files which size grow continuously due to a separated process that appends data to both transport stream (.ts) and transport stream index files (.tsx).

After the first RTSP request (DESCRIBE or PLAY) the server seems to parse the tsx file and saves the transport stream duration (inside a Server Media Session?). All the subsequent DESCRIBE requests return the saved time range even if the file duration is grown. If a PLAY request with npt > duration is generated the server seek only to the last saved duration ignoring the actual npt.

We know that this is the desired behavior but we need the media server to dynamically update the file duration. Does anyone know if this is possible? In order to do so, we have tried to modify DynamicRTSPServer.cpp in function lookupServerMediaSession: instead of using pre existent Server Media Session we remove and recreate it at each incoming RTSP request.

The original code was:

   ServerMediaSession*
   DynamicRTSPServer::lookupServerMediaSession(char const* streamName) {
      // First, check whether the specified "streamName" exists as a
   local file:
      FILE* fid = fopen(streamName, "rb");
      Boolean fileExists = fid != NULL;

      // Next, check whether we already have a "ServerMediaSession" for
   this file:
      ServerMediaSession* sms =
   RTSPServer::lookupServerMediaSession(streamName);
      Boolean smsExists = sms != NULL;

      // Handle the four possibilities for "fileExists" and "smsExists":
      if (!fileExists) {
        if (smsExists) {
          // "sms" was created for a file that no longer exists. Remove
   it:
          removeServerMediaSession(sms);
        }
        return NULL;
      } else {
        if (!smsExists) {
          // Create a new "ServerMediaSession" object for streaming
   from the named file.
          sms = createNewSMS(envir(), streamName, fid);
          addServerMediaSession(sms);
        }
        fclose(fid);
        return sms;
      }
   }


Our modified version is:

   ServerMediaSession*
   DynamicRTSPServer::lookupServerMediaSession(char const* streamName) {
      // First, check whether the specified "streamName" exists as a
   local file:
      FILE* fid = fopen(streamName, "rb");
      Boolean fileExists = fid != NULL;

      // Next, check whether we already have a "ServerMediaSession" for
   this file:
      ServerMediaSession* sms =
   RTSPServer::lookupServerMediaSession(streamName);
      Boolean smsExists = sms != NULL;

      // Handle the four possibilities for "fileExists" and "smsExists":
      if (!fileExists) {
        if (smsExists) {
          // "sms" was created for a file that no longer exists. Remove
   it:
          removeServerMediaSession(sms);
        }
        return NULL;
      } else {
        if(smsExists) {
   removeServerMediaSession(sms);
            sms=NULL;
        }
        sms = createNewSMS(envir(), streamName, fid);
   addServerMediaSession(sms);
        fclose(fid);
        return sms;
      }
   }


This way it seems to work, but we are not sure if we did it in the right way. Actually we are worried about possible concurrency issues (e.g. what if a new request deleting a previous session that is still in use?). Do you think we can go on using this little hack or we should approach the problem in another way?

Thanks in advance
Nadir



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

Reply via email to