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


Public Member Functions | |
| unsigned | trackNumber () const |
| char const * | trackId () |
| 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 WAVAudioFileServerMediaSubsession * | createNew (UsageEnvironment &env, char const *fileName, Boolean reuseFirstSource, Boolean convertToULaw=False) |
| 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 | |
| WAVAudioFileServerMediaSubsession (UsageEnvironment &env, char const *fileName, Boolean reuseFirstSource, Boolean convertToULaw) | |
| virtual | ~WAVAudioFileServerMediaSubsession () |
| virtual void | seekStreamSource (FramedSource *inputSource, float seekNPT) |
| virtual void | setStreamSourceScale (FramedSource *inputSource, float scale) |
| virtual FramedSource * | createNewStreamSource (unsigned clientSessionId, unsigned &estBitrate) |
| virtual RTPSink * | createNewRTPSink (Groupsock *rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource *inputSource) |
| virtual void | testScaleFactor (float &scale) |
| virtual float | duration () const |
| 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) |
| virtual void | pauseStream (unsigned clientSessionId, void *streamToken) |
| virtual void | seekStream (unsigned clientSessionId, void *streamToken, float 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 | closeStreamSource (FramedSource *inputSource) |
| char const * | rangeSDPLine () const |
| TaskToken & | nextTask () |
Protected Attributes | |
| Boolean | fConvertToULaw |
| unsigned char | fAudioFormat |
| unsigned char | fBitsPerSample |
| unsigned | fSamplingFrequency |
| unsigned | fNumChannels |
| float | fFileDuration |
| char const * | fFileName |
| u_int64_t | fFileSize |
| ServerMediaSession * | fParentSession |
| netAddressBits | fServerAddressForSDP |
| portNumBits | fPortNumForSDP |
Definition at line 29 of file WAVAudioFileServerMediaSubsession.hh.
| WAVAudioFileServerMediaSubsession::WAVAudioFileServerMediaSubsession | ( | UsageEnvironment & | env, | |
| char const * | fileName, | |||
| Boolean | reuseFirstSource, | |||
| Boolean | convertToULaw | |||
| ) | [protected] |
Definition at line 35 of file WAVAudioFileServerMediaSubsession.cpp.
00037 : FileServerMediaSubsession(env, fileName, reuseFirstSource), 00038 fConvertToULaw(convertToULaw) { 00039 }
| WAVAudioFileServerMediaSubsession::~WAVAudioFileServerMediaSubsession | ( | ) | [protected, virtual] |
| WAVAudioFileServerMediaSubsession * WAVAudioFileServerMediaSubsession::createNew | ( | UsageEnvironment & | env, | |
| char const * | fileName, | |||
| Boolean | reuseFirstSource, | |||
| Boolean | convertToULaw = False | |||
| ) | [static] |
Definition at line 28 of file WAVAudioFileServerMediaSubsession.cpp.
References env.
Referenced by createNewSMS().
00029 { 00030 return new WAVAudioFileServerMediaSubsession(env, fileName, 00031 reuseFirstSource, convertToULaw); 00032 }
| void WAVAudioFileServerMediaSubsession::seekStreamSource | ( | FramedSource * | inputSource, | |
| float | seekNPT | |||
| ) | [protected, virtual] |
Reimplemented from OnDemandServerMediaSubsession.
Definition at line 46 of file WAVAudioFileServerMediaSubsession.cpp.
References WAVAudioFileSource::seekToPCMByte().
00046 { 00047 WAVAudioFileSource* wavSource; 00048 if (fBitsPerSample == 16) { 00049 // "inputSource" is a filter; its input source is the original WAV file source: 00050 wavSource = (WAVAudioFileSource*)(((FramedFilter*)inputSource)->inputSource()); 00051 } else { 00052 // "inputSource" is the original WAV file source: 00053 wavSource = (WAVAudioFileSource*)inputSource; 00054 } 00055 00056 unsigned seekSampleNumber = (unsigned)(seekNPT*fSamplingFrequency); 00057 unsigned seekByteNumber = (seekSampleNumber*fNumChannels*fBitsPerSample)/8; 00058 00059 wavSource->seekToPCMByte(seekByteNumber); 00060 }
| void WAVAudioFileServerMediaSubsession::setStreamSourceScale | ( | FramedSource * | inputSource, | |
| float | scale | |||
| ) | [protected, virtual] |
Reimplemented from OnDemandServerMediaSubsession.
Definition at line 63 of file WAVAudioFileServerMediaSubsession.cpp.
References WAVAudioFileSource::setScaleFactor().
00063 { 00064 int iScale = (int)scale; 00065 WAVAudioFileSource* wavSource; 00066 if (fBitsPerSample == 16) { 00067 // "inputSource" is a filter; its input source is the original WAV file source: 00068 wavSource = (WAVAudioFileSource*)(((FramedFilter*)inputSource)->inputSource()); 00069 } else { 00070 // "inputSource" is the original WAV file source: 00071 wavSource = (WAVAudioFileSource*)inputSource; 00072 } 00073 00074 wavSource->setScaleFactor(iScale); 00075 }
| FramedSource * WAVAudioFileServerMediaSubsession::createNewStreamSource | ( | unsigned | clientSessionId, | |
| unsigned & | estBitrate | |||
| ) | [protected, virtual] |
Implements OnDemandServerMediaSubsession.
Definition at line 78 of file WAVAudioFileServerMediaSubsession.cpp.
References AudioInputDevice::bitsPerSample(), Medium::close(), EndianSwap16::createNew(), uLawFromPCMAudioSource::createNew(), WAVAudioFileSource::createNew(), WAVAudioFileSource::getAudioFormat(), NULL, AudioInputDevice::numChannels(), WAVAudioFileSource::numPCMBytes(), and AudioInputDevice::samplingFrequency().
00078 { 00079 FramedSource* resultSource = NULL; 00080 do { 00081 WAVAudioFileSource* wavSource 00082 = WAVAudioFileSource::createNew(envir(), fFileName); 00083 if (wavSource == NULL) break; 00084 00085 // Get attributes of the audio source: 00086 00087 fAudioFormat = wavSource->getAudioFormat(); 00088 fBitsPerSample = wavSource->bitsPerSample(); 00089 if (fBitsPerSample != 8 && fBitsPerSample != 16) { 00090 envir() << "The input file contains " << fBitsPerSample 00091 << " bit-per-sample audio, which we don't handle\n"; 00092 break; 00093 } 00094 fSamplingFrequency = wavSource->samplingFrequency(); 00095 fNumChannels = wavSource->numChannels(); 00096 unsigned bitsPerSecond 00097 = fSamplingFrequency*fBitsPerSample*fNumChannels; 00098 00099 fFileDuration = (float)((8.0*wavSource->numPCMBytes()) 00100 /(fSamplingFrequency*fNumChannels*fBitsPerSample)); 00101 00102 // Add in any filter necessary to transform the data prior to streaming: 00103 if (fBitsPerSample == 16) { 00104 // Note that samples in the WAV audio file are in little-endian order. 00105 if (fConvertToULaw) { 00106 // Add a filter that converts from raw 16-bit PCM audio 00107 // to 8-bit u-law audio: 00108 resultSource 00109 = uLawFromPCMAudioSource::createNew(envir(), wavSource, 1/*little-endian*/); 00110 bitsPerSecond /= 2; 00111 } else { 00112 // Add a filter that converts from little-endian to network (big-endian) order: 00113 resultSource = EndianSwap16::createNew(envir(), wavSource); 00114 } 00115 } else { // fBitsPerSample == 8 00116 // Don't do any transformation; send the 8-bit PCM data 'as is': 00117 resultSource = wavSource; 00118 } 00119 00120 estBitrate = (bitsPerSecond+500)/1000; // kbps 00121 return resultSource; 00122 } while (0); 00123 00124 // An error occurred: 00125 Medium::close(resultSource); 00126 return NULL; 00127 }
| RTPSink * WAVAudioFileServerMediaSubsession::createNewRTPSink | ( | Groupsock * | rtpGroupsock, | |
| unsigned char | rtpPayloadTypeIfDynamic, | |||
| FramedSource * | inputSource | |||
| ) | [protected, virtual] |
Implements OnDemandServerMediaSubsession.
Definition at line 130 of file WAVAudioFileServerMediaSubsession.cpp.
References SimpleRTPSink::createNew(), NULL, WA_PCM, WA_PCMA, and WA_PCMU.
00132 { 00133 do { 00134 char* mimeType; 00135 unsigned char payloadFormatCode; 00136 if (fAudioFormat == WA_PCM) { 00137 if (fBitsPerSample == 16) { 00138 if (fConvertToULaw) { 00139 mimeType = "PCMU"; 00140 if (fSamplingFrequency == 8000 && fNumChannels == 1) { 00141 payloadFormatCode = 0; // a static RTP payload type 00142 } else { 00143 payloadFormatCode = rtpPayloadTypeIfDynamic; 00144 } 00145 } else { 00146 mimeType = "L16"; 00147 if (fSamplingFrequency == 44100 && fNumChannels == 2) { 00148 payloadFormatCode = 10; // a static RTP payload type 00149 } else if (fSamplingFrequency == 44100 && fNumChannels == 1) { 00150 payloadFormatCode = 11; // a static RTP payload type 00151 } else { 00152 payloadFormatCode = rtpPayloadTypeIfDynamic; 00153 } 00154 } 00155 } else { // fBitsPerSample == 8 00156 mimeType = "L8"; 00157 payloadFormatCode = rtpPayloadTypeIfDynamic; 00158 } 00159 } else if (fAudioFormat == WA_PCMU) { 00160 mimeType = "PCMU"; 00161 if (fSamplingFrequency == 8000 && fNumChannels == 1) { 00162 payloadFormatCode = 0; // a static RTP payload type 00163 } else { 00164 payloadFormatCode = rtpPayloadTypeIfDynamic; 00165 } 00166 } else if (fAudioFormat == WA_PCMA) { 00167 mimeType = "PCMA"; 00168 if (fSamplingFrequency == 8000 && fNumChannels == 1) { 00169 payloadFormatCode = 8; // a static RTP payload type 00170 } else { 00171 payloadFormatCode = rtpPayloadTypeIfDynamic; 00172 } 00173 } else { //unknown format 00174 break; 00175 } 00176 00177 return SimpleRTPSink::createNew(envir(), rtpGroupsock, 00178 payloadFormatCode, fSamplingFrequency, 00179 "audio", mimeType, fNumChannels); 00180 } while (0); 00181 00182 // An error occurred: 00183 return NULL; 00184 }
| void WAVAudioFileServerMediaSubsession::testScaleFactor | ( | float & | scale | ) | [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Definition at line 186 of file WAVAudioFileServerMediaSubsession.cpp.
References fFileDuration.
00186 { 00187 if (fFileDuration <= 0.0) { 00188 // The file is non-seekable, so is probably a live input source. 00189 // We don't support scale factors other than 1 00190 scale = 1; 00191 } else { 00192 // We support any integral scale, other than 0 00193 int iScale = scale < 0.0 ? (int)(scale - 0.5) : (int)(scale + 0.5); // round 00194 if (iScale == 0) iScale = 1; 00195 scale = (float)iScale; 00196 } 00197 }
| float WAVAudioFileServerMediaSubsession::duration | ( | ) | const [protected, virtual] |
Reimplemented from ServerMediaSubsession.
Definition at line 199 of file WAVAudioFileServerMediaSubsession.cpp.
References fFileDuration.
00199 { 00200 return fFileDuration; 00201 }
| char const * OnDemandServerMediaSubsession::sdpLines | ( | ) | [protected, virtual, inherited] |
Implements ServerMediaSubsession.
Definition at line 74 of file OnDemandServerMediaSubsession.cpp.
References Medium::close(), OnDemandServerMediaSubsession::closeStreamSource(), OnDemandServerMediaSubsession::createNewRTPSink(), OnDemandServerMediaSubsession::createNewStreamSource(), Medium::envir(), OnDemandServerMediaSubsession::fSDPLines, NULL, OnDemandServerMediaSubsession::setSDPLinesFromRTPSink(), and ServerMediaSubsession::trackNumber().
Referenced by OnDemandServerMediaSubsession::setSDPLinesFromRTPSink().
00074 { 00075 if (fSDPLines == NULL) { 00076 // We need to construct a set of SDP lines that describe this 00077 // subsession (as a unicast stream). To do so, we first create 00078 // dummy (unused) source and "RTPSink" objects, 00079 // whose parameters we use for the SDP lines: 00080 unsigned estBitrate; // unused 00081 FramedSource* inputSource = createNewStreamSource(0, estBitrate); 00082 if (inputSource == NULL) return NULL; // file not found 00083 00084 struct in_addr dummyAddr; 00085 dummyAddr.s_addr = 0; 00086 Groupsock dummyGroupsock(envir(), dummyAddr, 0, 0); 00087 unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic 00088 RTPSink* dummyRTPSink 00089 = createNewRTPSink(&dummyGroupsock, rtpPayloadType, inputSource); 00090 00091 setSDPLinesFromRTPSink(dummyRTPSink, inputSource); 00092 Medium::close(dummyRTPSink); 00093 closeStreamSource(inputSource); 00094 } 00095 00096 return fSDPLines; 00097 }
| 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, inherited] |
Implements ServerMediaSubsession.
Definition at line 145 of file OnDemandServerMediaSubsession.cpp.
References HashTable::Add(), BasicUDPSink::createNew(), OnDemandServerMediaSubsession::createNewRTPSink(), OnDemandServerMediaSubsession::createNewStreamSource(), Medium::envir(), False, OnDemandServerMediaSubsession::fDestinationsHashTable, OnDemandServerMediaSubsession::fInitialPortNum, OnDemandServerMediaSubsession::fLastStreamToken, OnDemandServerMediaSubsession::fReuseFirstSource, NULL, Port::num(), Groupsock::removeAllDestinations(), Socket::socketNum(), OnDemandServerMediaSubsession::StreamState, and ServerMediaSubsession::trackNumber().
00157 { 00158 if (destinationAddress == 0) destinationAddress = clientAddress; 00159 struct in_addr destinationAddr; destinationAddr.s_addr = destinationAddress; 00160 isMulticast = False; 00161 00162 if (fLastStreamToken != NULL && fReuseFirstSource) { 00163 // Special case: Rather than creating a new 'StreamState', 00164 // we reuse the one that we've already created: 00165 serverRTPPort = ((StreamState*)fLastStreamToken)->serverRTPPort(); 00166 serverRTCPPort = ((StreamState*)fLastStreamToken)->serverRTCPPort(); 00167 ++((StreamState*)fLastStreamToken)->referenceCount(); 00168 streamToken = fLastStreamToken; 00169 } else { 00170 // Normal case: Create a new media source: 00171 unsigned streamBitrate; 00172 FramedSource* mediaSource 00173 = createNewStreamSource(clientSessionId, streamBitrate); 00174 00175 // Create 'groupsock' and 'sink' objects for the destination, 00176 // using previously unused server port numbers: 00177 RTPSink* rtpSink; 00178 BasicUDPSink* udpSink; 00179 Groupsock* rtpGroupsock; 00180 Groupsock* rtcpGroupsock; 00181 portNumBits serverPortNum; 00182 if (clientRTCPPort.num() == 0) { 00183 // We're streaming raw UDP (not RTP). Create a single groupsock: 00184 NoReuse dummy; // ensures that we skip over ports that are already in use 00185 for (serverPortNum = fInitialPortNum; ; ++serverPortNum) { 00186 struct in_addr dummyAddr; dummyAddr.s_addr = 0; 00187 00188 serverRTPPort = serverPortNum; 00189 rtpGroupsock = new Groupsock(envir(), dummyAddr, serverRTPPort, 255); 00190 if (rtpGroupsock->socketNum() >= 0) break; // success 00191 } 00192 00193 rtcpGroupsock = NULL; 00194 rtpSink = NULL; 00195 udpSink = BasicUDPSink::createNew(envir(), rtpGroupsock); 00196 } else { 00197 // Normal case: We're streaming RTP (over UDP or TCP). Create a pair of 00198 // groupsocks (RTP and RTCP), with adjacent port numbers (RTP port number even): 00199 NoReuse dummy; // ensures that we skip over ports that are already in use 00200 for (portNumBits serverPortNum = fInitialPortNum; ; serverPortNum += 2) { 00201 struct in_addr dummyAddr; dummyAddr.s_addr = 0; 00202 00203 serverRTPPort = serverPortNum; 00204 rtpGroupsock = new Groupsock(envir(), dummyAddr, serverRTPPort, 255); 00205 if (rtpGroupsock->socketNum() < 0) { 00206 delete rtpGroupsock; 00207 continue; // try again 00208 } 00209 00210 serverRTCPPort = serverPortNum+1; 00211 rtcpGroupsock = new Groupsock(envir(), dummyAddr, serverRTCPPort, 255); 00212 if (rtcpGroupsock->socketNum() < 0) { 00213 delete rtpGroupsock; 00214 delete rtcpGroupsock; 00215 continue; // try again 00216 } 00217 00218 break; // success 00219 } 00220 00221 unsigned char rtpPayloadType = 96 + trackNumber()-1; // if dynamic 00222 rtpSink = createNewRTPSink(rtpGroupsock, rtpPayloadType, mediaSource); 00223 udpSink = NULL; 00224 } 00225 00226 // Turn off the destinations for each groupsock. They'll get set later 00227 // (unless TCP is used instead): 00228 if (rtpGroupsock != NULL) rtpGroupsock->removeAllDestinations(); 00229 if (rtcpGroupsock != NULL) rtcpGroupsock->removeAllDestinations(); 00230 00231 // Set up the state of the stream. The stream will get started later: 00232 streamToken = fLastStreamToken 00233 = new StreamState(*this, serverRTPPort, serverRTCPPort, rtpSink, udpSink, 00234 streamBitrate, mediaSource, 00235 rtpGroupsock, rtcpGroupsock); 00236 } 00237 00238 // Record these destinations as being for this client session id: 00239 Destinations* destinations; 00240 if (tcpSocketNum < 0) { // UDP 00241 destinations = new Destinations(destinationAddr, clientRTPPort, clientRTCPPort); 00242 } else { // TCP 00243 destinations = new Destinations(tcpSocketNum, rtpChannelId, rtcpChannelId); 00244 } 00245 fDestinationsHashTable->Add((char const*)clientSessionId, destinations); 00246 }
| void OnDemandServerMediaSubsession::startStream | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| TaskFunc * | rtcpRRHandler, | |||
| void * | rtcpRRHandlerClientData, | |||
| unsigned short & | rtpSeqNum, | |||
| unsigned & | rtpTimestamp | |||
| ) | [protected, virtual, inherited] |
Implements ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 248 of file OnDemandServerMediaSubsession.cpp.
References RTPSink::currentSeqNo(), OnDemandServerMediaSubsession::fDestinationsHashTable, HashTable::Lookup(), NULL, RTPSink::presetNextTimestamp(), StreamState::rtpSink(), and StreamState::startPlaying().
Referenced by MPEG2TransportFileServerMediaSubsession::startStream().
00253 { 00254 StreamState* streamState = (StreamState*)streamToken; 00255 Destinations* destinations 00256 = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); 00257 if (streamState != NULL) { 00258 streamState->startPlaying(destinations, 00259 rtcpRRHandler, rtcpRRHandlerClientData); 00260 if (streamState->rtpSink() != NULL) { 00261 rtpSeqNum = streamState->rtpSink()->currentSeqNo(); 00262 rtpTimestamp = streamState->rtpSink()->presetNextTimestamp(); 00263 } 00264 } 00265 }
| void OnDemandServerMediaSubsession::pauseStream | ( | unsigned | clientSessionId, | |
| void * | streamToken | |||
| ) | [protected, virtual, inherited] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 267 of file OnDemandServerMediaSubsession.cpp.
References OnDemandServerMediaSubsession::fReuseFirstSource, NULL, and StreamState::pause().
Referenced by MPEG2TransportFileServerMediaSubsession::pauseStream(), and MPEG2TransportFileServerMediaSubsession::startStream().
00268 { 00269 // Pausing isn't allowed if multiple clients are receiving data from 00270 // the same source: 00271 if (fReuseFirstSource) return; 00272 00273 StreamState* streamState = (StreamState*)streamToken; 00274 if (streamState != NULL) streamState->pause(); 00275 }
| void OnDemandServerMediaSubsession::seekStream | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| float | seekNPT | |||
| ) | [protected, virtual, inherited] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 277 of file OnDemandServerMediaSubsession.cpp.
References OnDemandServerMediaSubsession::fReuseFirstSource, StreamState::mediaSource(), NULL, and OnDemandServerMediaSubsession::seekStreamSource().
Referenced by MPEG2TransportFileServerMediaSubsession::seekStream().
00278 { 00279 // Seeking isn't allowed if multiple clients are receiving data from 00280 // the same source: 00281 if (fReuseFirstSource) return; 00282 00283 StreamState* streamState = (StreamState*)streamToken; 00284 if (streamState != NULL && streamState->mediaSource() != NULL) { 00285 seekStreamSource(streamState->mediaSource(), seekNPT); 00286 } 00287 }
| void OnDemandServerMediaSubsession::setStreamScale | ( | unsigned | clientSessionId, | |
| void * | streamToken, | |||
| float | scale | |||
| ) | [protected, virtual, inherited] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 289 of file OnDemandServerMediaSubsession.cpp.
References OnDemandServerMediaSubsession::fReuseFirstSource, StreamState::mediaSource(), NULL, and OnDemandServerMediaSubsession::setStreamSourceScale().
Referenced by MPEG2TransportFileServerMediaSubsession::setStreamScale().
00290 { 00291 // Changing the scale factor isn't allowed if multiple clients are receiving data 00292 // from the same source: 00293 if (fReuseFirstSource) return; 00294 00295 StreamState* streamState = (StreamState*)streamToken; 00296 if (streamState != NULL && streamState->mediaSource() != NULL) { 00297 setStreamSourceScale(streamState->mediaSource(), scale); 00298 } 00299 }
| void OnDemandServerMediaSubsession::deleteStream | ( | unsigned | clientSessionId, | |
| void *& | streamToken | |||
| ) | [protected, virtual, inherited] |
Reimplemented from ServerMediaSubsession.
Reimplemented in MPEG2TransportFileServerMediaSubsession.
Definition at line 301 of file OnDemandServerMediaSubsession.cpp.
References StreamState::endPlaying(), OnDemandServerMediaSubsession::fDestinationsHashTable, OnDemandServerMediaSubsession::fLastStreamToken, HashTable::Lookup(), NULL, StreamState::referenceCount(), and HashTable::Remove().
Referenced by MPEG2TransportFileServerMediaSubsession::deleteStream().
00302 { 00303 StreamState* streamState = (StreamState*)streamToken; 00304 00305 // Look up (and remove) the destinations for this client session: 00306 Destinations* destinations 00307 = (Destinations*)(fDestinationsHashTable->Lookup((char const*)clientSessionId)); 00308 if (destinations != NULL) { 00309 fDestinationsHashTable->Remove((char const*)clientSessionId); 00310 00311 // Stop streaming to these destinations: 00312 if (streamState != NULL) streamState->endPlaying(destinations); 00313 } 00314 00315 // Delete the "StreamState" structure if it's no longer being used: 00316 if (streamState != NULL) { 00317 if (streamState->referenceCount() > 0) --streamState->referenceCount(); 00318 if (streamState->referenceCount() == 0) { 00319 delete streamState; 00320 if (fLastStreamToken == streamToken) fLastStreamToken = NULL; 00321 streamToken = NULL; 00322 } 00323 } 00324 00325 // Finally, delete the destinations themselves: 00326 delete destinations; 00327 }
| char const * OnDemandServerMediaSubsession::getAuxSDPLine | ( | RTPSink * | rtpSink, | |
| FramedSource * | inputSource | |||
| ) | [protected, virtual, inherited] |
Reimplemented in MPEG4VideoFileServerMediaSubsession.
Definition at line 330 of file OnDemandServerMediaSubsession.cpp.
References RTPSink::auxSDPLine(), and NULL.
Referenced by OnDemandServerMediaSubsession::setSDPLinesFromRTPSink().
00330 { 00331 // Default implementation: 00332 return rtpSink == NULL ? NULL : rtpSink->auxSDPLine(); 00333 }
| void OnDemandServerMediaSubsession::closeStreamSource | ( | FramedSource * | inputSource | ) | [protected, virtual, inherited] |
Definition at line 345 of file OnDemandServerMediaSubsession.cpp.
References Medium::close().
Referenced by StreamState::reclaim(), and OnDemandServerMediaSubsession::sdpLines().
00345 { 00346 Medium::close(inputSource); 00347 }
| unsigned ServerMediaSubsession::trackNumber | ( | ) | const [inline, inherited] |
Definition at line 115 of file ServerMediaSession.hh.
References ServerMediaSubsession::fTrackNumber.
Referenced by OnDemandServerMediaSubsession::getStreamParameters(), and OnDemandServerMediaSubsession::sdpLines().
00115 { 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 OnDemandServerMediaSubsession::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::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 OnDemandServerMediaSubsession::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(), OnDemandServerMediaSubsession::closeStreamSource(), WAVAudioFileSource::createNew(), QuickTimeFileSink::createNew(), QCELPAudioRTPSource::createNew(), MP3HTTPSource::createNew(), MP3FileSource::createNew(), AVIFileSink::createNew(), AMRAudioRTPSource::createNew(), createNewStreamSource(), MPEG1or2DemuxedServerMediaSubsession::createNewStreamSource(), MediaSubsession::deInitiate(), MediaSubsession::initiate(), MPEG1or2ProgramStreamFileDuration(), MPEG1or2Demux::noteElementaryStreamDeletion(), ByteStreamMultiFileSource::onSourceClosure1(), StreamState::reclaim(), RTSPServer::removeServerMediaSession(), OnDemandServerMediaSubsession::sdpLines(), shutdown(), 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