[Live-devel] StreamReplicator with FileSink problem

Ross Finlayson finlayson at live555.com
Tue Jan 22 10:08:49 PST 2013


> On Thu, 10 Jan 2013 11:00:43 -0800, Ross Finlayson wrote
>> Instead, try making the following change to 
>> "FileSink::afterGettingFrame()" (lines 130-132 of 
>> "liveMedia/FileSink.cpp"): Change the order of the calls to    
>> onSourceClosure(this); and    stopPlaying(); so that "stopPlaying()" 
>> is called first, before "onSourceClosure(this)".
>> 
>> Let us know if this works for you.  (If so, I'll make the change in 
>> the next release of the software.)
> 
> 1.
> Yes and no. It did work on the testReplicator app

OK, so I'll make that change (changing the order of the calls to "onSourceClosure(this);" and "stopPlaying();" in "FileSink::afterGettingFrame()") in the next release of the software.


> The main difference - regarding this issue - between our server and the
> testReplicator app is that, after an error occurs trying to write a video file,
> we schedule the writing to start again at a later time. We do that by overriding
> the MediaSink::stopPlaying method in our own FileSink class:
> 
> virtual void stopPlaying() {
>  MediaSink::stopPlaying();
> 
>  // schedule to restart in 10 secs
>  envir() << "OurFileSink stopped! Scheduling to restart in 10 secs.\n";
>  envir().taskScheduler().scheduleDelayedTask(10000000,
>      (TaskFunc *) OurFileSink::startPlaying, this);
> }

No - that's a bad idea.  You shouldn't be redefining a virtual function to do something completely unrelated to what the rest of the code - that calls this virtual function - expects.  (That's why you keep running into trouble :-)

The right place to be scheduling a new 'playing' task is in your 'after playing' function - i.e., the function that you passed as a parameter when you called "startPlaying()" on your "FileSink" subclass.  That 'after playing' function will get called, automatically, when writes to the file fail (or if the input stream closes) - as a result of the call to "onSourceClosure(this);".  So that's where you should be scheduling your new task.


> I'm attaching the StreamReplicator class with our patches

I didn't see any attachment!


> 2.
> Also, we needed to change the visibility of the FileSink::continuePlaying()
> method to protected

OK, I'll make that change (along with the change to the implementation of "FileSink::afterGettingFrame()" - noted earlier) in the next release of the software.

Ross Finlayson
Live Networks, Inc.
http://www.live555.com/

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.live555.com/pipermail/live-devel/attachments/20130122/c3e9b840/attachment.html>


More information about the live-devel mailing list