#include <OnDemandServerMediaSubsession.hh>
Inheritance diagram for OnDemandServerMediaSubsession:


Public Member Functions | |
| unsigned | trackNumber () const |
| char const * | trackId () |
| virtual void | testScaleFactor (float &scale) |
| virtual float | duration () const |
| void | setServerAddressAndPortForSDP (netAddressBits addressBits, portNumBits portBits) |
| UsageEnvironment & | envir () const |
| char const * | name () const |
| virtual Boolean | isSource () const |
| virtual Boolean | isSink () const |
| virtual Boolean | isRTCPInstance () const |
| virtual Boolean | isRTSPClient () const |
| virtual Boolean | isRTSPServer () const |
| virtual Boolean | isMediaSession () const |
| virtual Boolean | isServerMediaSession () const |
| virtual Boolean | isDarwinInjector () const |
Static Public Member Functions | |
| static Boolean | lookupByName (UsageEnvironment &env, char const *mediumName, Medium *&resultMedium) |
| static void | close (UsageEnvironment &env, char const *mediumName) |
| static void | close (Medium *medium) |
Protected Member Functions | |
| OnDemandServerMediaSubsession (UsageEnvironment &env, Boolean reuseFirstSource, portNumBits initialPortNum=6970) | |
| virtual | ~OnDemandServerMediaSubsession () |
| virtual char const * | sdpLines () |
| virtual void | getStreamParameters (unsigned clientSessionId, netAddressBits clientAddress, Port const &clientRTPPort, Port const &clientRTCPPort, int tcpSocketNum, unsigned char rtpChannelId, unsigned char rtcpChannelId, netAddressBits &destinationAddress, u_int8_t &destinationTTL, Boolean &isMulticast, Port &serverRTPPort, Port &serverRTCPPort, void *&streamToken) |
| virtual void | startStream (unsigned clientSessionId, void *streamToken, TaskFunc *rtcpRRHandler, void *rtcpRRHandlerClientData, unsigned short &rtpSeqNum, unsigned &rtpTimestamp, ServerRequestAlternativeByteHandler *serverRequestAlternativeByteHandler, void *serverRequestAlternativeByteHandlerClientData) |
| virtual void | pauseStream (unsigned clientSessionId, void *streamToken) |
| virtual void | seekStream (unsigned clientSessionId, void *streamToken, double &seekNPT, double streamDuration, u_int64_t &numBytes) |
| virtual void | setStreamScale (unsigned clientSessionId, void *streamToken, float scale) |
| virtual FramedSource * | getStreamSource (void *streamToken) |
| virtual void | deleteStream (unsigned clientSessionId, void *&streamToken) |
| virtual char const * | getAuxSDPLine (RTPSink *rtpSink, FramedSource *inputSource) |
| virtual void | seekStreamSource (FramedSource *inputSource, double &seekNPT, double streamDuration, u_int64_t &numBytes) |
| virtual void | setStreamSourceScale (FramedSource *inputSource, float scale) |
| virtual void | closeStreamSource (FramedSource *inputSource) |
| virtual FramedSource * | createNewStreamSource (unsigned clientSessionId, unsigned &estBitrate)=0 |
| virtual RTPSink * | createNewRTPSink (Groupsock *rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource *inputSource)=0 |
| char const * | rangeSDPLine () const |
| TaskToken & | nextTask () |
Protected Attributes | |
| char * | fSDPLines |
| ServerMediaSession * | fParentSession |
| netAddressBits | fServerAddressForSDP |
| portNumBits | fPortNumForSDP |
Private Member Functions | |
| void | setSDPLinesFromRTPSink (RTPSink *rtpSink, FramedSource *inputSource, unsigned estBitrate) |
Private Attributes | |
| Boolean | fReuseFirstSource |
| portNumBits | fInitialPortNum |
| HashTable * | fDestinationsHashTable |
| void * | fLastStreamToken |
| char | fCNAME [100] |
Friends | |
| class | StreamState |
| class | MediaLookupTable |
Definition at line 38 of file OnDemandServerMediaSubsession.hh.
| OnDemandServerMediaSubsession::OnDemandServerMediaSubsession | ( | UsageEnvironment & | env, | |
| Boolean | reuseFirstSource, | |||
| portNumBits | initialPortNum = 6970 | |||
| ) | [protected] |
Definition at line 26 of file OnDemandServerMediaSubsession.cpp.
References HashTable::create(), and ONE_WORD_HASH_KEYS.
00029 : ServerMediaSubsession(env), 00030 fSDPLines(NULL), fReuseFirstSource(reuseFirstSource), fInitialPortNum(initialPortNum), fLastStreamToken(NULL) { 00031 fDestinationsHashTable = HashTable::create(ONE_WORD_HASH_KEYS); 00032 gethostname(fCNAME, sizeof fCNAME); 00033 fCNAME[sizeof fCNAME-1] = '\0'; // just in case 00034 }
| OnDemandServerMediaSubsession::~OnDemandServerMediaSubsession | ( | ) | [protected, virtual] |
Definition at line 36 of file OnDemandServerMediaSubsession.cpp.
References fDestinationsHashTable, fSDPLines, NULL, and HashTable::RemoveNext().
00036 { 00037 delete[] fSDPLines; 00038 00039 // Clean out the destinations hash table: 00040 while (1) { 00041 Destinations* destinations 00042 = (Destinations*)(fDestinationsHashTable->RemoveNext()); 00043 if (destinations == NULL) break; 00044 delete destinations; 00045 } 00046 delete fDestinationsHashTable; 00047 }
| char const * OnDemandServerMediaSubsession::sdpLines | ( | ) | [protected, virtual] |
Implements ServerMediaSubsession.
Definition at line 50 of file OnDemandServerMediaSubsession.cpp.
References Medium::close(), closeStreamSource(), createNewRTPSink(), createNewStreamSource(), Medium::envir(), fSDPLines, NULL, setSDPLinesFromRTPSink(), and ServerMediaSubsession::trackNumber().
Referenced by setSDPLinesFromRTPSink().
00050 { 00051 if (fSDPLines == NULL) { 00052 // We need to construct a set of SDP lines that describe this 00053 // subsession (as a unicast stream). To do so, we first create 00054 // dummy (unused) source and "RTPSink" objects, 00055 // whose parameters we use for the SDP lines: 00056 unsigned estBitrate; 00057 FramedSource* inputSource = createNewStreamSource(0, estBitrate); 00058 if (inputSource == NULL) return NULL; // file not found 00059 00060 struct in_addr dummyAddr; 00061 dummyAddr.s_addr = 0; 00062 Groupsock dummyGroupsock(envir(), dummyAddr, 0, 0); 00063 unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic 00064 RTPSink* dummyRTPSink 00065 = createNewRTPSink(&dummyGroupsock, rtpPayloadType, inputSource); 00066 00067 setSDPLinesFromRTPSink(dummyRTPSink, inputSource, estBitrate); 00068 Medium::close(dummyRTPSink); 00069 closeStreamSource(inputSource); 00070 } 00071 00072 return fSDPLines; 00073 }
| void OnDemandServerMediaSubsession::getStreamParameters | ( | unsigned | clientSessionId, | |
| netAddressBits | clientAddress, | |||
| Port const & | clientRTPPort, | |||
| Port const & | clientRTCPPort, | |||
| int | tcpSocketNum, | |||
| unsigned char | rtpChannelId, | |||
| unsigned char | rtcpChannelId, | |||
| netAddressBits & | destinationAddress, | |||
| u_int8_t & | destinationTTL, | |||
| Boolean & | isMulticast, | |||
| Port & | serverRTPPort, | |||
| Port & | serverRTCPPort, | |||
| void *& | streamToken | |||
| ) | [protected, virtual] |
Implements ServerMediaSubsession.
Definition at line 76 of file OnDemandServerMediaSubsession.cpp.
References HashTable::Add(), BasicUDPSink::createNew(), createNewRTPSink(), createNewStreamSource(), Medium::envir(), False, fDestinationsHashTable, fInitialPortNum, fLastStreamToken, fReuseFirstSource, increaseSendBufferTo(), NULL, Port::num(), Groupsock::removeAllDestinations(), Socket::socketNum(), StreamState, and ServerMediaSubsession::trackNumber().
00088 { 00089 if (destinationAddress == 0) destinationAddress = clientAddress; 00090 struct in_addr destinationAddr; destinationAddr.s_addr = destinationAddress; 00091 isMulticast = False; 00092 00093 if (fLastStreamToken != NULL && fReuseFirstSource) { 00094 // Special case: Rather than creating a new 'StreamState', 00095 // we reuse the one that we've already created: 00096 serverRTPPort = ((StreamState*)fLastStreamToken)->serverRTPPort(); 00097 serverRTCPPort = ((StreamState*)fLastStreamToken)->serverRTCPPort(); 00098 ++((StreamState*)fLastStreamToken)->referenceCount(); 00099 streamToken = fLastStreamToken; 00100 } else { 00101 // Normal case: Create a new media source: 00102 unsigned streamBitrate; 00103 FramedSource* mediaSource 00104 = createNewStreamSource(clientSessionId, streamBitrate); 00105 00106 // Create 'groupsock' and 'sink' objects for the destination, 00107 // using previously unused server port numbers: 00108 RTPSink* rtpSink; 00109 BasicUDPSink* udpSink; 00110 Groupsock* rtpGroupsock; 00111 Groupsock* rtcpGroupsock; 00112 portNumBits serverPortNum; 00113 if (clientRTCPPort.num() == 0) { 00114 // We're streaming raw UDP (not RTP). Create a single groupsock: 00115 NoReuse dummy(envir()); // ensures that we skip over ports that are already in use 00116 for (serverPortNum = fInitialPortNum; ; ++serverPortNum) { 00117 struct in_addr dummyAddr; dummyAddr.s_addr = 0; 00118 00119 serverRTPPort = serverPortNum; 00120 rtpGroupsock = new Groupsock(envir(), dummyAddr, serverRTPPort, 255); 00121 if (rtpGroupsock->socketNum() >= 0) break; // success 00122 } 00123 00124 rtcpGroupsock = NULL; 00125 rtpSink = NULL; 00126 udpSink = BasicUDPSink::createNew(envir(), rtpGroupsock); 00127 } else { 00128 // Normal case: We're streaming RTP (over UDP or TCP). Create a pair of 00129 // groupsocks (RTP and RTCP), with adjacent port numbers (RTP port number even): 00130 NoReuse dummy(envir()); // ensures that we skip over ports that are already in use 00131 for (portNumBits serverPortNum = fInitialPortNum; ; serverPortNum += 2) { 00132 struct in_addr dummyAddr; dummyAddr.s_addr = 0; 00133 00134 serverRTPPort = serverPortNum; 00135 rtpGroupsock = new Groupsock(envir(), dummyAddr, serverRTPPort, 255); 00136 if (rtpGroupsock->socketNum() < 0) { 00137 delete rtpGroupsock; 00138 continue; // try again 00139 } 00140 00141 serverRTCPPort = serverPortNum+1; 00142 rtcpGroupsock = new Groupsock(envir(), dummyAddr, serverRTCPPort, 255); 00143 if (rtcpGroupsock->socketNum() < 0) { 00144 delete rtpGroupsock; 00145 delete rtcpGroupsock; 00146 continue; // try again 00147 } 00148 00149 break; // success 00150 } 00151 00152 unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic 00153 rtpSink = createNewRTPSink(rtpGroupsock, rtpPayloadType, mediaSource); 00154 udpSink = NULL; 00155 } 00156 00157 // Turn off the destinations for each groupsock. They'll get set later 00158 // (unless TCP is used instead): 00159 if (rtpGroupsock != NULL) rtpGroupsock->removeAllDestinations(); 00160 if (rtcpGroupsock != NULL) rtcpGroupsock->removeAllDestinations(); 00161 00162 if (rtpGroupsock != NULL) { 00163 // Try to use a big send buffer for RTP - at least 0.1 second of 00164 // specified bandwidth and at least 50 KB 00165 unsigned rtpBufSize = streamBitrate * 25 / 2; // 1 kbps * 0.1 s = 12.5 bytes 00166 if (rtpBufSize < 50 * 1024) rtpBufSize = 50 * 1024; 00167 increaseSendBufferTo(envir(), rtpGroupsock->socketNum(), rtpBufSize); 00168 } 00169 00170 // Set up the state of the stream. The stream will get started later: 00171 streamToken = fLastStreamToken 00172 = new StreamState(*this, serverRTPPort, serverRTCPPort, rtpSink, udpSink, 00173 streamBitrate, mediaSource, 00174 rtpGroupsock, rtcpGroupsock); 00175 } 00176 00177 // Record these destinations as being for this client session id: 00178 Destinations* destinations; 00179 if (tcpSocketNum < 0) { // UDP 00180 destinations = new Destinations(destinationAddr, clientRTPPort, clientRTCPPort); 00181 } else { // TCP 00182 destinations = new Destinations(tcpSocketNum, rtpChannelId, rtcpChannelId); 00183 } 00184 fDestinationsHashTable->Add((char const*)clientSessionId, destinations); 00185 }
| void OnDemandServerMediaSubsession::startStream | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| TaskFunc * | rtcpRRHandler, | |||
| void * | rtcpRRHandlerClientData, | |||
| unsigned short & | rtpSeqNum, | |||
| unsigned & | rtpTimestamp, | |||
| ServerRequestAlternativeByteHandler * | serverRequestAlternativeByteHandler, | |||
| void * | serverRequestAlternativeByteHandlerClientData | |||
| ) | [protected, virtual] |
Implements ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 187 of file OnDemandServerMediaSubsession.cpp.
References RTPSink::currentSeqNo(), fDestinationsHashTable, HashTable::Lookup(), NULL, RTPSink::presetNextTimestamp(), StreamState::rtpSink(), and StreamState::startPlaying().
Referenced by MPEG2TransportFileServerMediaSubsession::startStream().
00194 { 00195 StreamState* streamState = (StreamState*)streamToken; 00196 Destinations* destinations 00197 = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); 00198 if (streamState != NULL) { 00199 streamState->startPlaying(destinations, 00200 rtcpRRHandler, rtcpRRHandlerClientData, 00201 serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData); 00202 if (streamState->rtpSink() != NULL) { 00203 rtpSeqNum = streamState->rtpSink()->currentSeqNo(); 00204 rtpTimestamp = streamState->rtpSink()->presetNextTimestamp(); 00205 } 00206 } 00207 }
| void OnDemandServerMediaSubsession::pauseStream | ( | unsigned | clientSessionId, | |
| void * | streamToken | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 209 of file OnDemandServerMediaSubsession.cpp.
References fReuseFirstSource, NULL, and StreamState::pause().
Referenced by MPEG2TransportFileServerMediaSubsession::pauseStream(), and MPEG2TransportFileServerMediaSubsession::startStream().
00210 { 00211 // Pausing isn't allowed if multiple clients are receiving data from 00212 // the same source: 00213 if (fReuseFirstSource) return; 00214 00215 StreamState* streamState = (StreamState*)streamToken; 00216 if (streamState != NULL) streamState->pause(); 00217 }
| void OnDemandServerMediaSubsession::seekStream | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| double & | seekNPT, | |||
| double | streamDuration, | |||
| u_int64_t & | numBytes | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 219 of file OnDemandServerMediaSubsession.cpp.
References fReuseFirstSource, StreamState::mediaSource(), NULL, and seekStreamSource().
Referenced by MPEG2TransportFileServerMediaSubsession::seekStream().
00220 { 00221 numBytes = 0; // by default: unknown 00222 00223 // Seeking isn't allowed if multiple clients are receiving data from 00224 // the same source: 00225 if (fReuseFirstSource) return; 00226 00227 StreamState* streamState = (StreamState*)streamToken; 00228 if (streamState != NULL && streamState->mediaSource() != NULL) { 00229 seekStreamSource(streamState->mediaSource(), seekNPT, streamDuration, numBytes); 00230 } 00231 }
| void OnDemandServerMediaSubsession::setStreamScale | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| float | scale | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 233 of file OnDemandServerMediaSubsession.cpp.
References fReuseFirstSource, StreamState::mediaSource(), NULL, and setStreamSourceScale().
Referenced by MPEG2TransportFileServerMediaSubsession::setStreamScale().
00234 { 00235 // Changing the scale factor isn't allowed if multiple clients are receiving data 00236 // from the same source: 00237 if (fReuseFirstSource) return; 00238 00239 StreamState* streamState = (StreamState*)streamToken; 00240 if (streamState != NULL && streamState->mediaSource() != NULL) { 00241 setStreamSourceScale(streamState->mediaSource(), scale); 00242 } 00243 }
| FramedSource * OnDemandServerMediaSubsession::getStreamSource | ( | void * | streamToken | ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Definition at line 245 of file OnDemandServerMediaSubsession.cpp.
References StreamState::mediaSource(), and NULL.
00245 { 00246 if (streamToken == NULL) return NULL; 00247 00248 StreamState* streamState = (StreamState*)streamToken; 00249 return streamState->mediaSource(); 00250 }
| void OnDemandServerMediaSubsession::deleteStream | ( | unsigned | clientSessionId, | |
| void *& | streamToken | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 252 of file OnDemandServerMediaSubsession.cpp.
References StreamState::endPlaying(), fDestinationsHashTable, HashTable::Lookup(), NULL, StreamState::referenceCount(), and HashTable::Remove().
Referenced by MPEG2TransportFileServerMediaSubsession::deleteStream().
00253 { 00254 StreamState* streamState = (StreamState*)streamToken; 00255 00256 // Look up (and remove) the destinations for this client session: 00257 Destinations* destinations 00258 = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); 00259 if (destinations != NULL) { 00260 fDestinationsHashTable->Remove((char const*)clientSessionId); 00261 00262 // Stop streaming to these destinations: 00263 if (streamState != NULL) streamState->endPlaying(destinations); 00264 } 00265 00266 // Delete the "StreamState" structure if it's no longer being used: 00267 if (streamState != NULL) { 00268 if (streamState->referenceCount() > 0) --streamState->referenceCount(); 00269 if (streamState->referenceCount() == 0) { 00270 delete streamState; 00271 streamToken = NULL; 00272 } 00273 } 00274 00275 // Finally, delete the destinations themselves: 00276 delete destinations; 00277 }
| char const * OnDemandServerMediaSubsession::getAuxSDPLine | ( | RTPSink * | rtpSink, | |
| FramedSource * | inputSource | |||
| ) | [protected, virtual] |
Reimplemented in DVVideoFileServerMediaSubsession, H264VideoFileServerMediaSubsession, and MPEG4VideoFileServerMediaSubsession.
Definition at line 280 of file OnDemandServerMediaSubsession.cpp.
References RTPSink::auxSDPLine(), and NULL.
Referenced by setSDPLinesFromRTPSink().
00280 { 00281 // Default implementation: 00282 return rtpSink == NULL ? NULL : rtpSink->auxSDPLine(); 00283 }
| void OnDemandServerMediaSubsession::seekStreamSource | ( | FramedSource * | inputSource, | |
| double & | seekNPT, | |||
| double | streamDuration, | |||
| u_int64_t & | numBytes | |||
| ) | [protected, virtual] |
Reimplemented in AACAudioMatroskaFileServerMediaSubsession, AC3AudioMatroskaFileServerMediaSubsession, H264VideoMatroskaFileServerMediaSubsession, DVVideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, WAVAudioFileServerMediaSubsession, MP3AudioMatroskaFileServerMediaSubsession, T140TextMatroskaFileServerMediaSubsession, VorbisAudioMatroskaFileServerMediaSubsession, and VP8VideoMatroskaFileServerMediaSubsession.
Definition at line 285 of file OnDemandServerMediaSubsession.cpp.
Referenced by seekStream().
| void OnDemandServerMediaSubsession::setStreamSourceScale | ( | FramedSource * | inputSource, | |
| float | scale | |||
| ) | [protected, virtual] |
Reimplemented in MP3AudioFileServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Definition at line 291 of file OnDemandServerMediaSubsession.cpp.
Referenced by setStreamScale().
| void OnDemandServerMediaSubsession::closeStreamSource | ( | FramedSource * | inputSource | ) | [protected, virtual] |
Definition at line 295 of file OnDemandServerMediaSubsession.cpp.
References Medium::close().
Referenced by StreamState::reclaim(), and sdpLines().
00295 { 00296 Medium::close(inputSource); 00297 }
| virtual FramedSource* OnDemandServerMediaSubsession::createNewStreamSource | ( | unsigned | clientSessionId, | |
| unsigned & | estBitrate | |||
| ) | [protected, pure virtual] |
Implemented in AACAudioMatroskaFileServerMediaSubsession, AC3AudioMatroskaFileServerMediaSubsession, H264VideoMatroskaFileServerMediaSubsession, AC3AudioFileServerMediaSubsession, ADTSAudioFileServerMediaSubsession, AMRAudioFileServerMediaSubsession, DVVideoFileServerMediaSubsession, H263plusVideoFileServerMediaSubsession, H264VideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, MPEG1or2VideoFileServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, MPEG2TransportUDPServerMediaSubsession, MPEG4VideoFileServerMediaSubsession, WAVAudioFileServerMediaSubsession, MP3AudioMatroskaFileServerMediaSubsession, T140TextMatroskaFileServerMediaSubsession, VorbisAudioMatroskaFileServerMediaSubsession, and VP8VideoMatroskaFileServerMediaSubsession.
Referenced by getStreamParameters(), and sdpLines().
| virtual RTPSink* OnDemandServerMediaSubsession::createNewRTPSink | ( | Groupsock * | rtpGroupsock, | |
| unsigned char | rtpPayloadTypeIfDynamic, | |||
| FramedSource * | inputSource | |||
| ) | [protected, pure virtual] |
Implemented in AACAudioMatroskaFileServerMediaSubsession, AC3AudioMatroskaFileServerMediaSubsession, AC3AudioFileServerMediaSubsession, ADTSAudioFileServerMediaSubsession, AMRAudioFileServerMediaSubsession, DVVideoFileServerMediaSubsession, H263plusVideoFileServerMediaSubsession, H264VideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, MPEG1or2VideoFileServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, MPEG2TransportUDPServerMediaSubsession, MPEG4VideoFileServerMediaSubsession, WAVAudioFileServerMediaSubsession, T140TextMatroskaFileServerMediaSubsession, VorbisAudioMatroskaFileServerMediaSubsession, and VP8VideoMatroskaFileServerMediaSubsession.
Referenced by getStreamParameters(), and sdpLines().
| void OnDemandServerMediaSubsession::setSDPLinesFromRTPSink | ( | RTPSink * | rtpSink, | |
| FramedSource * | inputSource, | |||
| unsigned | estBitrate | |||
| ) | [private] |
Definition at line 300 of file OnDemandServerMediaSubsession.cpp.
References ServerMediaSubsession::fPortNumForSDP, fSDPLines, ServerMediaSubsession::fServerAddressForSDP, getAuxSDPLine(), NULL, ServerMediaSubsession::rangeSDPLine(), RTPSink::rtpmapLine(), RTPSink::rtpPayloadType(), sdpLines(), RTPSink::sdpMediaType(), strDup(), ServerMediaSubsession::trackId(), and AddressString::val().
Referenced by sdpLines().
00300 { 00301 if (rtpSink == NULL) return; 00302 00303 char const* mediaType = rtpSink->sdpMediaType(); 00304 unsigned char rtpPayloadType = rtpSink->rtpPayloadType(); 00305 AddressString ipAddressStr(fServerAddressForSDP); 00306 char* rtpmapLine = rtpSink->rtpmapLine(); 00307 char const* rangeLine = rangeSDPLine(); 00308 char const* auxSDPLine = getAuxSDPLine(rtpSink, inputSource); 00309 if (auxSDPLine == NULL) auxSDPLine = ""; 00310 00311 char const* const sdpFmt = 00312 "m=%s %u RTP/AVP %d\r\n" 00313 "c=IN IP4 %s\r\n" 00314 "b=AS:%u\r\n" 00315 "%s" 00316 "%s" 00317 "%s" 00318 "a=control:%s\r\n"; 00319 unsigned sdpFmtSize = strlen(sdpFmt) 00320 + strlen(mediaType) + 5 /* max short len */ + 3 /* max char len */ 00321 + strlen(ipAddressStr.val()) 00322 + 20 /* max int len */ 00323 + strlen(rtpmapLine) 00324 + strlen(rangeLine) 00325 + strlen(auxSDPLine) 00326 + strlen(trackId()); 00327 char* sdpLines = new char[sdpFmtSize]; 00328 sprintf(sdpLines, sdpFmt, 00329 mediaType, // m= <media> 00330 fPortNumForSDP, // m= <port> 00331 rtpPayloadType, // m= <fmt list> 00332 ipAddressStr.val(), // c= address 00333 estBitrate, // b=AS:<bandwidth> 00334 rtpmapLine, // a=rtpmap:... (if present) 00335 rangeLine, // a=range:... (if present) 00336 auxSDPLine, // optional extra SDP line 00337 trackId()); // a=control:<track-id> 00338 delete[] (char*)rangeLine; delete[] rtpmapLine; 00339 00340 fSDPLines = strDup(sdpLines); 00341 delete[] sdpLines; 00342 }
| unsigned ServerMediaSubsession::trackNumber | ( | ) | const [inline, inherited] |
Definition at line 121 of file ServerMediaSession.hh.
References ServerMediaSubsession::fTrackNumber.
Referenced by getStreamParameters(), and sdpLines().
00121 { return fTrackNumber; }
| char const * ServerMediaSubsession::trackId | ( | ) | [inherited] |
Definition at line 324 of file ServerMediaSession.cpp.
References ServerMediaSubsession::fTrackId, ServerMediaSubsession::fTrackNumber, NULL, and strDup().
Referenced by PassiveServerMediaSubsession::sdpLines(), and setSDPLinesFromRTPSink().
00324 { 00325 if (fTrackNumber == 0) return NULL; // not yet in a ServerMediaSession 00326 00327 if (fTrackId == NULL) { 00328 char buf[100]; 00329 sprintf(buf, "track%d", fTrackNumber); 00330 fTrackId = strDup(buf); 00331 } 00332 return fTrackId; 00333 }
| void ServerMediaSubsession::testScaleFactor | ( | float & | scale | ) | [virtual, inherited] |
Reimplemented in MP3AudioFileServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Definition at line 357 of file ServerMediaSession.cpp.
00357 { 00358 // default implementation: Support scale = 1 only 00359 scale = 1; 00360 }
| float ServerMediaSubsession::duration | ( | ) | const [virtual, inherited] |
Reimplemented in AACAudioMatroskaFileServerMediaSubsession, AC3AudioMatroskaFileServerMediaSubsession, H264VideoMatroskaFileServerMediaSubsession, DVVideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, WAVAudioFileServerMediaSubsession, T140TextMatroskaFileServerMediaSubsession, VorbisAudioMatroskaFileServerMediaSubsession, and VP8VideoMatroskaFileServerMediaSubsession.
Definition at line 362 of file ServerMediaSession.cpp.
Referenced by ServerMediaSubsession::rangeSDPLine().
| void ServerMediaSubsession::setServerAddressAndPortForSDP | ( | netAddressBits | addressBits, | |
| portNumBits | portBits | |||
| ) | [inherited] |
Definition at line 367 of file ServerMediaSession.cpp.
References ServerMediaSubsession::fPortNumForSDP, and ServerMediaSubsession::fServerAddressForSDP.
00368 { 00369 fServerAddressForSDP = addressBits; 00370 fPortNumForSDP = portBits; 00371 }
| char const * ServerMediaSubsession::rangeSDPLine | ( | ) | const [protected, inherited] |
Definition at line 374 of file ServerMediaSession.cpp.
References ServerMediaSubsession::duration(), ServerMediaSession::duration(), ServerMediaSubsession::fParentSession, NULL, and strDup().
Referenced by PassiveServerMediaSubsession::sdpLines(), and setSDPLinesFromRTPSink().
00374 { 00375 if (fParentSession == NULL) return NULL; 00376 00377 // If all of our parent's subsessions have the same duration 00378 // (as indicated by "fParentSession->duration() >= 0"), there's no "a=range:" line: 00379 if (fParentSession->duration() >= 0.0) return strDup(""); 00380 00381 // Use our own duration for a "a=range:" line: 00382 float ourDuration = duration(); 00383 if (ourDuration == 0.0) { 00384 return strDup("a=range:npt=0-\r\n"); 00385 } else { 00386 char buf[100]; 00387 sprintf(buf, "a=range:npt=0-%.3f\r\n", ourDuration); 00388 return strDup(buf); 00389 } 00390 }
| Boolean Medium::lookupByName | ( | UsageEnvironment & | env, | |
| char const * | mediumName, | |||
| Medium *& | resultMedium | |||
| ) | [static, inherited] |
Definition at line 41 of file Media.cpp.
References env, False, MediaLookupTable::lookup(), NULL, MediaLookupTable::ourMedia(), UsageEnvironment::setResultMsg(), and True.
Referenced by ServerMediaSession::lookupByName(), RTSPServer::lookupByName(), RTSPClient::lookupByName(), RTCPInstance::lookupByName(), MediaSource::lookupByName(), MediaSink::lookupByName(), MediaSession::lookupByName(), and DarwinInjector::lookupByName().
00042 { 00043 resultMedium = MediaLookupTable::ourMedia(env)->lookup(mediumName); 00044 if (resultMedium == NULL) { 00045 env.setResultMsg("Medium ", mediumName, " does not exist"); 00046 return False; 00047 } 00048 00049 return True; 00050 }
| void Medium::close | ( | UsageEnvironment & | env, | |
| char const * | mediumName | |||
| ) | [static, inherited] |
Definition at line 52 of file Media.cpp.
References env, MediaLookupTable::ourMedia(), and MediaLookupTable::remove().
Referenced by afterPlaying(), Medium::close(), closeMediaSinks(), closeStreamSource(), continueAfterTEARDOWN(), WAVAudioFileSource::createNew(), QuickTimeFileSink::createNew(), QCELPAudioRTPSource::createNew(), MP3HTTPSource::createNew(), MP3FileSource::createNew(), AVIFileSink::createNew(), AMRAudioRTPSource::createNew(), WAVAudioFileServerMediaSubsession::createNewStreamSource(), MPEG1or2DemuxedServerMediaSubsession::createNewStreamSource(), MediaSubsession::deInitiate(), RTSPServerSupportingHTTPStreaming::RTSPClientSessionSupportingHTTPStreaming::handleHTTPCmd_StreamingGET(), MediaSubsession::initiate(), MPEG1or2ProgramStreamFileDuration(), MPEG1or2Demux::noteElementaryStreamDeletion(), ByteStreamMultiFileSource::onSourceClosure1(), StreamState::reclaim(), RTSPServer::removeServerMediaSession(), sdpLines(), shutdownStream(), T140TextRTPSink::stopPlaying(), H264VideoRTPSink::stopPlaying(), subsessionAfterPlaying(), ClientTrickPlayState::updateStateOnScaleChange(), AMRDeinterleaver::~AMRDeinterleaver(), ByteStreamMultiFileSource::~ByteStreamMultiFileSource(), DarwinInjector::~DarwinInjector(), FramedFilter::~FramedFilter(), InputESSourceRecord::~InputESSourceRecord(), MatroskaFileParser::~MatroskaFileParser(), MatroskaFileServerDemux::~MatroskaFileServerDemux(), MPEG1or2Demux::~MPEG1or2Demux(), MPEG1or2FileServerDemux::~MPEG1or2FileServerDemux(), MPEG2TransportFileServerMediaSubsession::~MPEG2TransportFileServerMediaSubsession(), MPEG2TransportStreamFromPESSource::~MPEG2TransportStreamFromPESSource(), RTSPServerSupportingHTTPStreaming::RTSPClientSessionSupportingHTTPStreaming::~RTSPClientSessionSupportingHTTPStreaming(), ServerMediaSession::~ServerMediaSession(), ServerMediaSubsession::~ServerMediaSubsession(), StreamClientState::~StreamClientState(), and StreamReplicator::~StreamReplicator().
00052 { 00053 MediaLookupTable::ourMedia(env)->remove(name); 00054 }
| void Medium::close | ( | Medium * | medium | ) | [static, inherited] |
Definition at line 56 of file Media.cpp.
References Medium::close(), Medium::envir(), Medium::name(), and NULL.
00056 { 00057 if (medium == NULL) return; 00058 00059 close(medium->envir(), medium->name()); 00060 }
| UsageEnvironment& Medium::envir | ( | ) | const [inline, inherited] |
Definition at line 59 of file Media.hh.
References Medium::fEnviron.
Referenced by QuickTimeFileSink::addArbitraryString(), FileSink::addData(), RTCPInstance::addStreamSocket(), MPEG2IFrameIndexFromTransportStream::addToTail(), StreamParser::afterGettingBytes1(), DummySink::afterGettingFrame(), T140IdleFilter::afterGettingFrame(), MultiFramedRTPSink::afterGettingFrame1(), InputESSourceRecord::afterGettingFrame1(), MPEG2TransportStreamFramer::afterGettingFrame1(), MPEG2IFrameIndexFromTransportStream::afterGettingFrame1(), H264VideoStreamDiscreteFramer::afterGettingFrame1(), BasicUDPSink::afterGettingFrame1(), MPEG4VideoFileServerMediaSubsession::afterPlayingDummy1(), H264VideoFileServerMediaSubsession::afterPlayingDummy1(), MPEG4VideoStreamParser::analyzeVOLHeader(), announceStream(), RTSPServer::RTSPClientSession::changeClientInputSocket(), MPEG4VideoFileServerMediaSubsession::checkForAuxSDPLine1(), H264VideoFileServerMediaSubsession::checkForAuxSDPLine1(), Medium::close(), MPEG2IFrameIndexFromTransportStream::compactParseBuffer(), RTSPClient::connectionHandler1(), RTSPClient::connectToServer(), T140TextRTPSink::continuePlaying(), QuickTimeFileSink::continuePlaying(), H264VideoRTPSink::continuePlaying(), AVIFileSink::continuePlaying(), VP8VideoMatroskaFileServerMediaSubsession::createNewRTPSink(), VorbisAudioMatroskaFileServerMediaSubsession::createNewRTPSink(), T140TextMatroskaFileServerMediaSubsession::createNewRTPSink(), MPEG4VideoFileServerMediaSubsession::createNewRTPSink(), MPEG2TransportUDPServerMediaSubsession::createNewRTPSink(), MPEG2TransportFileServerMediaSubsession::createNewRTPSink(), MPEG1or2VideoFileServerMediaSubsession::createNewRTPSink(), MPEG1or2DemuxedServerMediaSubsession::createNewRTPSink(), MP3AudioFileServerMediaSubsession::createNewRTPSink(), H264VideoFileServerMediaSubsession::createNewRTPSink(), H263plusVideoFileServerMediaSubsession::createNewRTPSink(), DVVideoFileServerMediaSubsession::createNewRTPSink(), AMRAudioFileServerMediaSubsession::createNewRTPSink(), ADTSAudioFileServerMediaSubsession::createNewRTPSink(), AC3AudioMatroskaFileServerMediaSubsession::createNewRTPSink(), AC3AudioFileServerMediaSubsession::createNewRTPSink(), AACAudioMatroskaFileServerMediaSubsession::createNewRTPSink(), MPEG4VideoFileServerMediaSubsession::createNewStreamSource(), MPEG2TransportUDPServerMediaSubsession::createNewStreamSource(), MPEG2TransportFileServerMediaSubsession::createNewStreamSource(), MPEG1or2VideoFileServerMediaSubsession::createNewStreamSource(), MPEG1or2DemuxedServerMediaSubsession::createNewStreamSource(), MP3AudioFileServerMediaSubsession::createNewStreamSource(), H264VideoMatroskaFileServerMediaSubsession::createNewStreamSource(), H264VideoFileServerMediaSubsession::createNewStreamSource(), H263plusVideoFileServerMediaSubsession::createNewStreamSource(), DVVideoFileServerMediaSubsession::createNewStreamSource(), AMRAudioFileServerMediaSubsession::createNewStreamSource(), ADTSAudioFileServerMediaSubsession::createNewStreamSource(), AC3AudioFileServerMediaSubsession::createNewStreamSource(), AMRDeinterleavingBuffer::deliverIncomingFrame(), MPEG2IFrameIndexFromTransportStream::deliverIndexRecord(), SegmentQueue::dequeue(), DeviceSource::DeviceSource(), WAVAudioFileSource::doGetNextFrame(), T140IdleFilter::doGetNextFrame(), MPEG2IFrameIndexFromTransportStream::doGetNextFrame(), MP3FileSource::doGetNextFrame(), H264FUAFragmenter::doGetNextFrame(), ByteStreamMultiFileSource::doGetNextFrame(), ByteStreamFileSource::doGetNextFrame(), BasicUDPSource::doGetNextFrame(), AMRAudioFileSource::doGetNextFrame(), ADTSAudioFileSource::doGetNextFrame(), MultiFramedRTPSource::doGetNextFrame1(), MP3FileSource::doGetNextFrame1(), ADUFromMP3Source::doGetNextFrame1(), SIPClient::doInviteStateMachine(), ByteStreamFileSource::doReadFromFile(), MPEG1or2VideoRTPSink::doSpecialFrameHandling(), MP3ADURTPSink::doSpecialFrameHandling(), H263plusVideoRTPSink::doSpecialFrameHandling(), T140IdleFilter::doStopGettingFrames(), ByteStreamFileSource::doStopGettingFrames(), BasicUDPSource::doStopGettingFrames(), SegmentQueue::enqueueNewSegment(), StreamParser::ensureValidBytes1(), MediaSubsession::env(), SubsessionIOState::envir(), RTSPServer::RTSPClientSession::envir(), RTPInterface::envir(), AVISubsessionIOState::envir(), ServerMediaSession::generateSDPDescription(), RTPSource::getAttributes(), MP3FileSource::getAttributes(), MP3ADUTranscoder::getAttributes(), MediaSource::getAttributes(), MPEG4VideoFileServerMediaSubsession::getAuxSDPLine(), H264VideoFileServerMediaSubsession::getAuxSDPLine(), getMPEG1or2TimeCode(), FramedSource::getNextFrame(), getOptions(), DVVideoStreamFramer::getProfile(), SIPClient::getResponse(), SIPClient::getResponseCode(), getSDPDescription(), getStreamParameters(), RTSPClient::handleGET_PARAMETERResponse(), RTSPServerSupportingHTTPStreaming::RTSPClientSessionSupportingHTTPStreaming::handleHTTPCmd_StreamingGET(), RTSPClient::handleIncomingRequest(), RTSPClient::handlePLAYResponse(), RTSPClient::handleRequestError(), RTSPClient::handleResponseBytes(), RTSPClient::handleSETUPResponse(), RTSPServer::incomingConnectionHandler(), RTSPClient::incomingDataHandler1(), RTCPInstance::incomingReportHandler1(), MP3FileSource::initializeStream(), MediaSession::initializeWithSDP(), MediaSession::initiateByMediaType(), SIPClient::invite1(), DynamicRTSPServer::lookupServerMediaSession(), MatroskaDemux::MatroskaDemux(), MatroskaFile::MatroskaFile(), MPEG4GenericRTPSource::MPEG4GenericRTPSource(), MatroskaDemux::newDemuxedTrack(), MPEG1or2FileServerDemux::newElementaryStream(), MPEG1or2Demux::newElementaryStream(), MPEG4GenericBufferedPacket::nextEnclosedFrameSize(), AMRBufferedPacket::nextEnclosedFrameSize(), RTSPClient::openConnection(), MPEG2TransportStreamIndexFile::openFid(), MPEG2IFrameIndexFromTransportStream::parseFrame(), AC3AudioStreamParser::parseFrame(), MPEGProgramStreamParser::parsePackHeader(), MPEGProgramStreamParser::parsePESPacket(), SIPClient::parseResponseCode(), MediaSession::parseSDPLine(), MPEG1or2VideoStreamParser::parseSlice(), MatroskaFileParser::parseStartOfFile(), MPEGProgramStreamParser::parseSystemHeader(), MPEG4VideoStreamParser::parseVideoObjectLayer(), MPEG4VideoStreamParser::parseVideoObjectPlane(), MPEG4VideoStreamParser::parseVisualObject(), TCPStreamSink::processBuffer(), SIPClient::processURL(), AC3AudioStreamParser::readAndSaveAFrame(), MPEG1or2Demux::registerReadInterest(), RTCPInstance::reschedule(), RTSPClient::resendCommand(), RTSPClient::resetTCPSockets(), RTSPClient::responseHandlerForHTTP_GET1(), RTSPServer::rtspURLPrefix(), RTCPInstance::schedule(), sdpLines(), SIPClient::sendACK(), SIPClient::sendBYE(), SIPClient::sendINVITE(), MultiFramedRTPSink::sendPacketIfNecessary(), SIPClient::sendRequest(), RTSPClient::sendRequest(), DarwinInjector::setDestination(), RTSPClient::setupHTTPTunneling1(), setupNextSubsession(), RTSPServer::setUpTunnelingOverHTTP(), QuickTimeFileSink::setWord(), AVIFileSink::setWord(), QuickTimeFileSink::setWord64(), shutdownStream(), SIPClient::SIPClient(), TCPStreamSink::socketWritableHandler1(), AMRAudioRTPSink::sourceIsCompatibleWithUs(), QuickTimeFileSink::startPlaying(), StreamState::startPlaying(), MediaSink::startPlaying(), AVIFileSink::startPlaying(), startPlayingSession(), PassiveServerMediaSubsession::startStream(), MediaSink::stopPlaying(), tearDownSession(), SIPClient::timerAHandler(), SIPClient::timerBHandler(), SIPClient::timerDHandler(), ClientTrickPlayState::updateStateOnScaleChange(), MPEG2TransportStreamFramer::updateTSPacketDurationEstimate(), BasicUDPSource::~BasicUDPSource(), ByteStreamFileSource::~ByteStreamFileSource(), DeviceSource::~DeviceSource(), RTSPServer::~RTSPServer(), StreamClientState::~StreamClientState(), and T140IdleFilter::~T140IdleFilter().
00059 {return fEnviron;}
| char const* Medium::name | ( | ) | const [inline, inherited] |
Definition at line 61 of file Media.hh.
References Medium::fMediumName.
Referenced by QuickTimeFileSink::addAtom_hdlr2(), Medium::close(), MP3ADUTranscoder::createNew(), MP3FromADUSource::createNew(), ADUFromMP3Source::createNew(), and MP3FileSource::initializeStream().
00061 {return fMediumName;}
| Boolean Medium::isSource | ( | ) | const [virtual, inherited] |
Reimplemented in MediaSource.
Definition at line 62 of file Media.cpp.
References False.
Referenced by MediaSource::lookupByName().
00062 { 00063 return False; // default implementation 00064 }
| Boolean Medium::isSink | ( | ) | const [virtual, inherited] |
| Boolean Medium::isRTCPInstance | ( | ) | const [virtual, inherited] |
Reimplemented in RTCPInstance.
Definition at line 70 of file Media.cpp.
References False.
Referenced by RTCPInstance::lookupByName().
00070 { 00071 return False; // default implementation 00072 }
| Boolean Medium::isRTSPClient | ( | ) | const [virtual, inherited] |
Reimplemented in RTSPClient.
Definition at line 74 of file Media.cpp.
References False.
Referenced by RTSPClient::lookupByName().
00074 { 00075 return False; // default implementation 00076 }
| Boolean Medium::isRTSPServer | ( | ) | const [virtual, inherited] |
Reimplemented in RTSPServer.
Definition at line 78 of file Media.cpp.
References False.
Referenced by RTSPServer::lookupByName().
00078 { 00079 return False; // default implementation 00080 }
| Boolean Medium::isMediaSession | ( | ) | const [virtual, inherited] |
Reimplemented in MediaSession.
Definition at line 82 of file Media.cpp.
References False.
Referenced by MediaSession::lookupByName().
00082 { 00083 return False; // default implementation 00084 }
| Boolean Medium::isServerMediaSession | ( | ) | const [virtual, inherited] |
Reimplemented in ServerMediaSession.
Definition at line 86 of file Media.cpp.
References False.
Referenced by ServerMediaSession::lookupByName().
00086 { 00087 return False; // default implementation 00088 }
| Boolean Medium::isDarwinInjector | ( | ) | const [virtual, inherited] |
Reimplemented in DarwinInjector.
Definition at line 90 of file Media.cpp.
References False.
Referenced by DarwinInjector::lookupByName().
00090 { 00091 return False; // default implementation 00092 }
| TaskToken& Medium::nextTask | ( | ) | [inline, protected, inherited] |
Definition at line 78 of file Media.hh.
References Medium::fNextTask.
Referenced by BasicUDPSink::afterGettingFrame1(), MPEG4VideoFileServerMediaSubsession::afterPlayingDummy1(), H264VideoFileServerMediaSubsession::afterPlayingDummy1(), MPEG4VideoFileServerMediaSubsession::checkForAuxSDPLine1(), H264VideoFileServerMediaSubsession::checkForAuxSDPLine1(), WAVAudioFileSource::doGetNextFrame(), MP3FileSource::doGetNextFrame(), AMRAudioFileSource::doGetNextFrame(), ADTSAudioFileSource::doGetNextFrame(), MultiFramedRTPSource::doGetNextFrame1(), ByteStreamFileSource::doReadFromFile(), RTCPInstance::reschedule(), RTCPInstance::schedule(), MultiFramedRTPSink::sendPacketIfNecessary(), and MediaSink::stopPlaying().
00078 { 00079 return fNextTask; 00080 }
friend class StreamState [friend] |
Definition at line 102 of file OnDemandServerMediaSubsession.hh.
Referenced by getStreamParameters().
friend class MediaLookupTable [friend, inherited] |
char* OnDemandServerMediaSubsession::fSDPLines [protected] |
Definition at line 94 of file OnDemandServerMediaSubsession.hh.
Referenced by sdpLines(), setSDPLinesFromRTPSink(), and ~OnDemandServerMediaSubsession().
Definition at line 97 of file OnDemandServerMediaSubsession.hh.
Referenced by getStreamParameters(), pauseStream(), seekStream(), and setStreamScale().
Definition at line 98 of file OnDemandServerMediaSubsession.hh.
Referenced by getStreamParameters().
Definition at line 99 of file OnDemandServerMediaSubsession.hh.
Referenced by deleteStream(), getStreamParameters(), startStream(), and ~OnDemandServerMediaSubsession().
void* OnDemandServerMediaSubsession::fLastStreamToken [private] |
Definition at line 100 of file OnDemandServerMediaSubsession.hh.
Referenced by getStreamParameters(), and StreamState::reclaim().
char OnDemandServerMediaSubsession::fCNAME[100] [private] |
Definition at line 101 of file OnDemandServerMediaSubsession.hh.
Referenced by StreamState::startPlaying().
ServerMediaSession* ServerMediaSubsession::fParentSession [protected, inherited] |
Definition at line 169 of file ServerMediaSession.hh.
Referenced by ServerMediaSubsession::rangeSDPLine().
netAddressBits ServerMediaSubsession::fServerAddressForSDP [protected, inherited] |
Definition at line 170 of file ServerMediaSession.hh.
Referenced by setSDPLinesFromRTPSink(), and ServerMediaSubsession::setServerAddressAndPortForSDP().
portNumBits ServerMediaSubsession::fPortNumForSDP [protected, inherited] |
Definition at line 171 of file ServerMediaSession.hh.
Referenced by setSDPLinesFromRTPSink(), and ServerMediaSubsession::setServerAddressAndPortForSDP().
1.5.2