[Live-devel] resending the describe command

sampsa sampsa.riikonen at dasys.fi
Thu Aug 25 00:37:15 PDT 2016


Hi Ross,

Thanks for the suggestion.  I have tried to solve this according to your 
advice, but no (complete) success yet.

* It works .. almost.
* I am receiving frames .. then I cut the internet connection and put it 
on again .. restart tasks are working ok, rtsp negotiation starts and I 
start getting frames again ..
* .. however, when the program starts receiving frames again, I get each 
frame twice !
* It seems as if I had not closed down the media streams.
* .. however, I am doing exacly this as you can see from the code below
* I think I should be calling "Medium::close" also to the client 
instance, but if I try to do this (see the sectios marked with "program 
breaks"), the task functions seem to break


Details follow.  Any tip highly appreciated!

Regards,

Sampsa


1) I have a scheduled watchdog process (that reschedules itself to get a 
periodic checking) that checks if frames have arrived.  If no frame has 
arrived in x time, the watchdog launches:

env.taskScheduler().scheduleDelayedTask(1*1000*1000,(TaskFunc*)restartMeTask,(void*)client); 
[here client is a pointer of the type MyRTSPClient]

2) In "continueAfterDESCRIBE" I do the following (please note that here 
we are using "restartMeTask0" instead of "restartMeTask" .. these are 
declared below):

-------------------
void continueAfterDESCRIBE(RTSPClient* client, int resultCode, char* 
resultString) {
   ...
   if (resultCode!=0) {
       env << "could not get SDP info.. lets do this again\n";
((MyRTSPClient*)client)->mytask=env.taskScheduler().scheduleDelayedTask(5*1000*1000,(TaskFunc*)restartMeTask0,(void*)client);
       return;
     }
   ...
   session=MediaSession::createNew(env, resultString);
   ...
   if (session==NULL) {
     env << "Empty media session!  Let's do this again\n";
((MyRTSPClient*)client)->mytask=env.taskScheduler().scheduleDelayedTask(5*1000*1000,(TaskFunc*)restartMeTask0,(void*)client);
     return;
   }
   ...
-----------------

3) The restart tasks look as follows:

-----------------


void restartMeTask0(void* cdata) { // this is for cases when no 
MediaSession could be created (called from continueAfterDESCRIBE)
   MyRTSPClient* oldclient;
   MyRTSPClient* newclient;

   std::cout << "\nrestartMeTask0!\n";
   oldclient=(MyRTSPClient*)cdata;

   std::cout << "\nrestartMeTask0: re-creating client\n";
newclient=MyRTSPClient::createNew(oldclient->envir(),oldclient->url(),oldclient->po,1,"restarted");

   /* // program breaks
   std::cout << "closing client..\n";
   Medium::close(oldclient); // here? nope ..
   std::cout << ".. client closed \n";
   */

   std::cout << "\nrestartMeTask0: starting client\n";
   newclient->sendDescribeCommand(continueAfterDESCRIBE);
}


void restartMeTask(void* cdata) { // in this version, we shut down 
subsession sinks (i.e. we got frames at some instant, but then they 
stopped coming)
   MyRTSPClient* oldclient;
   MyRTSPClient* newclient;
   MediaSubsession* subsession;

   std::cout << "\nrestartMeTask!\n";
   oldclient=(MyRTSPClient*)cdata;

   std::cout << "\nrestartMeTask 2!\n";
   if (oldclient->currentsession != NULL) {
     std::cout << "\nFound MediaSession\n";
     MediaSubsessionIterator iter(*(oldclient->currentsession)); // 
crashes here if there was no decent MediaSession
     std::cout << "\nGot iterator\n";
     while ((subsession = iter.next()) != NULL) {
       std::cout << "closing subsession..\n";
       Medium::close(subsession->sink); // we're closing the sinks here, 
so we should not be receiving frames from them anymore, right?
       subsession->sink=NULL;
       std::cout << "..closed subsession\n";
       }
   }

   std::cout << "\nrestartMeTask: re-creating client\n";
newclient=MyRTSPClient::createNew(oldclient->envir(),oldclient->url(),oldclient->po,1,"restarted");

   /* // program breaks
   std::cout << "closing client..\n";
   Medium::close(oldclient);
   std::cout << ".. client closed \n";
   */

   std::cout << "\nrestartMeTask: starting client\n";
   newclient->sendDescribeCommand(continueAfterDESCRIBE);

   /* // program breaks
   std::cout << "closing client..\n";
   Medium::close(oldclient);
   std::cout << ".. client closed \n";
   */
}


On 04.08.2016 17:59, Ross Finlayson wrote:
> If an error occurs when sending a RTSP command, the “RTSPClient” object gets reset - which includes setting its “rtsp://“ URL to NULL.  The only way to then send another command is to do so using a *new* “RTSPClient” object.  I.e.,
> 	- call Medlium::close() on the existing “RTSPClient” object, then
> 	- create a new “RTSPClient” object (with the proper “rtsp://“ URL), then
> 	- call “sendDescribeCommand()” on the new “RTSPClient” object
>
>
> Ross Finlayson
> Live Networks, Inc.
> http://www.live555.com/
>
>
> _______________________________________________
> live-devel mailing list
> live-devel at lists.live555.com
> http://lists.live555.com/mailman/listinfo/live-devel



More information about the live-devel mailing list