Hi Ross,<br><br>I have modified OnDemandServerMediaSubsession, FileServerMediaSubsession and MPEG2TransportFileServerMediaSubsession to handle the session closure<br>&nbsp;on source end. <br><br><br>*** include/OnDemandServerMediaSubsession.hh&nbsp;&nbsp;&nbsp; 2007-08-03 06:44:
32.000000000 +0200<br>--- include/OnDemandServerMediaSubsession.hh.new &nbsp;&nbsp; 2007-08-03 17:46:37.000000000 +0200<br>***************<br>*** 32,38 ****<br>&nbsp; class OnDemandServerMediaSubsession: public ServerMediaSubsession {<br>
&nbsp; protected: // we&#39;re a virtual base class<br>&nbsp;&nbsp;&nbsp; OnDemandServerMediaSubsession(UsageEnvironment&amp; env, Boolean reuseFirstSource,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portNumBits initialPortNum = 6970);<br>&nbsp;&nbsp;&nbsp; virtual ~OnDemandServerMediaSubsession();
<br>&nbsp; <br>&nbsp; protected: // redefined virtual functions<br>--- 32,38 ----<br>&nbsp; class OnDemandServerMediaSubsession: public ServerMediaSubsession {<br>&nbsp; protected: // we&#39;re a virtual base class<br>&nbsp;&nbsp;&nbsp; OnDemandServerMediaSubsession(UsageEnvironment&amp; env, Boolean reuseFirstSource,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean tearDownOnSourceEnd = False, portNumBits initialPortNum = 6970);<br>&nbsp;&nbsp;&nbsp; virtual ~OnDemandServerMediaSubsession();<br>&nbsp; <br>&nbsp; protected: // redefined virtual functions<br>***************
<br>*** 75,80 ****<br>--- 75,83 ----<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned char rtpPayloadTypeIfDynamic,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FramedSource* inputSource) = 0;<br>&nbsp; <br>+ protected:<br>+&nbsp;&nbsp; Boolean fTearDownOnSourceEnd;
<br>+ <br>&nbsp; private:<br>&nbsp;&nbsp;&nbsp; void setSDPLinesFromRTPSink(RTPSink* rtpSink, FramedSource* inputSource);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // used to implement &quot;sdpLines()&quot;<br><br><br><br>*** OnDemandServerMediaSubsession.cpp&nbsp;&nbsp; 2007-08-03 06:44:
32.000000000 +0200<br>--- OnDemandServerMediaSubsession.cpp.new &nbsp; 2007-08-03 18:02:49.000000000 +0200<br>***************<br>*** 27,35 ****<br>&nbsp; OnDemandServerMediaSubsession<br>&nbsp; ::OnDemandServerMediaSubsession(UsageEnvironment&amp; env,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portNumBits initialPortNum)<br>&nbsp;&nbsp;&nbsp; : ServerMediaSubsession(env),<br>!&nbsp;&nbsp;&nbsp;&nbsp; fReuseFirstSource(reuseFirstSource), fInitialPortNum(initialPortNum),
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fLastStreamToken(NULL), fSDPLines(NULL) {<br>&nbsp;&nbsp;&nbsp; fDestinationsHashTable = HashTable::create(ONE_WORD_HASH_KEYS);<br>&nbsp;&nbsp;&nbsp; gethostname(fCNAME, sizeof fCNAME);<br>--- 27,37 ----<br>&nbsp; OnDemandServerMediaSubsession<br>
&nbsp; ::OnDemandServerMediaSubsession(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource,<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean tearDownOnSourceEnd,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; portNumBits initialPortNum)
<br>&nbsp;&nbsp;&nbsp; : ServerMediaSubsession(env),<br>!&nbsp;&nbsp;&nbsp;&nbsp; fTearDownOnSourceEnd(tearDownOnSourceEnd), fReuseFirstSource(reuseFirstSource),<br>!&nbsp;&nbsp;&nbsp;&nbsp; fInitialPortNum(initialPortNum),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fLastStreamToken(NULL), fSDPLines(NULL) {<br>
&nbsp;&nbsp;&nbsp; fDestinationsHashTable = HashTable::create(ONE_WORD_HASH_KEYS);<br>&nbsp;&nbsp;&nbsp; gethostname(fCNAME, sizeof fCNAME);<br>***************<br>*** 123,128 ****<br>--- 125,132 ----<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; FramedSource* mediaSource() const { return fMediaSource; }
<br>&nbsp; <br>+&nbsp;&nbsp; Boolean tearDownOnSourceEnd() const { return fMaster.fTearDownOnSourceEnd; }<br>+ <br>&nbsp; private:<br>&nbsp;&nbsp;&nbsp; OnDemandServerMediaSubsession&amp; fMaster;<br>&nbsp;&nbsp;&nbsp; Boolean fAreCurrentlyPlaying;<br>***************<br>
*** 393,399 ****<br>&nbsp; <br>&nbsp; static void afterPlayingStreamState(void* clientData) {<br>&nbsp;&nbsp;&nbsp; StreamState* streamState = (StreamState*)clientData;<br>!&nbsp;&nbsp; if (streamState-&gt;streamDuration() == 0.0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // When the input stream ends, tear it down.&nbsp; This will cause a RTCP &quot;BYE&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // to be sent to each client, teling it that the stream has ended.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // (Because the stream didn&#39;t have a known duration, there was no other<br>--- 397,403 ----<br>&nbsp; <br>&nbsp; static void afterPlayingStreamState(void* clientData) {
<br>&nbsp;&nbsp;&nbsp; StreamState* streamState = (StreamState*)clientData;<br>!&nbsp;&nbsp; if ((streamState-&gt;tearDownOnSourceEnd() == True) || (streamState-&gt;streamDuration() == 0.0)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // When the input stream ends, tear it down.&nbsp; This will cause a RTCP &quot;BYE&quot;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // to be sent to each client, teling it that the stream has ended.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // (Because the stream didn&#39;t have a known duration, there was no other<br><br><br><br>*** include/FileServerMediaSubsession.hh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2007-08-03 06:44:
32.000000000 +0200<br>--- include/FileServerMediaSubsession.hh.new &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2007-08-03 18:24:09.000000000 +0200<br>***************<br>*** 29,35 ****<br>&nbsp; class FileServerMediaSubsession: public OnDemandServerMediaSubsession {
<br>&nbsp; protected: // we&#39;re a virtual base class<br>&nbsp;&nbsp;&nbsp; FileServerMediaSubsession(UsageEnvironment&amp; env, char const* fileName,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource);<br>&nbsp;&nbsp;&nbsp; virtual ~FileServerMediaSubsession();
<br>&nbsp; <br>&nbsp; protected:<br>--- 29,35 ----<br>&nbsp; class FileServerMediaSubsession: public OnDemandServerMediaSubsession {<br>&nbsp; protected: // we&#39;re a virtual base class<br>&nbsp;&nbsp;&nbsp; FileServerMediaSubsession(UsageEnvironment&amp; env, char const* fileName,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource, Boolean tearDownOnSourceEnd = False);<br>&nbsp;&nbsp;&nbsp; virtual ~FileServerMediaSubsession();<br>&nbsp; <br>&nbsp; protected:<br><br><br><br>*** FileServerMediaSubsession.cpp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2007-08-03 06:44:
32.000000000 +0200<br>--- FileServerMediaSubsession.cpp.new &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2007-08-03 18:27:21.000000000 +0200<br>***************<br>*** 23,30 ****<br>&nbsp; <br>&nbsp; FileServerMediaSubsession<br>&nbsp; ::FileServerMediaSubsession(UsageEnvironment&amp; env, char const* fileName,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource)<br>!&nbsp;&nbsp; : OnDemandServerMediaSubsession(env, reuseFirstSource),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fFileSize(0) {<br>&nbsp;&nbsp;&nbsp; fFileName = strDup(fileName);<br>&nbsp; }<br>--- 23,30 ----<br>&nbsp; <br>&nbsp; FileServerMediaSubsession
<br>&nbsp; ::FileServerMediaSubsession(UsageEnvironment&amp; env, char const* fileName,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource, Boolean tearDownOnSourceEnd)<br>!&nbsp;&nbsp; : OnDemandServerMediaSubsession(env, reuseFirstSource, tearDownOnSourceEnd),
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fFileSize(0) {<br>&nbsp;&nbsp;&nbsp; fFileName = strDup(fileName);<br>&nbsp; }<br><br><br><br><br>*** include/MPEG2TransportFileServerMediaSubsession.hh&nbsp; 2007-08-03 06:44:32.000000000 +0200<br>--- include/MPEG2TransportFileServerMediaSubsession.hh.new&nbsp; 2007-08-03 18:29:
56.000000000 +0200<br>***************<br>*** 36,48 ****<br>&nbsp;&nbsp;&nbsp; static MPEG2TransportFileServerMediaSubsession*<br>&nbsp;&nbsp;&nbsp; createNew(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* dataFileName, char const* indexFileName,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource);<br>&nbsp; <br>&nbsp; protected:<br>&nbsp;&nbsp;&nbsp; MPEG2TransportFileServerMediaSubsession(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* fileName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPEG2TransportStreamIndexFile* indexFile,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // called only by createNew();<br>&nbsp;&nbsp;&nbsp; virtual ~MPEG2TransportFileServerMediaSubsession();<br>&nbsp; <br>--- 36,50 ----<br>&nbsp;&nbsp;&nbsp; static MPEG2TransportFileServerMediaSubsession*
<br>&nbsp;&nbsp;&nbsp; createNew(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* dataFileName, char const* indexFileName,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean tearDownOnSourceEnd = False);<br>&nbsp; <br>&nbsp; protected:
<br>&nbsp;&nbsp;&nbsp; MPEG2TransportFileServerMediaSubsession(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* fileName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPEG2TransportStreamIndexFile* indexFile,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource, <br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean tearDownOnSourceEnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // called only by createNew();<br>&nbsp;&nbsp;&nbsp; virtual ~MPEG2TransportFileServerMediaSubsession();
<br>&nbsp; <br><br><br><br>*** MPEG2TransportFileServerMediaSubsession.cpp 2007-08-03 06:44:32.000000000 +0200<br>--- MPEG2TransportFileServerMediaSubsession.cpp.new 2007-08-03 18:32:31.000000000 +0200<br>***************<br>*** 71,77 ****
<br>&nbsp; MPEG2TransportFileServerMediaSubsession::createNew(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* fileName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* indexFileName,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource) {<br>&nbsp;&nbsp;&nbsp; if (indexFileName != NULL &amp;&amp; reuseFirstSource) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // It makes no sense to support trick play if all clients use the same source.&nbsp; Fix this:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env &lt;&lt; &quot;MPEG2TransportFileServerMediaSubsession::createNew(): ignoring the index file name, because \&quot;reuseFirstSource\&quot; is set\n&quot;;<br>--- 71,78 ----<br>&nbsp; MPEG2TransportFileServerMediaSubsession::createNew(UsageEnvironment&amp; env,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* fileName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* indexFileName,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean tearDownOnSourceEnd) {<br>&nbsp;&nbsp;&nbsp; if (indexFileName != NULL &amp;&amp; reuseFirstSource) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // It makes no sense to support trick play if all clients use the same source.&nbsp; Fix this:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env &lt;&lt; &quot;MPEG2TransportFileServerMediaSubsession::createNew(): ignoring the index file name, because \&quot;reuseFirstSource\&quot; is set\n&quot;;<br>***************<br>*** 79,93 ****<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; MPEG2TransportStreamIndexFile* indexFile = MPEG2TransportStreamIndexFile::createNew(env, indexFileName);
<br>&nbsp;&nbsp;&nbsp; return new MPEG2TransportFileServerMediaSubsession(env, fileName, indexFile,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reuseFirstSource);<br>&nbsp; }<br>&nbsp; <br>&nbsp; MPEG2TransportFileServerMediaSubsession<br>
&nbsp; ::MPEG2TransportFileServerMediaSubsession(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* fileName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPEG2TransportStreamIndexFile* indexFile,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource)<br>!&nbsp;&nbsp; : FileServerMediaSubsession(env, fileName, reuseFirstSource),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fIndexFile(indexFile), fDuration(0.0), fClientSessionHashTable(NULL) {<br>
&nbsp;&nbsp;&nbsp; if (fIndexFile != NULL) { // we support &#39;trick play&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fDuration = fIndexFile-&gt;getPlayingDuration();<br>--- 80,95 ----<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; MPEG2TransportStreamIndexFile* indexFile = MPEG2TransportStreamIndexFile::createNew(env, indexFileName);
<br>&nbsp;&nbsp;&nbsp; return new MPEG2TransportFileServerMediaSubsession(env, fileName, indexFile,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reuseFirstSource, tearDownOnSourceEnd);<br>&nbsp; }<br>&nbsp; <br>&nbsp; MPEG2TransportFileServerMediaSubsession
<br>&nbsp; ::MPEG2TransportFileServerMediaSubsession(UsageEnvironment&amp; env,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char const* fileName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MPEG2TransportStreamIndexFile* indexFile,
<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean reuseFirstSource,<br>!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boolean tearDownOnSourceEnd)<br>!&nbsp;&nbsp; : FileServerMediaSubsession(env, fileName, reuseFirstSource, tearDownOnSourceEnd),
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fIndexFile(indexFile), fDuration(0.0), fClientSessionHashTable(NULL) {<br>&nbsp;&nbsp;&nbsp; if (fIndexFile != NULL) { // we support &#39;trick play&#39;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fDuration = fIndexFile-&gt;getPlayingDuration();<br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br><br><br>Is this work correct ?<br><br>Thank you for your attention<br><br>Massimo Zito<br><br><br>