OnDemandServerMediaSubsession Class Reference

#include <OnDemandServerMediaSubsession.hh>

Inheritance diagram for OnDemandServerMediaSubsession:

Inheritance graph
[legend]
Collaboration diagram for OnDemandServerMediaSubsession:

Collaboration graph
[legend]

Public Member Functions

unsigned trackNumber () const
char const * trackId ()
virtual void testScaleFactor (float &scale)
virtual float duration () const
void setServerAddressAndPortForSDP (netAddressBits addressBits, portNumBits portBits)
UsageEnvironmentenvir () 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 FramedSourcecreateNewStreamSource (unsigned clientSessionId, unsigned &estBitrate)=0
virtual RTPSinkcreateNewRTPSink (Groupsock *rtpGroupsock, unsigned char rtpPayloadTypeIfDynamic, FramedSource *inputSource)=0
char const * rangeSDPLine () const
TaskTokennextTask ()

Protected Attributes

char * fSDPLines
ServerMediaSessionfParentSession
netAddressBits fServerAddressForSDP
portNumBits fPortNumForSDP

Private Member Functions

void setSDPLinesFromRTPSink (RTPSink *rtpSink, FramedSource *inputSource, unsigned estBitrate)

Private Attributes

Boolean fReuseFirstSource
portNumBits fInitialPortNum
HashTablefDestinationsHashTable
void * fLastStreamToken
char fCNAME [100]

Friends

class StreamState

Detailed Description

Definition at line 32 of file OnDemandServerMediaSubsession.hh.


Constructor & Destructor Documentation

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 }


Member Function Documentation

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().

00348                                                                          {
00349   // Default implementation: Do nothing
00350 }

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().

00353                                                                      {
00354   // Default implementation: Do nothing
00355 }

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().

00359                                             {
00360   // default implementation: assume an unbounded session:
00361   return 0.0;
00362 }

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]

Reimplemented in MediaSink.

Definition at line 90 of file Media.cpp.

References False.

Referenced by MediaSink::lookupByName().

00090                              {
00091   return False; // default implementation
00092 }

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   }


Friends And Related Function Documentation

friend class StreamState [friend]

Definition at line 94 of file OnDemandServerMediaSubsession.hh.

Referenced by getStreamParameters().


Field Documentation

char* OnDemandServerMediaSubsession::fSDPLines [protected]

Definition at line 86 of file OnDemandServerMediaSubsession.hh.

Referenced by sdpLines(), setSDPLinesFromRTPSink(), and ~OnDemandServerMediaSubsession().

Boolean OnDemandServerMediaSubsession::fReuseFirstSource [private]

Definition at line 89 of file OnDemandServerMediaSubsession.hh.

Referenced by getStreamParameters(), pauseStream(), seekStream(), and setStreamScale().

portNumBits OnDemandServerMediaSubsession::fInitialPortNum [private]

Definition at line 90 of file OnDemandServerMediaSubsession.hh.

Referenced by getStreamParameters().

HashTable* OnDemandServerMediaSubsession::fDestinationsHashTable [private]

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().


The documentation for this class was generated from the following files:
Generated on Fri Sep 3 02:37:40 2010 for live by  doxygen 1.5.2