[Live-devel] [RFC PATCH] Add option to disable RTCP
Julian Scheel
julian at jusst.de
Wed Jan 27 03:24:29 PST 2016
Hi Ross,
we have the need to create a RTSP Session without a RTCP Instance because of a
Server that has a bug causing it not to terminate sessions after it received
an RTCP report from the client.
I came up with the attached patch, which feels really ugly and I'm pretty sure
could have unexpected side-effects. Would you mind taking a look and maybe
propose a better way to do this?
Thanks,
Julian
---
Allow connections without a RTCP port to be configured.
---
liveMedia/MediaSession.cpp | 6 +++++-
liveMedia/RTSPClient.cpp | 18 ++++++++++++++----
liveMedia/include/MediaSession.hh | 3 +++
3 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/liveMedia/MediaSession.cpp b/liveMedia/MediaSession.cpp
index a5b13d0..54e9346 100644
--- a/liveMedia/MediaSession.cpp
+++ b/liveMedia/MediaSession.cpp
@@ -821,7 +821,7 @@ Boolean MediaSubsession::initiate(int useSpecialRTPoffset) {
}
// Finally, create our RTCP instance. (It starts running automatically)
- if (fRTPSource != NULL && fRTCPSocket != NULL) {
+ if (fRTPSource != NULL && fRTCPSocket != NULL && !fNoRTCP) {
// If bandwidth is specified, use it and add 5% for RTCP overhead.
// Otherwise make a guess at 500 kbps.
unsigned totSessionBandwidth
@@ -867,6 +867,10 @@ Boolean MediaSubsession::setClientPortNum(unsigned short portNum) {
return True;
}
+void MediaSubsession::setNoRTCP(Boolean enable) {
+ fNoRTCP = enable;
+}
+
char const* MediaSubsession::attrVal_str(char const* attrName) const {
SDPAttribute* attr = (SDPAttribute*)(fAttributeTable->Lookup(attrName));
if (attr == NULL) return "";
diff --git a/liveMedia/RTSPClient.cpp b/liveMedia/RTSPClient.cpp
index fc68042..f659ff5 100644
--- a/liveMedia/RTSPClient.cpp
+++ b/liveMedia/RTSPClient.cpp
@@ -662,9 +662,15 @@ Boolean RTSPClient::setRequestFields(RequestRecord* request,
char const* transportFmt;
if (strcmp(subsession.protocolName(), "UDP") == 0) {
suffix = "";
- transportFmt = "Transport: RAW/RAW/UDP%s%s%s=%d-%d\r\n";
+ if (subsession.noRTCP())
+ transportFmt = "Transport: RAW/RAW/UDP%s%s%s=%d\r\n";
+ else
+ transportFmt = "Transport: RAW/RAW/UDP%s%s%s=%d-%d\r\n";
} else {
- transportFmt = "Transport: RTP/AVP%s%s%s=%d-%d\r\n";
+ if (subsession.noRTCP())
+ transportFmt = "Transport: RTP/AVP%s%s%s=%d\r\n";
+ else
+ transportFmt = "Transport: RTP/AVP%s%s%s=%d-%d\r\n";
}
cmdURL = new char[strlen(prefix) + strlen(separator) + strlen(suffix) + 1];
@@ -699,8 +705,12 @@ Boolean RTSPClient::setRequestFields(RequestRecord* request,
unsigned transportSize = strlen(transportFmt)
+ strlen(transportTypeStr) + strlen(modeStr) + strlen(portTypeStr) + 2*5 /* max port len */;
char* transportStr = new char[transportSize];
- sprintf(transportStr, transportFmt,
- transportTypeStr, modeStr, portTypeStr, rtpNumber, rtcpNumber);
+ if (subsession.noRTCP())
+ sprintf(transportStr, transportFmt,
+ transportTypeStr, modeStr, portTypeStr, rtpNumber);
+ else
+ sprintf(transportStr, transportFmt,
+ transportTypeStr, modeStr, portTypeStr, rtpNumber, rtcpNumber);
// When sending more than one "SETUP" request, include a "Session:" header in the 2nd and later commands:
char* sessionStr = createSessionString(fLastSessionId);
diff --git a/liveMedia/include/MediaSession.hh b/liveMedia/include/MediaSession.hh
index f2ea909..107fcdc 100644
--- a/liveMedia/include/MediaSession.hh
+++ b/liveMedia/include/MediaSession.hh
@@ -168,6 +168,7 @@ public:
char const* protocolName() const { return fProtocolName; }
char const* controlPath() const { return fControlPath; }
Boolean isSSM() const { return fSourceFilterAddr.s_addr != 0; }
+ Boolean noRTCP() const { return fNoRTCP; }
unsigned short videoWidth() const { return fVideoWidth; }
unsigned short videoHeight() const { return fVideoHeight; }
@@ -207,6 +208,7 @@ public:
// description does not specfy a client port number - an ephemeral
// (even) port number is chosen.) This routine must *not* be
// called after initiate().
+ void setNoRTCP(Boolean enable);
void receiveRawMP3ADUs() { fReceiveRawMP3ADUs = True; } // optional hack for audio/MPA-ROBUST; must not be called after initiate()
void receiveRawJPEGFrames() { fReceiveRawJPEGFrames = True; } // optional hack for video/JPEG; must not be called after initiate()
char*& connectionEndpointName() { return fConnectionEndpointName; }
@@ -312,6 +314,7 @@ protected:
char* fControlPath; // holds optional a=control: string
struct in_addr fSourceFilterAddr; // used for SSM
unsigned fBandwidth; // in kilobits-per-second, from b= line
+ Boolean fNoRTCP; // disable rtcp port announcement
double fPlayStartTime;
double fPlayEndTime;
--
2.7.0
More information about the live-devel
mailing list