Skip to content

Commit

Permalink
Add back -D option
Browse files Browse the repository at this point in the history
  • Loading branch information
Roman Gaufman committed Jun 7, 2017
1 parent 0813cc6 commit 41f8160
Show file tree
Hide file tree
Showing 4 changed files with 1,015 additions and 13 deletions.
61 changes: 54 additions & 7 deletions liveMedia/ProxyServerMediaSession.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,20 +75,20 @@ defaultCreateNewProxyRTSPClientFunc(ProxyServerMediaSession& ourServerMediaSessi
char const* rtspURL,
char const* username, char const* password,
portNumBits tunnelOverHTTPPortNum, int verbosityLevel,
int socketNumToServer) {
int socketNumToServer, unsigned interPacketGapMaxTime) {
return new ProxyRTSPClient(ourServerMediaSession, rtspURL, username, password,
tunnelOverHTTPPortNum, verbosityLevel, socketNumToServer);
tunnelOverHTTPPortNum, verbosityLevel, socketNumToServer, interPacketGapMaxTime);
}

ProxyServerMediaSession* ProxyServerMediaSession
::createNew(UsageEnvironment& env, GenericMediaServer* ourMediaServer,
char const* inputStreamURL, char const* streamName,
char const* username, char const* password,
portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer,
MediaTranscodingTable* transcodingTable) {
MediaTranscodingTable* transcodingTable, unsigned interPacketGapMaxTime) {
return new ProxyServerMediaSession(env, ourMediaServer, inputStreamURL, streamName, username, password,
tunnelOverHTTPPortNum, verbosityLevel, socketNumToServer,
transcodingTable);
transcodingTable, interPacketGapMaxTime);
}


Expand All @@ -99,6 +99,7 @@ ::ProxyServerMediaSession(UsageEnvironment& env, GenericMediaServer* ourMediaSer
portNumBits tunnelOverHTTPPortNum, int verbosityLevel,
int socketNumToServer,
MediaTranscodingTable* transcodingTable,
unsigned interPacketGapMaxTime,
createNewProxyRTSPClientFunc* ourCreateNewProxyRTSPClientFunc,
portNumBits initialPortNum, Boolean multiplexRTCPWithRTP)
: ServerMediaSession(env, streamName, NULL, NULL, False, NULL),
Expand All @@ -114,7 +115,7 @@ ::ProxyServerMediaSession(UsageEnvironment& env, GenericMediaServer* ourMediaSer
= (*fCreateNewProxyRTSPClientFunc)(*this, inputStreamURL, username, password,
tunnelOverHTTPPortNum,
verbosityLevel > 0 ? verbosityLevel-1 : verbosityLevel,
socketNumToServer);
socketNumToServer, interPacketGapMaxTime);
ProxyRTSPClient::sendDESCRIBE(fProxyRTSPClient);
}

Expand Down Expand Up @@ -243,13 +244,16 @@ UsageEnvironment& operator<<(UsageEnvironment& env, const ProxyRTSPClient& proxy

ProxyRTSPClient::ProxyRTSPClient(ProxyServerMediaSession& ourServerMediaSession, char const* rtspURL,
char const* username, char const* password,
portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer)
portNumBits tunnelOverHTTPPortNum, int verbosityLevel, int socketNumToServer,
unsigned interPacketGapMaxTime)
: RTSPClient(ourServerMediaSession.envir(), rtspURL, verbosityLevel, "ProxyRTSPClient",
tunnelOverHTTPPortNum == (portNumBits)(~0) ? 0 : tunnelOverHTTPPortNum, socketNumToServer),
fOurServerMediaSession(ourServerMediaSession), fOurURL(strDup(rtspURL)), fStreamRTPOverTCP(tunnelOverHTTPPortNum != 0),
fSetupQueueHead(NULL), fSetupQueueTail(NULL), fNumSetupsDone(0), fNextDESCRIBEDelay(1),
fTotNumPacketsReceived(~0), fInterPacketGapMaxTime(interPacketGapMaxTime),
fServerSupportsGetParameter(False), fLastCommandWasPLAY(False), fDoneDESCRIBE(False),
fLivenessCommandTask(NULL), fDESCRIBECommandTask(NULL), fSubsessionTimerTask(NULL), fResetTask(NULL) {
fLivenessCommandTask(NULL), fDESCRIBECommandTask(NULL), fSubsessionTimerTask(NULL), fResetTask(NULL),
fInterPacketGapsTask(NULL) {
if (username != NULL && password != NULL) {
fOurAuthenticator = new Authenticator(username, password);
} else {
Expand All @@ -262,11 +266,13 @@ void ProxyRTSPClient::reset() {
envir().taskScheduler().unscheduleDelayedTask(fDESCRIBECommandTask); fDESCRIBECommandTask = NULL;
envir().taskScheduler().unscheduleDelayedTask(fSubsessionTimerTask); fSubsessionTimerTask = NULL;
envir().taskScheduler().unscheduleDelayedTask(fResetTask); fResetTask = NULL;
envir().taskScheduler().unscheduleDelayedTask(fInterPacketGapsTask); fInterPacketGapsTask = NULL;

fSetupQueueHead = fSetupQueueTail = NULL;
fNumSetupsDone = 0;
fNextDESCRIBEDelay = 1;
fLastCommandWasPLAY = False;
fTotNumPacketsReceived = ~0;
fDoneDESCRIBE = False;

RTSPClient::reset();
Expand Down Expand Up @@ -396,6 +402,7 @@ void ProxyRTSPClient::continueAfterPLAY(int resultCode) {
scheduleReset();
return;
}
if (fInterPacketGapsTask == NULL) checkInterPacketGaps_(True);
}

void ProxyRTSPClient::scheduleLivenessCommand() {
Expand Down Expand Up @@ -436,6 +443,45 @@ void ProxyRTSPClient::sendLivenessCommand(void* clientData) {
#endif
}

void ProxyRTSPClient::checkInterPacketGaps_(Boolean delayReset) {
if (fInterPacketGapMaxTime == 0) return; // we're not checking

// Check each subsession, counting up how many packets have been received:
unsigned newTotNumPacketsReceived = 0;

MediaSubsessionIterator iter(*fOurServerMediaSession.fClientMediaSession);
MediaSubsession* subsession;
while ((subsession = iter.next()) != NULL) {
RTPSource* src = subsession->rtpSource();
if (src == NULL) continue;
newTotNumPacketsReceived += src->receptionStatsDB().totNumPacketsReceived();
}

//envir() << *this << "::doLivenessCheck fTotNumPacketsReceived: " << fTotNumPacketsReceived
// << ", newTotNumPacketsReceived: " << newTotNumPacketsReceived << "\n";

if (newTotNumPacketsReceived == fTotNumPacketsReceived) {
// No additional packets have been received since the last time we
// checked, so end this stream:
// *env << "Closing session, because we stopped receiving packets.\n";
if (fVerbosityLevel > 0) {
envir() << *this << "::doLivenessCheck last packet received: >" << fInterPacketGapMaxTime
<< " seconds ago. Resetting session\n";
}
if (delayReset) scheduleReset();
else doReset();
} else {
fTotNumPacketsReceived = newTotNumPacketsReceived;
// Check again, after the specified delay:
fInterPacketGapsTask = envir().taskScheduler().scheduleDelayedTask(fInterPacketGapMaxTime*MILLION, checkInterPacketGaps, this);
}
}

void ProxyRTSPClient::checkInterPacketGaps(void* clientData) {
ProxyRTSPClient* rtspClient = (ProxyRTSPClient*)clientData;
rtspClient->checkInterPacketGaps_(False);
}

void ProxyRTSPClient::scheduleReset() {
if (fVerbosityLevel > 0) {
envir() << "ProxyRTSPClient::scheduleReset\n";
Expand Down Expand Up @@ -649,6 +695,7 @@ void ProxyServerMediaSubsession::closeStreamSource(FramedSource* inputSource) {
// Send a "PAUSE" for the whole stream.
proxyRTSPClient->sendPauseCommand(fClientMediaSubsession.parentSession(), NULL, proxyRTSPClient->auth());
proxyRTSPClient->fLastCommandWasPLAY = False;
envir().taskScheduler().unscheduleDelayedTask(proxyRTSPClient->fInterPacketGapsTask); proxyRTSPClient->fInterPacketGapsTask = NULL;
}
}
}
Expand Down
Loading

0 comments on commit 41f8160

Please sign in to comment.