[Live-devel] How to add remove a ServerMediaSubssesion on the fly?
???????? ???????
iskaz at intracomdefense.com
Fri Mar 27 05:59:30 PDT 2009
Hi Ross,
I have written an mpeg4 streamer based on live555 using (My)DeviceSource
class, (My)VideoFileServerMediaSubsession class, and the
MPEG4VideoStreamDiscreteFramer (based on your testOnDemandRTSPServer
example).
Everything works fine, but I would like to ask you the following:
While an rtsp client is connected to the server I would like to remove
the mediaSession and set up another one. How to do that?
I have a function which add's an sms:
fnct_add(){
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
sms->addSubsession(XvidVideoFileServerMediaSubsession::createNew(*env,
inputFileName, reuseFirstSource));
rtspServer->addServerMediaSession(sms);
}
and one function which removes the sms:
fnct_remove(){
sms->close(*env,streamName);
sms->~ServerMediaSession();
}
I run the
env->taskScheduler().doEventLoop(&watch_event_loop);
in its on process (new thread) and i use the watch_event_loop + a
dummyTask(Null) to control the event loop.
In order to remove an sms I do:
1) set watch_event_loop =1 ion order to stop the endless loop
2) remove the sms ( sms->close(*env,streamName); and
sms->~ServerMediaSession();
3)stop the tread which runs the
env->taskScheduler().doEventLoop(&watch_event_loop);
in order to add a new sms I do:
1) add a new sms with
ServerMediaSession* sms
= ServerMediaSession::createNew(*env, streamName, streamName,
descriptionString);
sms->addSubsession(XvidVideoFileServerMediaSubsession::createNew(*env,
inputFileName, reuseFirstSource));
rtspServer->addServerMediaSession(sms);
2) set watch_event_loop=0
3) create a new thread which runs the
env->taskScheduler().doEventLoop(&watch_event_loop);
Generally this process seems to work, but while the client (mplayer) is
connected and the server is streaming, if we remove the sms the client
stops playing the video stream but it does not close the connection with
the server and therefore live555 does not call the deconstructor of
(My)DeviceSource class (which it does, if I stop the client first).
if I call again the function which add a new sms, then and only then
live555 call's the deconstructor of (My)DeviceSource class first (which
stops my frame grabber card) and then initialize a new instance of
(My)DeviceSource (which starts my frame grabber card) when a client
atemps to connect to the server again.
Why after the execution of sms->~ServerMediaSession(); does not call
the deconstructor of (My)DeviceSource class?
Why the connection between client and server does not close, when I
remove the sms?
Which is the right way to add /remove an sms during a connection between
server and client?
More information about the live-devel
mailing list