#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) |
| virtual void | setStreamScale (unsigned clientSessionId, void *streamToken, float scale) |
| virtual void | deleteStream (unsigned clientSessionId, void *&streamToken) |
| virtual char const * | getAuxSDPLine (RTPSink *rtpSink, FramedSource *inputSource) |
| virtual void | seekStreamSource (FramedSource *inputSource, double seekNPT) |
| 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 |
Definition at line 32 of file OnDemandServerMediaSubsession.hh.
| OnDemandServerMediaSubsession::OnDemandServerMediaSubsession | ( | UsageEnvironment & | env, | |
| Boolean | reuseFirstSource, | |||
| portNumBits | initialPortNum = 6970 | |||
| ) | [protected] |
Definition at line 28 of file OnDemandServerMediaSubsession.cpp.
References HashTable::create(), and ONE_WORD_HASH_KEYS.
00031 : ServerMediaSubsession(env), 00032 fSDPLines(NULL), fReuseFirstSource(reuseFirstSource), fInitialPortNum(initialPortNum), fLastStreamToken(NULL) { 00033 fDestinationsHashTable = HashTable::create(ONE_WORD_HASH_KEYS); 00034 gethostname(fCNAME, sizeof fCNAME); 00035 fCNAME[sizeof fCNAME-1] = '\0'; // just in case 00036 }
| OnDemandServerMediaSubsession::~OnDemandServerMediaSubsession | ( | ) | [protected, virtual] |
Definition at line 59 of file OnDemandServerMediaSubsession.cpp.
References fDestinationsHashTable, fSDPLines, NULL, and HashTable::RemoveNext().
00059 { 00060 delete[] fSDPLines; 00061 00062 // Clean out the destinations hash table: 00063 while (1) { 00064 Destinations* destinations 00065 = (Destinations*)(fDestinationsHashTable->RemoveNext()); 00066 if (destinations == NULL) break; 00067 delete destinations; 00068 } 00069 delete fDestinationsHashTable; 00070 }
| char const * OnDemandServerMediaSubsession::sdpLines | ( | ) | [protected, virtual] |
Implements ServerMediaSubsession.
Definition at line 73 of file OnDemandServerMediaSubsession.cpp.
References Medium::close(), closeStreamSource(), createNewRTPSink(), createNewStreamSource(), Medium::envir(), fSDPLines, NULL, setSDPLinesFromRTPSink(), and ServerMediaSubsession::trackNumber().
Referenced by setSDPLinesFromRTPSink().
00073 { 00074 if (fSDPLines == NULL) { 00075 // We need to construct a set of SDP lines that describe this 00076 // subsession (as a unicast stream). To do so, we first create 00077 // dummy (unused) source and "RTPSink" objects, 00078 // whose parameters we use for the SDP lines: 00079 unsigned estBitrate; 00080 FramedSource* inputSource = createNewStreamSource(0, estBitrate); 00081 if (inputSource == NULL) return NULL; // file not found 00082 00083 struct in_addr dummyAddr; 00084 dummyAddr.s_addr = 0; 00085 Groupsock dummyGroupsock(envir(), dummyAddr, 0, 0); 00086 unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic 00087 RTPSink* dummyRTPSink 00088 = createNewRTPSink(&dummyGroupsock, rtpPayloadType, inputSource); 00089 00090 setSDPLinesFromRTPSink(dummyRTPSink, inputSource, estBitrate); 00091 Medium::close(dummyRTPSink); 00092 closeStreamSource(inputSource); 00093 } 00094 00095 return fSDPLines; 00096 }
| 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 146 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().
00158 { 00159 if (destinationAddress == 0) destinationAddress = clientAddress; 00160 struct in_addr destinationAddr; destinationAddr.s_addr = destinationAddress; 00161 isMulticast = False; 00162 00163 if (fLastStreamToken != NULL && fReuseFirstSource) { 00164 // Special case: Rather than creating a new 'StreamState', 00165 // we reuse the one that we've already created: 00166 serverRTPPort = ((StreamState*)fLastStreamToken)->serverRTPPort(); 00167 serverRTCPPort = ((StreamState*)fLastStreamToken)->serverRTCPPort(); 00168 ++((StreamState*)fLastStreamToken)->referenceCount(); 00169 streamToken = fLastStreamToken; 00170 } else { 00171 // Normal case: Create a new media source: 00172 unsigned streamBitrate; 00173 FramedSource* mediaSource 00174 = createNewStreamSource(clientSessionId, streamBitrate); 00175 00176 // Create 'groupsock' and 'sink' objects for the destination, 00177 // using previously unused server port numbers: 00178 RTPSink* rtpSink; 00179 BasicUDPSink* udpSink; 00180 Groupsock* rtpGroupsock; 00181 Groupsock* rtcpGroupsock; 00182 portNumBits serverPortNum; 00183 if (clientRTCPPort.num() == 0) { 00184 // We're streaming raw UDP (not RTP). Create a single groupsock: 00185 NoReuse dummy; // ensures that we skip over ports that are already in use 00186 for (serverPortNum = fInitialPortNum; ; ++serverPortNum) { 00187 struct in_addr dummyAddr; dummyAddr.s_addr = 0; 00188 00189 serverRTPPort = serverPortNum; 00190 rtpGroupsock = new Groupsock(envir(), dummyAddr, serverRTPPort, 255); 00191 if (rtpGroupsock->socketNum() >= 0) break; // success 00192 } 00193 00194 rtcpGroupsock = NULL; 00195 rtpSink = NULL; 00196 udpSink = BasicUDPSink::createNew(envir(), rtpGroupsock); 00197 } else { 00198 // Normal case: We're streaming RTP (over UDP or TCP). Create a pair of 00199 // groupsocks (RTP and RTCP), with adjacent port numbers (RTP port number even): 00200 NoReuse dummy; // ensures that we skip over ports that are already in use 00201 for (portNumBits serverPortNum = fInitialPortNum; ; serverPortNum += 2) { 00202 struct in_addr dummyAddr; dummyAddr.s_addr = 0; 00203 00204 serverRTPPort = serverPortNum; 00205 rtpGroupsock = new Groupsock(envir(), dummyAddr, serverRTPPort, 255); 00206 if (rtpGroupsock->socketNum() < 0) { 00207 delete rtpGroupsock; 00208 continue; // try again 00209 } 00210 00211 serverRTCPPort = serverPortNum+1; 00212 rtcpGroupsock = new Groupsock(envir(), dummyAddr, serverRTCPPort, 255); 00213 if (rtcpGroupsock->socketNum() < 0) { 00214 delete rtpGroupsock; 00215 delete rtcpGroupsock; 00216 continue; // try again 00217 } 00218 00219 break; // success 00220 } 00221 00222 unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic 00223 rtpSink = createNewRTPSink(rtpGroupsock, rtpPayloadType, mediaSource); 00224 udpSink = NULL; 00225 } 00226 00227 // Turn off the destinations for each groupsock. They'll get set later 00228 // (unless TCP is used instead): 00229 if (rtpGroupsock != NULL) rtpGroupsock->removeAllDestinations(); 00230 if (rtcpGroupsock != NULL) rtcpGroupsock->removeAllDestinations(); 00231 00232 if (rtpGroupsock != NULL) { 00233 // Try to use a big send buffer for RTP - at least 0.1 second of 00234 // specified bandwidth and at least 50 KB 00235 unsigned rtpBufSize = streamBitrate * 25 / 2; // 1 kbps * 0.1 s = 12.5 bytes 00236 if (rtpBufSize < 50 * 1024) rtpBufSize = 50 * 1024; 00237 increaseSendBufferTo(envir(), rtpGroupsock->socketNum(), rtpBufSize); 00238 } 00239 00240 // Set up the state of the stream. The stream will get started later: 00241 streamToken = fLastStreamToken 00242 = new StreamState(*this, serverRTPPort, serverRTCPPort, rtpSink, udpSink, 00243 streamBitrate, mediaSource, 00244 rtpGroupsock, rtcpGroupsock); 00245 } 00246 00247 // Record these destinations as being for this client session id: 00248 Destinations* destinations; 00249 if (tcpSocketNum < 0) { // UDP 00250 destinations = new Destinations(destinationAddr, clientRTPPort, clientRTCPPort); 00251 } else { // TCP 00252 destinations = new Destinations(tcpSocketNum, rtpChannelId, rtcpChannelId); 00253 } 00254 fDestinationsHashTable->Add((char const*)clientSessionId, destinations); 00255 }
| 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 257 of file OnDemandServerMediaSubsession.cpp.
References RTPSink::currentSeqNo(), fDestinationsHashTable, HashTable::Lookup(), NULL, RTPSink::presetNextTimestamp(), StreamState::rtpSink(), and StreamState::startPlaying().
Referenced by MPEG2TransportFileServerMediaSubsession::startStream().
00264 { 00265 StreamState* streamState = (StreamState*)streamToken; 00266 Destinations* destinations 00267 = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); 00268 if (streamState != NULL) { 00269 streamState->startPlaying(destinations, 00270 rtcpRRHandler, rtcpRRHandlerClientData, 00271 serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData); 00272 if (streamState->rtpSink() != NULL) { 00273 rtpSeqNum = streamState->rtpSink()->currentSeqNo(); 00274 rtpTimestamp = streamState->rtpSink()->presetNextTimestamp(); 00275 } 00276 } 00277 }
| void OnDemandServerMediaSubsession::pauseStream | ( | unsigned | clientSessionId, | |
| void * | streamToken | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 279 of file OnDemandServerMediaSubsession.cpp.
References fReuseFirstSource, NULL, and StreamState::pause().
Referenced by MPEG2TransportFileServerMediaSubsession::pauseStream(), and MPEG2TransportFileServerMediaSubsession::startStream().
00280 { 00281 // Pausing isn't allowed if multiple clients are receiving data from 00282 // the same source: 00283 if (fReuseFirstSource) return; 00284 00285 StreamState* streamState = (StreamState*)streamToken; 00286 if (streamState != NULL) streamState->pause(); 00287 }
| void OnDemandServerMediaSubsession::seekStream | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| double | seekNPT | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 289 of file OnDemandServerMediaSubsession.cpp.
References fReuseFirstSource, StreamState::mediaSource(), NULL, and seekStreamSource().
Referenced by MPEG2TransportFileServerMediaSubsession::seekStream().
00290 { 00291 // Seeking isn't allowed if multiple clients are receiving data from 00292 // the same source: 00293 if (fReuseFirstSource) return; 00294 00295 StreamState* streamState = (StreamState*)streamToken; 00296 if (streamState != NULL && streamState->mediaSource() != NULL) { 00297 seekStreamSource(streamState->mediaSource(), seekNPT); 00298 } 00299 }
| void OnDemandServerMediaSubsession::setStreamScale | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| float | scale | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 301 of file OnDemandServerMediaSubsession.cpp.
References fReuseFirstSource, StreamState::mediaSource(), NULL, and setStreamSourceScale().
Referenced by MPEG2TransportFileServerMediaSubsession::setStreamScale().
00302 { 00303 // Changing the scale factor isn't allowed if multiple clients are receiving data 00304 // from the same source: 00305 if (fReuseFirstSource) return; 00306 00307 StreamState* streamState = (StreamState*)streamToken; 00308 if (streamState != NULL && streamState->mediaSource() != NULL) { 00309 setStreamSourceScale(streamState->mediaSource(), scale); 00310 } 00311 }
| void OnDemandServerMediaSubsession::deleteStream | ( | unsigned | clientSessionId, | |
| void *& | streamToken | |||
| ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 313 of file OnDemandServerMediaSubsession.cpp.
References StreamState::endPlaying(), fDestinationsHashTable, fLastStreamToken, HashTable::Lookup(), NULL, StreamState::referenceCount(), and HashTable::Remove().
Referenced by MPEG2TransportFileServerMediaSubsession::deleteStream().
00314 { 00315 StreamState* streamState = (StreamState*)streamToken; 00316 00317 // Look up (and remove) the destinations for this client session: 00318 Destinations* destinations 00319 = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); 00320 if (destinations != NULL) { 00321 fDestinationsHashTable->Remove((char const*)clientSessionId); 00322 00323 // Stop streaming to these destinations: 00324 if (streamState != NULL) streamState->endPlaying(destinations); 00325 } 00326 00327 // Delete the "StreamState" structure if it's no longer being used: 00328 if (streamState != NULL) { 00329 if (streamState->referenceCount() > 0) --streamState->referenceCount(); 00330 if (streamState->referenceCount() == 0) { 00331 delete streamState; 00332 if (fLastStreamToken == streamToken) fLastStreamToken = NULL; 00333 streamToken = NULL; 00334 } 00335 } 00336 00337 // Finally, delete the destinations themselves: 00338 delete destinations; 00339 }
| char const * OnDemandServerMediaSubsession::getAuxSDPLine | ( | RTPSink * | rtpSink, | |
| FramedSource * | inputSource | |||
| ) | [protected, virtual] |
Reimplemented in DVVideoFileServerMediaSubsession, and MPEG4VideoFileServerMediaSubsession.
Definition at line 342 of file OnDemandServerMediaSubsession.cpp.
References RTPSink::auxSDPLine(), and NULL.
Referenced by setSDPLinesFromRTPSink().
00342 { 00343 // Default implementation: 00344 return rtpSink == NULL ? NULL : rtpSink->auxSDPLine(); 00345 }
| void OnDemandServerMediaSubsession::seekStreamSource | ( | FramedSource * | inputSource, | |
| double | seekNPT | |||
| ) | [protected, virtual] |
Reimplemented in DVVideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Definition at line 347 of file OnDemandServerMediaSubsession.cpp.
Referenced by seekStream().
| void OnDemandServerMediaSubsession::setStreamSourceScale | ( | FramedSource * | inputSource, | |
| float | scale | |||
| ) | [protected, virtual] |
Reimplemented in MP3AudioFileServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Definition at line 353 of file OnDemandServerMediaSubsession.cpp.
Referenced by setStreamScale().
| void OnDemandServerMediaSubsession::closeStreamSource | ( | FramedSource * | inputSource | ) | [protected, virtual] |
Definition at line 357 of file OnDemandServerMediaSubsession.cpp.
References Medium::close().
Referenced by StreamState::reclaim(), and sdpLines().
00357 { 00358 Medium::close(inputSource); 00359 }
| virtual FramedSource* OnDemandServerMediaSubsession::createNewStreamSource | ( | unsigned | clientSessionId, | |
| unsigned & | estBitrate | |||
| ) | [protected, pure virtual] |
Implemented in ADTSAudioFileServerMediaSubsession, AMRAudioFileServerMediaSubsession, DVVideoFileServerMediaSubsession, H263plusVideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, MPEG1or2VideoFileServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, MPEG4VideoFileServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Referenced by getStreamParameters(), and sdpLines().
| virtual RTPSink* OnDemandServerMediaSubsession::createNewRTPSink | ( | Groupsock * | rtpGroupsock, | |
| unsigned char | rtpPayloadTypeIfDynamic, | |||
| FramedSource * | inputSource | |||
| ) | [protected, pure virtual] |
Implemented in ADTSAudioFileServerMediaSubsession, AMRAudioFileServerMediaSubsession, DVVideoFileServerMediaSubsession, H263plusVideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, MPEG1or2VideoFileServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, MPEG4VideoFileServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Referenced by getStreamParameters(), and sdpLines().
| void OnDemandServerMediaSubsession::setSDPLinesFromRTPSink | ( | RTPSink * | rtpSink, | |
| FramedSource * | inputSource, | |||
| unsigned | estBitrate | |||
| ) | [private] |
Definition at line 362 of file OnDemandServerMediaSubsession.cpp.
References ServerMediaSubsession::fPortNumForSDP, fSDPLines, ServerMediaSubsession::fServerAddressForSDP, getAuxSDPLine(), NULL, our_inet_ntoa(), ServerMediaSubsession::rangeSDPLine(), RTPSink::rtpmapLine(), RTPSink::rtpPayloadType(), sdpLines(), RTPSink::sdpMediaType(), strDup(), and ServerMediaSubsession::trackId().
Referenced by sdpLines().
00362 { 00363 if (rtpSink == NULL) return; 00364 00365 char const* mediaType = rtpSink->sdpMediaType(); 00366 unsigned char rtpPayloadType = rtpSink->rtpPayloadType(); 00367 struct in_addr serverAddrForSDP; serverAddrForSDP.s_addr = fServerAddressForSDP; 00368 char* const ipAddressStr = strDup(our_inet_ntoa(serverAddrForSDP)); 00369 char* rtpmapLine = rtpSink->rtpmapLine(); 00370 char const* rangeLine = rangeSDPLine(); 00371 char const* auxSDPLine = getAuxSDPLine(rtpSink, inputSource); 00372 if (auxSDPLine == NULL) auxSDPLine = ""; 00373 00374 char const* const sdpFmt = 00375 "m=%s %u RTP/AVP %d\r\n" 00376 "c=IN IP4 %s\r\n" 00377 "b=AS:%u\r\n" 00378 "%s" 00379 "%s" 00380 "%s" 00381 "a=control:%s\r\n"; 00382 unsigned sdpFmtSize = strlen(sdpFmt) 00383 + strlen(mediaType) + 5 /* max short len */ + 3 /* max char len */ 00384 + strlen(ipAddressStr) 00385 + 20 /* max int len */ 00386 + strlen(rtpmapLine) 00387 + strlen(rangeLine) 00388 + strlen(auxSDPLine) 00389 + strlen(trackId()); 00390 char* sdpLines = new char[sdpFmtSize]; 00391 sprintf(sdpLines, sdpFmt, 00392 mediaType, // m= <media> 00393 fPortNumForSDP, // m= <port> 00394 rtpPayloadType, // m= <fmt list> 00395 ipAddressStr, // c= address 00396 estBitrate, // b=AS:<bandwidth> 00397 rtpmapLine, // a=rtpmap:... (if present) 00398 rangeLine, // a=range:... (if present) 00399 auxSDPLine, // optional extra SDP line 00400 trackId()); // a=control:<track-id> 00401 delete[] (char*)rangeLine; delete[] rtpmapLine; delete[] ipAddressStr; 00402 00403 fSDPLines = strDup(sdpLines); 00404 delete[] sdpLines; 00405 }
| unsigned ServerMediaSubsession::trackNumber | ( | ) | const [inline, inherited] |
Definition at line 118 of file ServerMediaSession.hh.
References ServerMediaSubsession::fTrackNumber.
Referenced by getStreamParameters(), and sdpLines().
00118 { return fTrackNumber; }
| char const * ServerMediaSubsession::trackId | ( | ) | [inherited] |
Definition at line 326 of file ServerMediaSession.cpp.
References ServerMediaSubsession::fTrackId, ServerMediaSubsession::fTrackNumber, NULL, and strDup().
Referenced by PassiveServerMediaSubsession::sdpLines(), and setSDPLinesFromRTPSink().
00326 { 00327 if (fTrackNumber == 0) return NULL; // not yet in a ServerMediaSession 00328 00329 if (fTrackId == NULL) { 00330 char buf[100]; 00331 sprintf(buf, "track%d", fTrackNumber); 00332 fTrackId = strDup(buf); 00333 } 00334 return fTrackId; 00335 }
| void ServerMediaSubsession::testScaleFactor | ( | float & | scale | ) | [virtual, inherited] |
Reimplemented in MP3AudioFileServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Definition at line 354 of file ServerMediaSession.cpp.
00354 { 00355 // default implementation: Support scale = 1 only 00356 scale = 1; 00357 }
| float ServerMediaSubsession::duration | ( | ) | const [virtual, inherited] |
Reimplemented in DVVideoFileServerMediaSubsession, MP3AudioFileServerMediaSubsession, MPEG1or2DemuxedServerMediaSubsession, MPEG2TransportFileServerMediaSubsession, and WAVAudioFileServerMediaSubsession.
Definition at line 359 of file ServerMediaSession.cpp.
Referenced by ServerMediaSubsession::rangeSDPLine().
| void ServerMediaSubsession::setServerAddressAndPortForSDP | ( | netAddressBits | addressBits, | |
| portNumBits | portBits | |||
| ) | [inherited] |
Definition at line 364 of file ServerMediaSession.cpp.
References ServerMediaSubsession::fPortNumForSDP, and ServerMediaSubsession::fServerAddressForSDP.
00365 { 00366 fServerAddressForSDP = addressBits; 00367 fPortNumForSDP = portBits; 00368 }
| char const * ServerMediaSubsession::rangeSDPLine | ( | ) | const [protected, inherited] |
Definition at line 371 of file ServerMediaSession.cpp.
References ServerMediaSubsession::duration(), ServerMediaSession::duration(), ServerMediaSubsession::fParentSession, NULL, and strDup().
Referenced by PassiveServerMediaSubsession::sdpLines(), and setSDPLinesFromRTPSink().
00371 { 00372 if (fParentSession == NULL) return NULL; 00373 00374 // If all of our parent's subsessions have the same duration 00375 // (as indicated by "fParentSession->duration() >= 0"), there's no "a=range:" line: 00376 if (fParentSession->duration() >= 0.0) return strDup(""); 00377 00378 // Use our own duration for a "a=range:" line: 00379 float ourDuration = duration(); 00380 if (ourDuration == 0.0) { 00381 return strDup("a=range:npt=0-\r\n"); 00382 } else { 00383 char buf[100]; 00384 sprintf(buf, "a=range:npt=0-%.3f\r\n", ourDuration); 00385 return strDup(buf); 00386 } 00387 }
| Boolean Medium::lookupByName | ( | UsageEnvironment & | env, | |
| char const * | mediumName, | |||
| Medium *& | resultMedium | |||
| ) | [static, inherited] |
Definition at line 65 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().
00066 { 00067 resultMedium = MediaLookupTable::ourMedia(env)->lookup(mediumName); 00068 if (resultMedium == NULL) { 00069 env.setResultMsg("Medium ", mediumName, " does not exist"); 00070 return False; 00071 } 00072 00073 return True; 00074 }
| void Medium::close | ( | UsageEnvironment & | env, | |
| char const * | mediumName | |||
| ) | [static, inherited] |
Definition at line 76 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(), MediaSubsession::initiate(), MPEG1or2ProgramStreamFileDuration(), MPEG1or2Demux::noteElementaryStreamDeletion(), ByteStreamMultiFileSource::onSourceClosure1(), StreamState::reclaim(), RTSPServer::removeServerMediaSession(), sdpLines(), H264VideoRTPSink::stopPlaying(), subsessionAfterPlaying(), ClientTrickPlayState::updateStateOnScaleChange(), AMRDeinterleaver::~AMRDeinterleaver(), ByteStreamMultiFileSource::~ByteStreamMultiFileSource(), DarwinInjector::~DarwinInjector(), FramedFilter::~FramedFilter(), H264VideoRTPSink::~H264VideoRTPSink(), InputESSourceRecord::~InputESSourceRecord(), MPEG1or2Demux::~MPEG1or2Demux(), MPEG1or2FileServerDemux::~MPEG1or2FileServerDemux(), MPEG2TransportFileServerMediaSubsession::~MPEG2TransportFileServerMediaSubsession(), MPEG2TransportStreamFromPESSource::~MPEG2TransportStreamFromPESSource(), ServerMediaSession::~ServerMediaSession(), and ServerMediaSubsession::~ServerMediaSubsession().
00076 { 00077 MediaLookupTable::ourMedia(env)->remove(name); 00078 }
| void Medium::close | ( | Medium * | medium | ) | [static, inherited] |
Definition at line 80 of file Media.cpp.
References Medium::close(), Medium::envir(), Medium::name(), and NULL.
00080 { 00081 if (medium == NULL) return; 00082 00083 close(medium->envir(), medium->name()); 00084 }
| 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::afterGettingBytes(), MultiFramedRTPSink::afterGettingFrame1(), InputESSourceRecord::afterGettingFrame1(), MPEG2TransportStreamFramer::afterGettingFrame1(), MPEG2IFrameIndexFromTransportStream::afterGettingFrame1(), HTTPSink::afterGettingFrame1(), BasicUDPSink::afterGettingFrame1(), MPEG4VideoFileServerMediaSubsession::afterPlayingDummy1(), MPEG4VideoStreamParser::analyzeVOLHeader(), announceStream(), MPEG4VideoFileServerMediaSubsession::checkForAuxSDPLine1(), Medium::close(), MPEG2IFrameIndexFromTransportStream::compactParseBuffer(), RTSPClient::connectionHandler1(), RTSPClient::connectToServer(), QuickTimeFileSink::continuePlaying(), HTTPSink::continuePlaying(), H264VideoRTPSink::continuePlaying(), AVIFileSink::continuePlaying(), MPEG4VideoFileServerMediaSubsession::createNewRTPSink(), MPEG2TransportFileServerMediaSubsession::createNewRTPSink(), MPEG1or2VideoFileServerMediaSubsession::createNewRTPSink(), MPEG1or2DemuxedServerMediaSubsession::createNewRTPSink(), H263plusVideoFileServerMediaSubsession::createNewRTPSink(), DVVideoFileServerMediaSubsession::createNewRTPSink(), AMRAudioFileServerMediaSubsession::createNewRTPSink(), ADTSAudioFileServerMediaSubsession::createNewRTPSink(), MPEG4VideoFileServerMediaSubsession::createNewStreamSource(), MPEG2TransportFileServerMediaSubsession::createNewStreamSource(), MPEG1or2VideoFileServerMediaSubsession::createNewStreamSource(), MPEG1or2DemuxedServerMediaSubsession::createNewStreamSource(), H263plusVideoFileServerMediaSubsession::createNewStreamSource(), DVVideoFileServerMediaSubsession::createNewStreamSource(), AMRAudioFileServerMediaSubsession::createNewStreamSource(), ADTSAudioFileServerMediaSubsession::createNewStreamSource(), MPEG2IFrameIndexFromTransportStream::deliverIndexRecord(), SegmentQueue::dequeue(), WAVAudioFileSource::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(), ByteStreamFileSource::doStopGettingFrames(), BasicUDPSource::doStopGettingFrames(), SegmentQueue::enqueueNewSegment(), StreamParser::ensureValidBytes1(), MediaSubsession::env(), SubsessionIOState::envir(), RTSPServer::RTSPClientSession::envir(), RTSPOverHTTPServer::HTTPClientConnection::envir(), RTPInterface::envir(), AVISubsessionIOState::envir(), ServerMediaSession::generateSDPDescription(), RTPSource::getAttributes(), MP3FileSource::getAttributes(), MP3ADUTranscoder::getAttributes(), MediaSource::getAttributes(), MPEG4VideoFileServerMediaSubsession::getAuxSDPLine(), getMPEG1or2TimeCode(), FramedSource::getNextFrame(), getOptions(), DVVideoStreamFramer::getProfile(), SIPClient::getResponse(), SIPClient::getResponseCode(), getSDPDescription(), getStreamParameters(), RTSPClient::handleGET_PARAMETERResponse(), RTSPClient::handleIncomingRequest(), RTSPClient::handlePLAYResponse(), RTSPClient::handleRequestError(), RTSPClient::handleResponseBytes(), RTSPClient::handleSETUPResponse(), RTSPServer::incomingConnectionHandler1(), RTSPOverHTTPServer::incomingConnectionHandler1(), RTSPClient::incomingDataHandler1(), RTCPInstance::incomingReportHandler1(), MP3FileSource::initializeStream(), MediaSession::initializeWithSDP(), MediaSession::initiateByMediaType(), SIPClient::invite1(), DynamicRTSPServer::lookupServerMediaSession(), MPEG4GenericRTPSource::MPEG4GenericRTPSource(), 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(), MPEGProgramStreamParser::parseSystemHeader(), MPEG4VideoStreamParser::parseVideoObjectLayer(), MPEG4VideoStreamParser::parseVideoObjectPlane(), MPEG4VideoStreamParser::parseVisualObject(), AC3AudioRTPSource::processSpecialHeader(), 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(), QuickTimeFileSink::setWord(), AVIFileSink::setWord(), QuickTimeFileSink::setWord64(), SIPClient::SIPClient(), 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(), RTSPOverHTTPServer::HTTPClientConnection::~HTTPClientConnection(), and RTSPServer::~RTSPServer().
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 86 of file Media.cpp.
References False.
Referenced by MediaSource::lookupByName().
00086 { 00087 return False; // default implementation 00088 }
| Boolean Medium::isSink | ( | ) | const [virtual, inherited] |
| Boolean Medium::isRTCPInstance | ( | ) | const [virtual, inherited] |
Reimplemented in RTCPInstance.
Definition at line 94 of file Media.cpp.
References False.
Referenced by RTCPInstance::lookupByName().
00094 { 00095 return False; // default implementation 00096 }
| Boolean Medium::isRTSPClient | ( | ) | const [virtual, inherited] |
Reimplemented in RTSPClient.
Definition at line 98 of file Media.cpp.
References False.
Referenced by RTSPClient::lookupByName().
00098 { 00099 return False; // default implementation 00100 }
| Boolean Medium::isRTSPServer | ( | ) | const [virtual, inherited] |
Reimplemented in RTSPServer.
Definition at line 102 of file Media.cpp.
References False.
Referenced by RTSPServer::lookupByName().
00102 { 00103 return False; // default implementation 00104 }
| Boolean Medium::isMediaSession | ( | ) | const [virtual, inherited] |
Reimplemented in MediaSession.
Definition at line 106 of file Media.cpp.
References False.
Referenced by MediaSession::lookupByName().
00106 { 00107 return False; // default implementation 00108 }
| Boolean Medium::isServerMediaSession | ( | ) | const [virtual, inherited] |
Reimplemented in ServerMediaSession.
Definition at line 110 of file Media.cpp.
References False.
Referenced by ServerMediaSession::lookupByName().
00110 { 00111 return False; // default implementation 00112 }
| Boolean Medium::isDarwinInjector | ( | ) | const [virtual, inherited] |
Reimplemented in DarwinInjector.
Definition at line 114 of file Media.cpp.
References False.
Referenced by DarwinInjector::lookupByName().
00114 { 00115 return False; // default implementation 00116 }
| TaskToken& Medium::nextTask | ( | ) | [inline, protected, inherited] |
Definition at line 77 of file Media.hh.
References Medium::fNextTask.
Referenced by BasicUDPSink::afterGettingFrame1(), MPEG4VideoFileServerMediaSubsession::afterPlayingDummy1(), MPEG4VideoFileServerMediaSubsession::checkForAuxSDPLine1(), WAVAudioFileSource::doGetNextFrame(), MP3FileSource::doGetNextFrame(), AMRAudioFileSource::doGetNextFrame(), ADTSAudioFileSource::doGetNextFrame(), MultiFramedRTPSource::doGetNextFrame1(), ByteStreamFileSource::doReadFromFile(), RTCPInstance::reschedule(), RTCPInstance::schedule(), MultiFramedRTPSink::sendPacketIfNecessary(), and MediaSink::stopPlaying().
00077 { 00078 return fNextTask; 00079 }
friend class StreamState [friend] |
Definition at line 94 of file OnDemandServerMediaSubsession.hh.
Referenced by getStreamParameters().
char* OnDemandServerMediaSubsession::fSDPLines [protected] |
Definition at line 86 of file OnDemandServerMediaSubsession.hh.
Referenced by sdpLines(), setSDPLinesFromRTPSink(), and ~OnDemandServerMediaSubsession().
Definition at line 89 of file OnDemandServerMediaSubsession.hh.
Referenced by getStreamParameters(), pauseStream(), seekStream(), and setStreamScale().
Definition at line 90 of file OnDemandServerMediaSubsession.hh.
Referenced by getStreamParameters().
Definition at line 91 of file OnDemandServerMediaSubsession.hh.
Referenced by deleteStream(), getStreamParameters(), startStream(), and ~OnDemandServerMediaSubsession().
void* OnDemandServerMediaSubsession::fLastStreamToken [private] |
Definition at line 92 of file OnDemandServerMediaSubsession.hh.
Referenced by deleteStream(), and getStreamParameters().
char OnDemandServerMediaSubsession::fCNAME[100] [private] |
Definition at line 93 of file OnDemandServerMediaSubsession.hh.
Referenced by StreamState::startPlaying().
ServerMediaSession* ServerMediaSubsession::fParentSession [protected, inherited] |
Definition at line 163 of file ServerMediaSession.hh.
Referenced by ServerMediaSubsession::rangeSDPLine().
netAddressBits ServerMediaSubsession::fServerAddressForSDP [protected, inherited] |
Definition at line 164 of file ServerMediaSession.hh.
Referenced by setSDPLinesFromRTPSink(), and ServerMediaSubsession::setServerAddressAndPortForSDP().
portNumBits ServerMediaSubsession::fPortNumForSDP [protected, inherited] |
Definition at line 165 of file ServerMediaSession.hh.
Referenced by setSDPLinesFromRTPSink(), and ServerMediaSubsession::setServerAddressAndPortForSDP().
1.5.2