MediaSubsession Class Reference

#include <MediaSession.hh>

Collaboration diagram for MediaSubsession:

Collaboration graph
[legend]

Public Member Functions

MediaSessionparentSession ()
MediaSession const & parentSession () const
unsigned short clientPortNum () const
unsigned char rtpPayloadFormat () const
char const * savedSDPLines () const
char const * mediumName () const
char const * codecName () const
char const * protocolName () const
char const * controlPath () const
Boolean isSSM () const
unsigned short videoWidth () const
unsigned short videoHeight () const
unsigned videoFPS () const
unsigned numChannels () const
float & scale ()
RTPSourcertpSource ()
RTCPInstancertcpInstance ()
unsigned rtpTimestampFrequency () const
FramedSourcereadSource ()
void addFilter (FramedFilter *filter)
double playStartTime () const
double playEndTime () const
char * absStartTime () const
char * absEndTime () const
double & _playStartTime ()
double & _playEndTime ()
char *& _absStartTime ()
char *& _absEndTime ()
Boolean initiate (int useSpecialRTPoffset=-1)
void deInitiate ()
Boolean setClientPortNum (unsigned short portNum)
void receiveRawMP3ADUs ()
void receiveRawJPEGFrames ()
char *& connectionEndpointName ()
char const * connectionEndpointName () const
unsigned bandwidth () const
unsigned fmtp_auxiliarydatasizelength () const
unsigned fmtp_constantduration () const
unsigned fmtp_constantsize () const
unsigned fmtp_crc () const
unsigned fmtp_ctsdeltalength () const
unsigned fmtp_de_interleavebuffersize () const
unsigned fmtp_dtsdeltalength () const
unsigned fmtp_indexdeltalength () const
unsigned fmtp_indexlength () const
unsigned fmtp_interleaving () const
unsigned fmtp_maxdisplacement () const
unsigned fmtp_objecttype () const
unsigned fmtp_octetalign () const
unsigned fmtp_profile_level_id () const
unsigned fmtp_robustsorting () const
unsigned fmtp_sizelength () const
unsigned fmtp_streamstateindication () const
unsigned fmtp_streamtype () const
Boolean fmtp_cpresent () const
Boolean fmtp_randomaccessindication () const
char const * fmtp_config () const
char const * fmtp_configuration () const
char const * fmtp_mode () const
char const * fmtp_spropparametersets () const
char const * fmtp_emphasis () const
char const * fmtp_channelorder () const
netAddressBits connectionEndpointAddress () const
void setDestinations (netAddressBits defaultDestAddress)
char const * sessionId () const
void setSessionId (char const *sessionId)
double getNormalPlayTime (struct timeval const &presentationTime)

Data Fields

unsigned short serverPortNum
unsigned char rtpChannelId
unsigned char rtcpChannelId
MediaSinksink
void * miscPtr
struct {
   u_int16_t   seqNum
   u_int32_t   timestamp
   Boolean   infoIsNew
rtpInfo

Protected Member Functions

 MediaSubsession (MediaSession &parent)
virtual ~MediaSubsession ()
UsageEnvironmentenv ()
void setNext (MediaSubsession *next)
Boolean parseSDPLine_c (char const *sdpLine)
Boolean parseSDPLine_b (char const *sdpLine)
Boolean parseSDPAttribute_rtpmap (char const *sdpLine)
Boolean parseSDPAttribute_control (char const *sdpLine)
Boolean parseSDPAttribute_range (char const *sdpLine)
Boolean parseSDPAttribute_fmtp (char const *sdpLine)
Boolean parseSDPAttribute_source_filter (char const *sdpLine)
Boolean parseSDPAttribute_x_dimensions (char const *sdpLine)
Boolean parseSDPAttribute_framerate (char const *sdpLine)
virtual Boolean createSourceObjects (int useSpecialRTPoffset)

Protected Attributes

MediaSessionfParent
MediaSubsessionfNext
char * fConnectionEndpointName
unsigned short fClientPortNum
unsigned char fRTPPayloadFormat
char * fSavedSDPLines
char * fMediumName
char * fCodecName
char * fProtocolName
unsigned fRTPTimestampFrequency
char * fControlPath
in_addr fSourceFilterAddr
unsigned fBandwidth
unsigned fAuxiliarydatasizelength
unsigned fConstantduration
unsigned fConstantsize
unsigned fCRC
unsigned fCtsdeltalength
unsigned fDe_interleavebuffersize
unsigned fDtsdeltalength
unsigned fIndexdeltalength
unsigned fIndexlength
unsigned fInterleaving
unsigned fMaxdisplacement
unsigned fObjecttype
unsigned fOctetalign
unsigned fProfile_level_id
unsigned fRobustsorting
unsigned fSizelength
unsigned fStreamstateindication
unsigned fStreamtype
Boolean fCpresent
Boolean fRandomaccessindication
char * fConfig
char * fMode
char * fSpropParameterSets
char * fEmphasis
char * fChannelOrder
double fPlayStartTime
double fPlayEndTime
char * fAbsStartTime
char * fAbsEndTime
unsigned short fVideoWidth
unsigned short fVideoHeight
unsigned fVideoFPS
unsigned fNumChannels
float fScale
double fNPT_PTS_Offset
GroupsockfRTPSocket
GroupsockfRTCPSocket
RTPSourcefRTPSource
RTCPInstancefRTCPInstance
FramedSourcefReadSource
Boolean fReceiveRawMP3ADUs
Boolean fReceiveRawJPEGFrames
char * fSessionId

Friends

class MediaSession
class MediaSubsessionIterator

Detailed Description

Definition at line 154 of file MediaSession.hh.


Constructor & Destructor Documentation

MediaSubsession::MediaSubsession ( MediaSession parent  )  [protected]

Definition at line 576 of file MediaSession.cpp.

References False, and rtpInfo.

MediaSubsession::~MediaSubsession (  )  [protected, virtual]

Definition at line 600 of file MediaSession.cpp.

References deInitiate(), fAbsEndTime, fAbsStartTime, fChannelOrder, fCodecName, fConfig, fConnectionEndpointName, fControlPath, fEmphasis, fMediumName, fMode, fNext, fProtocolName, fSavedSDPLines, fSessionId, and fSpropParameterSets.

00600                                   {
00601   deInitiate();
00602 
00603   delete[] fConnectionEndpointName; delete[] fSavedSDPLines;
00604   delete[] fMediumName; delete[] fCodecName; delete[] fProtocolName;
00605   delete[] fControlPath;
00606   delete[] fConfig; delete[] fMode; delete[] fSpropParameterSets; delete[] fEmphasis; delete[] fChannelOrder;
00607   delete[] fAbsStartTime; delete[] fAbsEndTime;
00608   delete[] fSessionId;
00609 
00610   delete fNext;
00611 }


Member Function Documentation

MediaSession& MediaSubsession::parentSession (  )  [inline]

Definition at line 156 of file MediaSession.hh.

References fParent.

Referenced by ProxyServerMediaSubsession::closeStreamSource(), connectionEndpointAddress(), RTSPClient::constructSubsessionURL(), ProxyRTSPClient::continueAfterSETUP(), ProxyServerMediaSubsession::createNewStreamSource(), and subsessionAfterPlaying().

00156 { return fParent; }

MediaSession const& MediaSubsession::parentSession (  )  const [inline]

Definition at line 157 of file MediaSession.hh.

References fParent.

00157 { return fParent; }

unsigned short MediaSubsession::clientPortNum (  )  const [inline]

Definition at line 159 of file MediaSession.hh.

References fClientPortNum.

Referenced by continueAfterDESCRIBE(), continueAfterSETUP(), RTSPClient::sendRequest(), setupNextSubsession(), and setupStreams().

00159 { return fClientPortNum; }

unsigned char MediaSubsession::rtpPayloadFormat (  )  const [inline]

Definition at line 160 of file MediaSession.hh.

References fRTPPayloadFormat.

00160 { return fRTPPayloadFormat; }

char const* MediaSubsession::savedSDPLines (  )  const [inline]

Definition at line 161 of file MediaSession.hh.

References fSavedSDPLines.

Referenced by QuickTimeFileSink::addAtom_hdlr2().

00161 { return fSavedSDPLines; }

char const* MediaSubsession::mediumName (  )  const [inline]

Definition at line 162 of file MediaSession.hh.

References fMediumName.

Referenced by QuickTimeFileSink::addAtom_hdlr2(), DummySink::afterGettingFrame(), continueAfterDESCRIBE(), continueAfterSETUP(), ProxyServerMediaSubsession::createNewRTPSink(), createSourceObjects(), QuickTimeFileSink::onRTCPBye(), AVIFileSink::onRTCPBye(), operator<<(), printQOSData(), AVISubsessionIOState::setAVIstate(), SubsessionIOState::setQTstate(), setupStreams(), subsessionByeHandler(), SubsessionIOState::useFrameForHinting(), and while().

00162 { return fMediumName; }

char const* MediaSubsession::codecName (  )  const [inline]

Definition at line 163 of file MediaSession.hh.

References fCodecName.

Referenced by QuickTimeFileSink::addAtom_hdlr2(), DummySink::afterGettingFrame(), ProxyServerMediaSubsession::codecName(), continueAfterDESCRIBE(), continueAfterSETUP(), ProxyRTSPClient::continueAfterSETUP(), ProxyServerMediaSubsession::createNewRTPSink(), ProxyServerMediaSubsession::createNewStreamSource(), createSourceObjects(), QuickTimeFileSink::onRTCPBye(), AVIFileSink::onRTCPBye(), operator<<(), parseSDPAttribute_rtpmap(), printQOSData(), AVISubsessionIOState::setAVIstate(), SubsessionIOState::setQTstate(), setupStreams(), subsessionByeHandler(), AVISubsessionIOState::useFrame(), and SubsessionIOState::useFrameForHinting().

00163 { return fCodecName; }

char const* MediaSubsession::protocolName (  )  const [inline]

Definition at line 164 of file MediaSession.hh.

References fProtocolName.

Referenced by RTSPClient::sendRequest().

00164 { return fProtocolName; }

char const* MediaSubsession::controlPath (  )  const [inline]

Definition at line 165 of file MediaSession.hh.

References fControlPath.

Referenced by RTSPClient::constructSubsessionURL(), and parseSDPAttribute_control().

00165 { return fControlPath; }

Boolean MediaSubsession::isSSM (  )  const [inline]

Definition at line 166 of file MediaSession.hh.

References fSourceFilterAddr.

Referenced by initiate(), and setDestinations().

00166 { return fSourceFilterAddr.s_addr != 0; }

unsigned short MediaSubsession::videoWidth (  )  const [inline]

Definition at line 168 of file MediaSession.hh.

References fVideoWidth.

Referenced by AVIFileSink::AVIFileSink(), createSourceObjects(), and QuickTimeFileSink::QuickTimeFileSink().

00168 { return fVideoWidth; }

unsigned short MediaSubsession::videoHeight (  )  const [inline]

Definition at line 169 of file MediaSession.hh.

References fVideoHeight.

Referenced by AVIFileSink::AVIFileSink(), createSourceObjects(), and QuickTimeFileSink::QuickTimeFileSink().

00169 { return fVideoHeight; }

unsigned MediaSubsession::videoFPS (  )  const [inline]

Definition at line 170 of file MediaSession.hh.

References fVideoFPS.

Referenced by AVIFileSink::AVIFileSink(), and QuickTimeFileSink::QuickTimeFileSink().

00170 { return fVideoFPS; }

unsigned MediaSubsession::numChannels (  )  const [inline]

Definition at line 171 of file MediaSession.hh.

References fNumChannels.

Referenced by QuickTimeFileSink::addAtom_hdlr2(), ProxyServerMediaSubsession::createNewRTPSink(), parseSDPAttribute_rtpmap(), AVISubsessionIOState::setAVIstate(), and while().

00171 { return fNumChannels; }

float& MediaSubsession::scale (  )  [inline]

Definition at line 172 of file MediaSession.hh.

References fScale.

Referenced by getNormalPlayTime(), RTSPClient::handlePLAYResponse(), and RTSPClient::sendRequest().

00172 { return fScale; }

RTPSource* MediaSubsession::rtpSource (  )  [inline]

Definition at line 174 of file MediaSession.hh.

References fRTPSource.

Referenced by QuickTimeFileSink::addAtom_hdlr2(), DummySink::afterGettingFrame(), SubsessionIOState::afterGettingFrame(), AVISubsessionIOState::afterGettingFrame(), beginQOSMeasurement(), checkForPacketArrival(), checkInterPacketGaps(), continueAfterDESCRIBE(), ProxyServerMediaSubsession::createNewStreamSource(), getNormalPlayTime(), RTSPClient::handlePLAYResponse(), RTSPClient::handleSETUPResponse(), printQOSData(), SubsessionIOState::syncOK(), SubsessionIOState::useFrame(), and SubsessionIOState::useFrameForHinting().

00174 { return fRTPSource; }

RTCPInstance* MediaSubsession::rtcpInstance (  )  [inline]

Definition at line 175 of file MediaSession.hh.

References fRTCPInstance.

Referenced by AVIFileSink::AVIFileSink(), ProxyServerMediaSubsession::createNewStreamSource(), RTSPClient::handleSETUPResponse(), QuickTimeFileSink::QuickTimeFileSink(), setupStreams(), and shutdownStream().

00175 { return fRTCPInstance; }

unsigned MediaSubsession::rtpTimestampFrequency (  )  const [inline]

Definition at line 176 of file MediaSession.hh.

References fRTPTimestampFrequency.

Referenced by QuickTimeFileSink::addAtom_hdlr2(), ProxyServerMediaSubsession::createNewRTPSink(), parseSDPAttribute_rtpmap(), QuickTimeFileSink::QuickTimeFileSink(), AVISubsessionIOState::setAVIstate(), SubsessionIOState::setQTstate(), and SubsessionIOState::useFrameForHinting().

00176 { return fRTPTimestampFrequency; }

FramedSource* MediaSubsession::readSource (  )  [inline]

Definition at line 177 of file MediaSession.hh.

References fReadSource.

Referenced by AVIFileSink::AVIFileSink(), AVISubsessionIOState::AVISubsessionIOState(), QuickTimeFileSink::continuePlaying(), AVIFileSink::continuePlaying(), ProxyServerMediaSubsession::createNewStreamSource(), MediaSession::initiateByMediaType(), QuickTimeFileSink::QuickTimeFileSink(), setupStreams(), ProxyServerMediaSubsession::subsessionByeHandler(), and SubsessionIOState::SubsessionIOState().

00177 { return fReadSource; }

void MediaSubsession::addFilter ( FramedFilter filter  ) 

Definition at line 613 of file MediaSession.cpp.

References fReadSource, FramedFilter::inputSource(), and NULL.

Referenced by ProxyServerMediaSubsession::createNewStreamSource().

00613                                                    {
00614   if (filter == NULL || filter->inputSource() != fReadSource) return; // sanity check
00615   fReadSource = filter;
00616 }

double MediaSubsession::playStartTime (  )  const

Definition at line 618 of file MediaSession.cpp.

References fParent, fPlayStartTime, and MediaSession::playStartTime().

Referenced by getNormalPlayTime(), and parseSDPAttribute_range().

00618                                             {
00619   if (fPlayStartTime > 0) return fPlayStartTime;
00620 
00621   return fParent.playStartTime();
00622 }

double MediaSubsession::playEndTime (  )  const

Definition at line 624 of file MediaSession.cpp.

References fParent, fPlayEndTime, and MediaSession::playEndTime().

Referenced by parseSDPAttribute_range().

00624                                           {
00625   if (fPlayEndTime > 0) return fPlayEndTime;
00626 
00627   return fParent.playEndTime();
00628 }

char * MediaSubsession::absStartTime (  )  const

Definition at line 630 of file MediaSession.cpp.

References MediaSession::absStartTime(), fAbsStartTime, fParent, and NULL.

00630                                           {
00631   if (fAbsStartTime != NULL) return fAbsStartTime;
00632 
00633   return fParent.absStartTime();
00634 }

char * MediaSubsession::absEndTime (  )  const

Definition at line 636 of file MediaSession.cpp.

References MediaSession::absEndTime(), fAbsEndTime, fParent, and NULL.

00636                                         {
00637   if (fAbsEndTime != NULL) return fAbsEndTime;
00638 
00639   return fParent.absEndTime();
00640 }

double& MediaSubsession::_playStartTime (  )  [inline]

Definition at line 188 of file MediaSession.hh.

References fPlayStartTime.

Referenced by RTSPClient::handlePLAYResponse().

00188 { return fPlayStartTime; }

double& MediaSubsession::_playEndTime (  )  [inline]

Definition at line 189 of file MediaSession.hh.

References fPlayEndTime.

Referenced by RTSPClient::handlePLAYResponse().

00189 { return fPlayEndTime; }

char*& MediaSubsession::_absStartTime (  )  [inline]

Definition at line 190 of file MediaSession.hh.

References fAbsStartTime.

Referenced by MediaSession::absStartTime(), RTSPClient::handlePLAYResponse(), and parseSDPAttribute_range().

00190 { return fAbsStartTime; }

char*& MediaSubsession::_absEndTime (  )  [inline]

Definition at line 191 of file MediaSession.hh.

References fAbsEndTime.

Referenced by MediaSession::absEndTime(), RTSPClient::handlePLAYResponse(), and parseSDPAttribute_range().

00191 { return fAbsEndTime; }

Boolean MediaSubsession::initiate ( int  useSpecialRTPoffset = -1  ) 

Definition at line 649 of file MediaSession.cpp.

References HashTable::Add(), Groupsock::changeDestinationParameters(), Medium::close(), MediaSession::CNAME(), connectionEndpointAddress(), HashTable::create(), RTCPInstance::createNew(), createSourceObjects(), env(), False, fBandwidth, fClientPortNum, fCodecName, fParent, fProtocolName, fReadSource, fRTCPInstance, fRTCPSocket, fRTPSocket, fRTPSource, fSourceFilterAddr, getSourcePort(), honorSDPPortChoice, increaseReceiveBufferTo(), IsMulticastAddress(), isSSM(), NULL, Port::num(), ONE_WORD_HASH_KEYS, HashTable::RemoveNext(), UsageEnvironment::setResultMsg(), socketHashTable(), Socket::socketNum(), and True.

Referenced by continueAfterDESCRIBE(), ProxyServerMediaSubsession::createNewStreamSource(), MediaSession::initiateByMediaType(), DarwinInjector::setDestination(), and setupNextSubsession().

00649                                                          {
00650   if (fReadSource != NULL) return True; // has already been initiated
00651 
00652   do {
00653     if (fCodecName == NULL) {
00654       env().setResultMsg("Codec is unspecified");
00655       break;
00656     }
00657 
00658     // Create RTP and RTCP 'Groupsocks' on which to receive incoming data.
00659     // (Groupsocks will work even for unicast addresses)
00660     struct in_addr tempAddr;
00661     tempAddr.s_addr = connectionEndpointAddress();
00662         // This could get changed later, as a result of a RTSP "SETUP"
00663 
00664     if (fClientPortNum != 0  && (honorSDPPortChoice || IsMulticastAddress(tempAddr.s_addr))) {
00665       // This is a multicast stream, and the sockets' port numbers were specified for us.  Use these:
00666       Boolean const protocolIsRTP = strcmp(fProtocolName, "RTP") == 0;
00667       if (protocolIsRTP) {
00668         fClientPortNum = fClientPortNum&~1; // use an even-numbered port for RTP, and the next (odd-numbered) port for RTCP
00669       }
00670       if (isSSM()) {
00671         fRTPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, fClientPortNum);
00672       } else {
00673         fRTPSocket = new Groupsock(env(), tempAddr, fClientPortNum, 255);
00674       }
00675       if (fRTPSocket == NULL) {
00676         env().setResultMsg("Failed to create RTP socket");
00677         break;
00678       }
00679       
00680       if (protocolIsRTP) {
00681         // Set our RTCP port to be the RTP port +1
00682         portNumBits const rtcpPortNum = fClientPortNum|1;
00683         if (isSSM()) {
00684           fRTCPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, rtcpPortNum);
00685         } else {
00686           fRTCPSocket = new Groupsock(env(), tempAddr, rtcpPortNum, 255);
00687         }
00688       }
00689     } else {
00690       // Port numbers were not specified in advance, so we use ephemeral port numbers.
00691       // Create sockets until we get a port-number pair (even: RTP; even+1: RTCP).
00692       // We need to make sure that we don't keep trying to use the same bad port numbers over and over again.
00693       // so we store bad sockets in a table, and delete them all when we're done.
00694       HashTable* socketHashTable = HashTable::create(ONE_WORD_HASH_KEYS);
00695       if (socketHashTable == NULL) break;
00696       Boolean success = False;
00697       NoReuse dummy(env()); // ensures that our new ephemeral port number won't be one that's already in use
00698 
00699       while (1) {
00700         // Create a new socket:
00701         if (isSSM()) {
00702           fRTPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, 0);
00703         } else {
00704           fRTPSocket = new Groupsock(env(), tempAddr, 0, 255);
00705         }
00706         if (fRTPSocket == NULL) {
00707           env().setResultMsg("MediaSession::initiate(): unable to create RTP and RTCP sockets");
00708           break;
00709         }
00710 
00711         // Get the client port number, and check whether it's even (for RTP):
00712         Port clientPort(0);
00713         if (!getSourcePort(env(), fRTPSocket->socketNum(), clientPort)) {
00714           break;
00715         }
00716         fClientPortNum = ntohs(clientPort.num()); 
00717         if ((fClientPortNum&1) != 0) { // it's odd
00718           // Record this socket in our table, and keep trying:
00719           unsigned key = (unsigned)fClientPortNum;
00720           Groupsock* existing = (Groupsock*)socketHashTable->Add((char const*)key, fRTPSocket);
00721           delete existing; // in case it wasn't NULL
00722           continue;
00723         }
00724 
00725         // Make sure we can use the next (i.e., odd) port number, for RTCP:
00726         portNumBits rtcpPortNum = fClientPortNum|1;
00727         if (isSSM()) {
00728           fRTCPSocket = new Groupsock(env(), tempAddr, fSourceFilterAddr, rtcpPortNum);
00729         } else {
00730           fRTCPSocket = new Groupsock(env(), tempAddr, rtcpPortNum, 255);
00731         }
00732         if (fRTCPSocket != NULL && fRTCPSocket->socketNum() >= 0) {
00733           // Success! Use these two sockets.
00734           success = True;
00735           break;
00736         } else {
00737           // We couldn't create the RTCP socket (perhaps that port number's already in use elsewhere?).
00738           delete fRTCPSocket;
00739 
00740           // Record the first socket in our table, and keep trying:
00741           unsigned key = (unsigned)fClientPortNum;
00742           Groupsock* existing = (Groupsock*)socketHashTable->Add((char const*)key, fRTPSocket);
00743           delete existing; // in case it wasn't NULL
00744           continue;
00745         }
00746       }
00747 
00748       // Clean up the socket hash table (and contents):
00749       Groupsock* oldGS;
00750       while ((oldGS = (Groupsock*)socketHashTable->RemoveNext()) != NULL) {
00751         delete oldGS;
00752       }
00753       delete socketHashTable;
00754 
00755       if (!success) break; // a fatal error occurred trying to create the RTP and RTCP sockets; we can't continue
00756     }
00757 
00758     // Try to use a big receive buffer for RTP - at least 0.1 second of
00759     // specified bandwidth and at least 50 KB
00760     unsigned rtpBufSize = fBandwidth * 25 / 2; // 1 kbps * 0.1 s = 12.5 bytes
00761     if (rtpBufSize < 50 * 1024)
00762       rtpBufSize = 50 * 1024;
00763     increaseReceiveBufferTo(env(), fRTPSocket->socketNum(), rtpBufSize);
00764 
00765     if (isSSM() && fRTCPSocket != NULL) {
00766       // Special case for RTCP SSM: Send RTCP packets back to the source via unicast:
00767       fRTCPSocket->changeDestinationParameters(fSourceFilterAddr,0,~0);
00768     }
00769 
00770     // Create "fRTPSource" and "fReadSource":
00771     if (!createSourceObjects(useSpecialRTPoffset)) break;
00772 
00773     if (fReadSource == NULL) {
00774       env().setResultMsg("Failed to create read source");
00775       break;
00776     }
00777 
00778     // Finally, create our RTCP instance. (It starts running automatically)
00779     if (fRTPSource != NULL && fRTCPSocket != NULL) {
00780       // If bandwidth is specified, use it and add 5% for RTCP overhead.
00781       // Otherwise make a guess at 500 kbps.
00782       unsigned totSessionBandwidth
00783         = fBandwidth ? fBandwidth + fBandwidth / 20 : 500;
00784       fRTCPInstance = RTCPInstance::createNew(env(), fRTCPSocket,
00785                                               totSessionBandwidth,
00786                                               (unsigned char const*)
00787                                               fParent.CNAME(),
00788                                               NULL /* we're a client */,
00789                                               fRTPSource);
00790       if (fRTCPInstance == NULL) {
00791         env().setResultMsg("Failed to create RTCP instance");
00792         break;
00793       }
00794     }
00795 
00796     return True;
00797   } while (0);
00798 
00799   delete fRTPSocket; fRTPSocket = NULL;
00800   delete fRTCPSocket; fRTCPSocket = NULL;
00801   Medium::close(fRTCPInstance); fRTCPInstance = NULL;
00802   Medium::close(fReadSource); fReadSource = fRTPSource = NULL;
00803   fClientPortNum = 0;
00804   return False;
00805 }

void MediaSubsession::deInitiate (  ) 

Definition at line 807 of file MediaSession.cpp.

References Medium::close(), fReadSource, fRTCPInstance, fRTCPSocket, fRTPSocket, fRTPSource, and NULL.

Referenced by MediaSession::initiateByMediaType(), ProxyServerMediaSubsession::subsessionByeHandler(), and ~MediaSubsession().

00807                                  {
00808   Medium::close(fRTCPInstance);
00809   fRTCPInstance = NULL;
00810 
00811   Medium::close(fReadSource); // this is assumed to also close fRTPSource
00812   fReadSource = NULL; fRTPSource = NULL;
00813 
00814   delete fRTCPSocket; delete fRTPSocket;
00815   fRTCPSocket = fRTPSocket = NULL;
00816 }

Boolean MediaSubsession::setClientPortNum ( unsigned short  portNum  ) 

Definition at line 818 of file MediaSession.cpp.

References env(), False, fClientPortNum, fReadSource, NULL, UsageEnvironment::setResultMsg(), and True.

Referenced by continueAfterDESCRIBE().

00818                                                                 {
00819   if (fReadSource != NULL) {
00820     env().setResultMsg("A read source has already been created");
00821     return False;
00822   }
00823 
00824   fClientPortNum = portNum;
00825   return True;
00826 }

void MediaSubsession::receiveRawMP3ADUs (  )  [inline]

Definition at line 204 of file MediaSession.hh.

References fReceiveRawMP3ADUs, and True.

Referenced by ProxyServerMediaSubsession::createNewStreamSource().

00204 { fReceiveRawMP3ADUs = True; } // optional hack for audio/MPA-ROBUST; must not be called after Initiate()

void MediaSubsession::receiveRawJPEGFrames (  )  [inline]

Definition at line 205 of file MediaSession.hh.

References fReceiveRawJPEGFrames, and True.

Referenced by ProxyServerMediaSubsession::createNewStreamSource().

00205 { fReceiveRawJPEGFrames = True; } // optional hack for video/JPEG; must not be called after Initiate()

char*& MediaSubsession::connectionEndpointName (  )  [inline]

Definition at line 206 of file MediaSession.hh.

References fConnectionEndpointName.

Referenced by connectionEndpointAddress(), RTSPClient::handleSETUPResponse(), parseSDPLine_c(), and setupSubsession().

00206 { return fConnectionEndpointName; }

char const* MediaSubsession::connectionEndpointName (  )  const [inline]

Definition at line 207 of file MediaSession.hh.

References fConnectionEndpointName.

00207                                              {
00208     return fConnectionEndpointName;
00209   }

unsigned MediaSubsession::bandwidth (  )  const [inline]

Definition at line 212 of file MediaSession.hh.

References fBandwidth.

Referenced by ProxyServerMediaSubsession::createNewStreamSource().

00212 { return fBandwidth; }

unsigned MediaSubsession::fmtp_auxiliarydatasizelength (  )  const [inline]

Definition at line 215 of file MediaSession.hh.

References fAuxiliarydatasizelength.

00215 { return fAuxiliarydatasizelength; }

unsigned MediaSubsession::fmtp_constantduration (  )  const [inline]

Definition at line 216 of file MediaSession.hh.

References fConstantduration.

00216 { return fConstantduration; }

unsigned MediaSubsession::fmtp_constantsize (  )  const [inline]

Definition at line 217 of file MediaSession.hh.

References fConstantsize.

00217 { return fConstantsize; }

unsigned MediaSubsession::fmtp_crc (  )  const [inline]

Definition at line 218 of file MediaSession.hh.

References fCRC.

00218 { return fCRC; }

unsigned MediaSubsession::fmtp_ctsdeltalength (  )  const [inline]

Definition at line 219 of file MediaSession.hh.

References fCtsdeltalength.

00219 { return fCtsdeltalength; }

unsigned MediaSubsession::fmtp_de_interleavebuffersize (  )  const [inline]

Definition at line 220 of file MediaSession.hh.

References fDe_interleavebuffersize.

00220 { return fDe_interleavebuffersize; }

unsigned MediaSubsession::fmtp_dtsdeltalength (  )  const [inline]

Definition at line 221 of file MediaSession.hh.

References fDtsdeltalength.

00221 { return fDtsdeltalength; }

unsigned MediaSubsession::fmtp_indexdeltalength (  )  const [inline]

Definition at line 222 of file MediaSession.hh.

References fIndexdeltalength.

00222 { return fIndexdeltalength; }

unsigned MediaSubsession::fmtp_indexlength (  )  const [inline]

Definition at line 223 of file MediaSession.hh.

References fIndexlength.

Referenced by SubsessionIOState::useFrameForHinting().

00223 { return fIndexlength; }

unsigned MediaSubsession::fmtp_interleaving (  )  const [inline]

Definition at line 224 of file MediaSession.hh.

References fInterleaving.

00224 { return fInterleaving; }

unsigned MediaSubsession::fmtp_maxdisplacement (  )  const [inline]

Definition at line 225 of file MediaSession.hh.

References fMaxdisplacement.

00225 { return fMaxdisplacement; }

unsigned MediaSubsession::fmtp_objecttype (  )  const [inline]

Definition at line 226 of file MediaSession.hh.

References fObjecttype.

00226 { return fObjecttype; }

unsigned MediaSubsession::fmtp_octetalign (  )  const [inline]

Definition at line 227 of file MediaSession.hh.

References fOctetalign.

00227 { return fOctetalign; }

unsigned MediaSubsession::fmtp_profile_level_id (  )  const [inline]

Definition at line 228 of file MediaSession.hh.

References fProfile_level_id.

Referenced by ProxyServerMediaSubsession::createNewRTPSink().

00228 { return fProfile_level_id; }

unsigned MediaSubsession::fmtp_robustsorting (  )  const [inline]

Definition at line 229 of file MediaSession.hh.

References fRobustsorting.

00229 { return fRobustsorting; }

unsigned MediaSubsession::fmtp_sizelength (  )  const [inline]

Definition at line 230 of file MediaSession.hh.

References fSizelength.

Referenced by SubsessionIOState::useFrameForHinting().

00230 { return fSizelength; }

unsigned MediaSubsession::fmtp_streamstateindication (  )  const [inline]

Definition at line 231 of file MediaSession.hh.

References fStreamstateindication.

00231 { return fStreamstateindication; }

unsigned MediaSubsession::fmtp_streamtype (  )  const [inline]

Definition at line 232 of file MediaSession.hh.

References fStreamtype.

00232 { return fStreamtype; }

Boolean MediaSubsession::fmtp_cpresent (  )  const [inline]

Definition at line 233 of file MediaSession.hh.

References fCpresent.

00233 { return fCpresent; }

Boolean MediaSubsession::fmtp_randomaccessindication (  )  const [inline]

Definition at line 234 of file MediaSession.hh.

References fRandomaccessindication.

00234 { return fRandomaccessindication; }

char const* MediaSubsession::fmtp_config (  )  const [inline]

Definition at line 235 of file MediaSession.hh.

References fConfig.

Referenced by QuickTimeFileSink::addAtom_hdlr2(), ProxyServerMediaSubsession::createNewRTPSink(), fmtp_configuration(), SubsessionIOState::setQTstate(), and setupStreams().

00235 { return fConfig; }

char const* MediaSubsession::fmtp_configuration (  )  const [inline]

Definition at line 236 of file MediaSession.hh.

References fmtp_config().

00236 { return fmtp_config(); }

char const* MediaSubsession::fmtp_mode (  )  const [inline]

Definition at line 237 of file MediaSession.hh.

References fMode.

Referenced by ProxyServerMediaSubsession::createNewRTPSink().

00237 { return fMode; }

char const* MediaSubsession::fmtp_spropparametersets (  )  const [inline]

Definition at line 238 of file MediaSession.hh.

References fSpropParameterSets.

Referenced by QuickTimeFileSink::addAtom_hdlr2(), ProxyServerMediaSubsession::createNewRTPSink(), and setupStreams().

00238 { return fSpropParameterSets; }

char const* MediaSubsession::fmtp_emphasis (  )  const [inline]

Definition at line 239 of file MediaSession.hh.

References fEmphasis.

00239 { return fEmphasis; }

char const* MediaSubsession::fmtp_channelorder (  )  const [inline]

Definition at line 240 of file MediaSession.hh.

References fChannelOrder.

00240 { return fChannelOrder; }

netAddressBits MediaSubsession::connectionEndpointAddress (  )  const

Definition at line 828 of file MediaSession.cpp.

References MediaSession::connectionEndpointName(), connectionEndpointName(), NetAddress::data(), NetAddressList::firstAddress(), NULL, NetAddressList::numAddresses(), and parentSession().

Referenced by RTSPClient::handleSETUPResponse(), initiate(), RTSPClient::sendRequest(), setDestinations(), and setupSubsession().

00828                                                                 {
00829   do {
00830     // Get the endpoint name from with us, or our parent session:
00831     char const* endpointString = connectionEndpointName();
00832     if (endpointString == NULL) {
00833       endpointString = parentSession().connectionEndpointName();
00834     }
00835     if (endpointString == NULL) break;
00836 
00837     // Now, convert this name to an address, if we can:
00838     NetAddressList addresses(endpointString);
00839     if (addresses.numAddresses() == 0) break;
00840 
00841     return *(netAddressBits*)(addresses.firstAddress()->data());
00842   } while (0);
00843 
00844   // No address known:
00845   return 0;
00846 }

void MediaSubsession::setDestinations ( netAddressBits  defaultDestAddress  ) 

Definition at line 848 of file MediaSession.cpp.

References Groupsock::changeDestinationParameters(), connectionEndpointAddress(), fRTCPSocket, fRTPSocket, isSSM(), NULL, and serverPortNum.

Referenced by RTSPClient::handleSETUPResponse(), and setupSubsession().

00848                                                                        {
00849   // Get the destination address from the connection endpoint name
00850   // (This will be 0 if it's not known, in which case we use the default)
00851   netAddressBits destAddress = connectionEndpointAddress();
00852   if (destAddress == 0) destAddress = defaultDestAddress;
00853   struct in_addr destAddr; destAddr.s_addr = destAddress;
00854 
00855   // The destination TTL remains unchanged:
00856   int destTTL = ~0; // means: don't change
00857 
00858   if (fRTPSocket != NULL) {
00859     Port destPort(serverPortNum);
00860     fRTPSocket->changeDestinationParameters(destAddr, destPort, destTTL);
00861   }
00862   if (fRTCPSocket != NULL && !isSSM()) {
00863     // Note: For SSM sessions, the dest address for RTCP was already set.
00864     Port destPort(serverPortNum+1);
00865     fRTCPSocket->changeDestinationParameters(destAddr, destPort, destTTL);
00866   }
00867 }

char const* MediaSubsession::sessionId (  )  const [inline]

Definition at line 249 of file MediaSession.hh.

References fSessionId.

Referenced by RTSPClient::sendRequest().

00249 { return fSessionId; }

void MediaSubsession::setSessionId ( char const *  sessionId  ) 

Definition at line 869 of file MediaSession.cpp.

References fSessionId, and strDup().

Referenced by RTSPClient::handleSETUPResponse(), and setupSubsession().

00869                                                         {
00870   delete[] fSessionId;
00871   fSessionId = strDup(sessionId);
00872 }

double MediaSubsession::getNormalPlayTime ( struct timeval const &  presentationTime  ) 

Definition at line 874 of file MediaSession.cpp.

References RTPSource::curPacketRTPTimestamp(), False, fNPT_PTS_Offset, NULL, playStartTime(), rtpInfo, rtpSource(), scale(), and seqNumLT().

Referenced by DummySink::afterGettingFrame().

00874                                                                                 {
00875   if (rtpSource() == NULL || rtpSource()->timestampFrequency() == 0) return 0.0; // no RTP source, or bad freq!
00876 
00877   // First, check whether our "RTPSource" object has already been synchronized using RTCP.
00878   // If it hasn't, then - as a special case - we need to use the RTP timestamp to compute the NPT.
00879   if (!rtpSource()->hasBeenSynchronizedUsingRTCP()) {
00880     if (!rtpInfo.infoIsNew) return 0.0; // the "rtpInfo" structure has not been filled in
00881     u_int32_t timestampOffset = rtpSource()->curPacketRTPTimestamp() - rtpInfo.timestamp;
00882     double nptOffset = (timestampOffset/(double)(rtpSource()->timestampFrequency()))*scale();
00883     double npt = playStartTime() + nptOffset;
00884 
00885     return npt;
00886   } else {
00887     // Common case: We have been synchronized using RTCP.  This means that the "presentationTime" parameter
00888     // will be accurate, and so we should use this to compute the NPT.
00889     double ptsDouble = (double)(presentationTime.tv_sec + presentationTime.tv_usec/1000000.0);
00890 
00891     if (rtpInfo.infoIsNew) {
00892       // This is the first time we've been called with a synchronized presentation time since the "rtpInfo"
00893       // structure was last filled in.  Use this "presentationTime" to compute "fNPT_PTS_Offset":
00894       if (seqNumLT(rtpSource()->curPacketRTPSeqNum(), rtpInfo.seqNum)) return -0.1; // sanity check; ignore old packets
00895       u_int32_t timestampOffset = rtpSource()->curPacketRTPTimestamp() - rtpInfo.timestamp;
00896       double nptOffset = (timestampOffset/(double)(rtpSource()->timestampFrequency()))*scale();
00897       double npt = playStartTime() + nptOffset;
00898       fNPT_PTS_Offset = npt - ptsDouble*scale();
00899       rtpInfo.infoIsNew = False; // for next time
00900 
00901       return npt;
00902     } else {
00903       // Use the precomputed "fNPT_PTS_Offset" to compute the NPT from the PTS:
00904       if (fNPT_PTS_Offset == 0.0) return 0.0; // error: The "rtpInfo" structure was apparently never filled in
00905       return (double)(ptsDouble*scale() + fNPT_PTS_Offset);
00906     }
00907   }
00908 }

UsageEnvironment& MediaSubsession::env (  )  [inline, protected]

Definition at line 281 of file MediaSession.hh.

References Medium::envir(), and fParent.

Referenced by createSourceObjects(), initiate(), and setClientPortNum().

00281 { return fParent.envir(); }

void MediaSubsession::setNext ( MediaSubsession next  )  [inline, protected]

Definition at line 282 of file MediaSession.hh.

References fNext, and MediaSubsessionIterator::next().

Referenced by MediaSession::initializeWithSDP().

00282 { fNext = next; }

Boolean MediaSubsession::parseSDPLine_c ( char const *  sdpLine  )  [protected]

Definition at line 910 of file MediaSession.cpp.

References connectionEndpointName(), False, fConnectionEndpointName, NULL, parseCLine(), and True.

Referenced by MediaSession::initializeWithSDP().

00910                                                            {
00911   // Check for "c=IN IP4 <connection-endpoint>"
00912   // or "c=IN IP4 <connection-endpoint>/<ttl+numAddresses>"
00913   // (Later, do something with <ttl+numAddresses> also #####)
00914   char* connectionEndpointName = parseCLine(sdpLine);
00915   if (connectionEndpointName != NULL) {
00916     delete[] fConnectionEndpointName;
00917     fConnectionEndpointName = connectionEndpointName;
00918     return True;
00919   }
00920 
00921   return False;
00922 }

Boolean MediaSubsession::parseSDPLine_b ( char const *  sdpLine  )  [protected]

Definition at line 924 of file MediaSession.cpp.

References fBandwidth.

Referenced by MediaSession::initializeWithSDP().

00924                                                            {
00925   // Check for "b=<bwtype>:<bandwidth>" line
00926   // RTP applications are expected to use bwtype="AS"
00927   return sscanf(sdpLine, "b=AS:%u", &fBandwidth) == 1;
00928 }

Boolean MediaSubsession::parseSDPAttribute_rtpmap ( char const *  sdpLine  )  [protected]

Definition at line 930 of file MediaSession.cpp.

References codecName(), False, fCodecName, fNumChannels, fRTPPayloadFormat, fRTPTimestampFrequency, numChannels(), rtpTimestampFrequency(), strDup(), strDupSize(), and True.

Referenced by MediaSession::initializeWithSDP().

00930                                                                      {
00931   // Check for a "a=rtpmap:<fmt> <codec>/<freq>" line:
00932   // (Also check without the "/<freq>"; RealNetworks omits this)
00933   // Also check for a trailing "/<numChannels>".
00934   Boolean parseSuccess = False;
00935 
00936   unsigned rtpmapPayloadFormat;
00937   char* codecName = strDupSize(sdpLine); // ensures we have enough space
00938   unsigned rtpTimestampFrequency = 0;
00939   unsigned numChannels = 1;
00940   if (sscanf(sdpLine, "a=rtpmap: %u %[^/]/%u/%u",
00941              &rtpmapPayloadFormat, codecName, &rtpTimestampFrequency,
00942              &numChannels) == 4
00943       || sscanf(sdpLine, "a=rtpmap: %u %[^/]/%u",
00944              &rtpmapPayloadFormat, codecName, &rtpTimestampFrequency) == 3
00945       || sscanf(sdpLine, "a=rtpmap: %u %s",
00946                 &rtpmapPayloadFormat, codecName) == 2) {
00947     parseSuccess = True;
00948     if (rtpmapPayloadFormat == fRTPPayloadFormat) {
00949       // This "rtpmap" matches our payload format, so set our
00950       // codec name and timestamp frequency:
00951       // (First, make sure the codec name is upper case)
00952       {
00953         Locale l("POSIX");
00954         for (char* p = codecName; *p != '\0'; ++p) *p = toupper(*p);
00955       }
00956       delete[] fCodecName; fCodecName = strDup(codecName);
00957       fRTPTimestampFrequency = rtpTimestampFrequency;
00958       fNumChannels = numChannels;
00959     }
00960   }
00961   delete[] codecName;
00962 
00963   return parseSuccess;
00964 }

Boolean MediaSubsession::parseSDPAttribute_control ( char const *  sdpLine  )  [protected]

Definition at line 966 of file MediaSession.cpp.

References controlPath(), False, fControlPath, strDup(), strDupSize(), and True.

Referenced by MediaSession::initializeWithSDP().

00966                                                                       {
00967   // Check for a "a=control:<control-path>" line:
00968   Boolean parseSuccess = False;
00969 
00970   char* controlPath = strDupSize(sdpLine); // ensures we have enough space
00971   if (sscanf(sdpLine, "a=control: %s", controlPath) == 1) {
00972     parseSuccess = True;
00973     delete[] fControlPath; fControlPath = strDup(controlPath);
00974   }
00975   delete[] controlPath;
00976 
00977   return parseSuccess;
00978 }

Boolean MediaSubsession::parseSDPAttribute_range ( char const *  sdpLine  )  [protected]

Definition at line 980 of file MediaSession.cpp.

References _absEndTime(), _absStartTime(), False, fParent, fPlayEndTime, fPlayStartTime, parseRangeAttribute(), MediaSession::playEndTime(), playEndTime(), MediaSession::playStartTime(), playStartTime(), and True.

Referenced by MediaSession::initializeWithSDP().

00980                                                                     {
00981   // Check for a "a=range:npt=<startTime>-<endTime>" line:
00982   // (Later handle other kinds of "a=range" attributes also???#####)
00983   Boolean parseSuccess = False;
00984 
00985   double playStartTime;
00986   double playEndTime;
00987   if (parseRangeAttribute(sdpLine, playStartTime, playEndTime)) {
00988     parseSuccess = True;
00989     if (playStartTime > fPlayStartTime) {
00990       fPlayStartTime = playStartTime;
00991       if (playStartTime > fParent.playStartTime()) {
00992         fParent.playStartTime() = playStartTime;
00993       }
00994     }
00995     if (playEndTime > fPlayEndTime) {
00996       fPlayEndTime = playEndTime;
00997       if (playEndTime > fParent.playEndTime()) {
00998         fParent.playEndTime() = playEndTime;
00999       }
01000     }
01001   } else if (parseRangeAttribute(sdpLine, _absStartTime(), _absEndTime())) {
01002     parseSuccess = True;
01003   }
01004 
01005   return parseSuccess;
01006 }

Boolean MediaSubsession::parseSDPAttribute_fmtp ( char const *  sdpLine  )  [protected]

Definition at line 1008 of file MediaSession.cpp.

References False, fAuxiliarydatasizelength, fChannelOrder, fConfig, fConstantduration, fConstantsize, fCpresent, fCRC, fCtsdeltalength, fDe_interleavebuffersize, fDtsdeltalength, fEmphasis, fIndexdeltalength, fIndexlength, fInterleaving, fMaxdisplacement, fMode, fObjecttype, fOctetalign, fProfile_level_id, fRandomaccessindication, fRobustsorting, fSizelength, fSpropParameterSets, fStreamstateindication, fStreamtype, strDup(), strDupSize(), and True.

Referenced by MediaSession::initializeWithSDP().

01008                                                                    {
01009   // Check for a "a=fmtp:" line:
01010   // TEMP: We check only for a handful of expected parameter names #####
01011   // Later: (i) check that payload format number matches; #####
01012   //        (ii) look for other parameters also (generalize?) #####
01013   do {
01014     if (strncmp(sdpLine, "a=fmtp:", 7) != 0) break; sdpLine += 7;
01015     while (isdigit(*sdpLine)) ++sdpLine;
01016 
01017     // The remaining "sdpLine" should be a sequence of
01018     //     <name>=<value>;
01019     // parameter assignments.  Look at each of these.
01020     // First, convert the line to lower-case, to ease comparison:
01021     char* const lineCopy = strDup(sdpLine); char* line = lineCopy;
01022     {
01023       Locale l("POSIX");
01024       for (char* c = line; *c != '\0'; ++c) *c = tolower(*c);
01025     }
01026     while (*line != '\0' && *line != '\r' && *line != '\n') {
01027       unsigned u;
01028       char* valueStr = strDupSize(line);
01029       if (sscanf(line, " auxiliarydatasizelength = %u", &u) == 1) {
01030         fAuxiliarydatasizelength = u;
01031       } else if (sscanf(line, " constantduration = %u", &u) == 1) {
01032         fConstantduration = u;
01033       } else if (sscanf(line, " constantsize; = %u", &u) == 1) {
01034         fConstantsize = u;
01035       } else if (sscanf(line, " crc = %u", &u) == 1) {
01036         fCRC = u;
01037       } else if (sscanf(line, " ctsdeltalength = %u", &u) == 1) {
01038         fCtsdeltalength = u;
01039       } else if (sscanf(line, " de-interleavebuffersize = %u", &u) == 1) {
01040         fDe_interleavebuffersize = u;
01041       } else if (sscanf(line, " dtsdeltalength = %u", &u) == 1) {
01042         fDtsdeltalength = u;
01043       } else if (sscanf(line, " indexdeltalength = %u", &u) == 1) {
01044         fIndexdeltalength = u;
01045       } else if (sscanf(line, " indexlength = %u", &u) == 1) {
01046         fIndexlength = u;
01047       } else if (sscanf(line, " interleaving = %u", &u) == 1) {
01048         fInterleaving = u;
01049       } else if (sscanf(line, " maxdisplacement = %u", &u) == 1) {
01050         fMaxdisplacement = u;
01051       } else if (sscanf(line, " objecttype = %u", &u) == 1) {
01052         fObjecttype = u;
01053       } else if (sscanf(line, " octet-align = %u", &u) == 1) {
01054         fOctetalign = u;
01055       } else if (sscanf(line, " profile-level-id = %x", &u) == 1) {
01056         // Note that the "profile-level-id" parameter is assumed to be hexadecimal
01057         fProfile_level_id = u;
01058       } else if (sscanf(line, " robust-sorting = %u", &u) == 1) {
01059         fRobustsorting = u;
01060       } else if (sscanf(line, " sizelength = %u", &u) == 1) {
01061         fSizelength = u;
01062       } else if (sscanf(line, " streamstateindication = %u", &u) == 1) {
01063         fStreamstateindication = u;
01064       } else if (sscanf(line, " streamtype = %u", &u) == 1) {
01065         fStreamtype = u;
01066       } else if (sscanf(line, " cpresent = %u", &u) == 1) {
01067         fCpresent = u != 0;
01068       } else if (sscanf(line, " randomaccessindication = %u", &u) == 1) {
01069         fRandomaccessindication = u != 0;
01070       } else if (sscanf(sdpLine, " config = %[^; \t\r\n]", valueStr) == 1 ||
01071                  sscanf(sdpLine, " configuration = %[^; \t\r\n]", valueStr) == 1) {
01072         // Note: We used "sdpLine" here, because the value may be case-sensitive (if it's Base-64).
01073         delete[] fConfig; fConfig = strDup(valueStr);
01074       } else if (sscanf(line, " mode = %[^; \t\r\n]", valueStr) == 1) {
01075         delete[] fMode; fMode = strDup(valueStr);
01076       } else if (sscanf(sdpLine, " sprop-parameter-sets = %[^; \t\r\n]", valueStr) == 1) {
01077         // Note: We used "sdpLine" here, because the value is case-sensitive.
01078         delete[] fSpropParameterSets; fSpropParameterSets = strDup(valueStr);
01079       } else if (sscanf(line, " emphasis = %[^; \t\r\n]", valueStr) == 1) {
01080         delete[] fEmphasis; fEmphasis = strDup(valueStr);
01081       } else if (sscanf(sdpLine, " channel-order = %[^; \t\r\n]", valueStr) == 1) {
01082         // Note: We used "sdpLine" here, because the value is case-sensitive.
01083         delete[] fChannelOrder; fChannelOrder = strDup(valueStr);
01084       } else {
01085         // Some of the above parameters are Boolean.  Check whether the parameter
01086         // names appear alone, without a "= 1" at the end:
01087         if (sscanf(line, " %[^; \t\r\n]", valueStr) == 1) {
01088           if (strcmp(valueStr, "octet-align") == 0) {
01089             fOctetalign = 1;
01090           } else if (strcmp(valueStr, "cpresent") == 0) {
01091             fCpresent = True;
01092           } else if (strcmp(valueStr, "crc") == 0) {
01093             fCRC = 1;
01094           } else if (strcmp(valueStr, "robust-sorting") == 0) {
01095             fRobustsorting = 1;
01096           } else if (strcmp(valueStr, "randomaccessindication") == 0) {
01097             fRandomaccessindication = True;
01098           }
01099         }
01100       }
01101       delete[] valueStr;
01102 
01103       // Move to the next parameter assignment string:
01104       while (*line != '\0' && *line != '\r' && *line != '\n'
01105              && *line != ';') ++line;
01106       while (*line == ';') ++line;
01107 
01108       // Do the same with sdpLine; needed for finding case sensitive values:
01109       while (*sdpLine != '\0' && *sdpLine != '\r' && *sdpLine != '\n'
01110              && *sdpLine != ';') ++sdpLine;
01111       while (*sdpLine == ';') ++sdpLine;
01112     }
01113     delete[] lineCopy;
01114     return True;
01115   } while (0);
01116 
01117   return False;
01118 }

Boolean MediaSubsession::parseSDPAttribute_source_filter ( char const *  sdpLine  )  [protected]

Definition at line 1121 of file MediaSession.cpp.

References fSourceFilterAddr, and parseSourceFilterAttribute().

Referenced by MediaSession::initializeWithSDP().

01121                                                      {
01122   return parseSourceFilterAttribute(sdpLine, fSourceFilterAddr);
01123 }

Boolean MediaSubsession::parseSDPAttribute_x_dimensions ( char const *  sdpLine  )  [protected]

Definition at line 1125 of file MediaSession.cpp.

References False, fVideoHeight, fVideoWidth, and True.

Referenced by MediaSession::initializeWithSDP().

01125                                                                            {
01126   // Check for a "a=x-dimensions:<width>,<height>" line:
01127   Boolean parseSuccess = False;
01128 
01129   int width, height;
01130   if (sscanf(sdpLine, "a=x-dimensions:%d,%d", &width, &height) == 2) {
01131     parseSuccess = True;
01132     fVideoWidth = (unsigned short)width;
01133     fVideoHeight = (unsigned short)height;
01134   }
01135 
01136   return parseSuccess;
01137 }

Boolean MediaSubsession::parseSDPAttribute_framerate ( char const *  sdpLine  )  [protected]

Definition at line 1139 of file MediaSession.cpp.

References False, fVideoFPS, and True.

Referenced by MediaSession::initializeWithSDP().

01139                                                                         {
01140   // Check for a "a=framerate: <fps>" or "a=x-framerate: <fps>" line:
01141   Boolean parseSuccess = False;
01142 
01143   float frate;
01144   int rate;
01145   if (sscanf(sdpLine, "a=framerate: %f", &frate) == 1 || sscanf(sdpLine, "a=framerate:%f", &frate) == 1) {
01146     parseSuccess = True;
01147     fVideoFPS = (unsigned)frate;
01148   } else if (sscanf(sdpLine, "a=x-framerate: %d", &rate) == 1) {
01149     parseSuccess = True;
01150     fVideoFPS = (unsigned)rate;
01151   }
01152 
01153   return parseSuccess;
01154 }

Boolean MediaSubsession::createSourceObjects ( int  useSpecialRTPoffset  )  [protected, virtual]

Definition at line 1156 of file MediaSession.cpp.

References codecName(), QuickTimeGenericRTPSource::createNew(), JPEGVideoRTPSource::createNew(), DVVideoRTPSource::createNew(), H264VideoRTPSource::createNew(), H263plusVideoRTPSource::createNew(), H261VideoRTPSource::createNew(), MPEG1or2VideoRTPSource::createNew(), MPEG4GenericRTPSource::createNew(), MPEG4ESVideoRTPSource::createNew(), AC3AudioRTPSource::createNew(), VP8VideoRTPSource::createNew(), VorbisAudioRTPSource::createNew(), MPEG4LATMAudioRTPSource::createNew(), SimpleRTPSource::createNew(), MP3FromADUSource::createNew(), MP3ADUdeinterleaver::createNew(), MP3ADURTPSource::createNew(), MPEG1or2AudioRTPSource::createNew(), AMRAudioRTPSource::createNew(), QCELPAudioRTPSource::createNew(), MPEG2TransportStreamFramer::createNew(), BasicUDPSource::createNew(), env(), False, fCodecName, fCRC, fIndexdeltalength, fIndexlength, fInterleaving, fMediumName, fMode, fNumChannels, fOctetalign, fProtocolName, fReadSource, fReceiveRawJPEGFrames, fReceiveRawMP3ADUs, fRobustsorting, fRTPPayloadFormat, fRTPSocket, fRTPSource, fRTPTimestampFrequency, fSizelength, mediumName(), NULL, UsageEnvironment::setResultMsg(), True, videoHeight(), and videoWidth().

Referenced by initiate().

01156                                                                     {
01157   do {
01158     // First, check "fProtocolName"
01159     if (strcmp(fProtocolName, "UDP") == 0) {
01160       // A UDP-packetized stream (*not* a RTP stream)
01161       fReadSource = BasicUDPSource::createNew(env(), fRTPSocket);
01162       fRTPSource = NULL; // Note!
01163       
01164       if (strcmp(fCodecName, "MP2T") == 0) { // MPEG-2 Transport Stream
01165         fReadSource = MPEG2TransportStreamFramer::createNew(env(), fReadSource);
01166         // this sets "durationInMicroseconds" correctly, based on the PCR values
01167       }
01168     } else {
01169       // Check "fCodecName" against the set of codecs that we support,
01170       // and create our RTP source accordingly
01171       // (Later make this code more efficient, as this set grows #####)
01172       // (Also, add more fmts that can be implemented by SimpleRTPSource#####)
01173       Boolean createSimpleRTPSource = False; // by default; can be changed below
01174       Boolean doNormalMBitRule = False; // default behavior if "createSimpleRTPSource" is True
01175       if (strcmp(fCodecName, "QCELP") == 0) { // QCELP audio
01176         fReadSource =
01177           QCELPAudioRTPSource::createNew(env(), fRTPSocket, fRTPSource,
01178                                          fRTPPayloadFormat,
01179                                          fRTPTimestampFrequency);
01180         // Note that fReadSource will differ from fRTPSource in this case
01181       } else if (strcmp(fCodecName, "AMR") == 0) { // AMR audio (narrowband)
01182         fReadSource =
01183           AMRAudioRTPSource::createNew(env(), fRTPSocket, fRTPSource,
01184                                        fRTPPayloadFormat, False /*isWideband*/,
01185                                        fNumChannels, fOctetalign != 0, fInterleaving,
01186                                        fRobustsorting != 0, fCRC != 0);
01187         // Note that fReadSource will differ from fRTPSource in this case
01188       } else if (strcmp(fCodecName, "AMR-WB") == 0) { // AMR audio (wideband)
01189         fReadSource =
01190           AMRAudioRTPSource::createNew(env(), fRTPSocket, fRTPSource,
01191                                        fRTPPayloadFormat, True /*isWideband*/,
01192                                        fNumChannels, fOctetalign != 0, fInterleaving,
01193                                        fRobustsorting != 0, fCRC != 0);
01194         // Note that fReadSource will differ from fRTPSource in this case
01195       } else if (strcmp(fCodecName, "MPA") == 0) { // MPEG-1 or 2 audio
01196         fReadSource = fRTPSource
01197           = MPEG1or2AudioRTPSource::createNew(env(), fRTPSocket,
01198                                               fRTPPayloadFormat,
01199                                               fRTPTimestampFrequency);
01200       } else if (strcmp(fCodecName, "MPA-ROBUST") == 0) { // robust MP3 audio
01201         fReadSource = fRTPSource
01202           = MP3ADURTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat,
01203                                        fRTPTimestampFrequency);
01204         if (fRTPSource == NULL) break;
01205         
01206         if (!fReceiveRawMP3ADUs) {
01207           // Add a filter that deinterleaves the ADUs after depacketizing them:
01208           MP3ADUdeinterleaver* deinterleaver
01209             = MP3ADUdeinterleaver::createNew(env(), fRTPSource);
01210           if (deinterleaver == NULL) break;
01211         
01212           // Add another filter that converts these ADUs to MP3 frames:
01213           fReadSource = MP3FromADUSource::createNew(env(), deinterleaver);
01214         }
01215       } else if (strcmp(fCodecName, "X-MP3-DRAFT-00") == 0) {
01216         // a non-standard variant of "MPA-ROBUST" used by RealNetworks
01217         // (one 'ADU'ized MP3 frame per packet; no headers)
01218         fRTPSource
01219           = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat,
01220                                        fRTPTimestampFrequency,
01221                                        "audio/MPA-ROBUST" /*hack*/);
01222         if (fRTPSource == NULL) break;
01223         
01224         // Add a filter that converts these ADUs to MP3 frames:
01225         fReadSource = MP3FromADUSource::createNew(env(), fRTPSource,
01226                                                   False /*no ADU header*/);
01227       } else if (strcmp(fCodecName, "MP4A-LATM") == 0) { // MPEG-4 LATM audio
01228         fReadSource = fRTPSource
01229           = MPEG4LATMAudioRTPSource::createNew(env(), fRTPSocket,
01230                                                fRTPPayloadFormat,
01231                                                fRTPTimestampFrequency);
01232       } else if (strcmp(fCodecName, "VORBIS") == 0) { // Vorbis audio
01233         fReadSource = fRTPSource
01234           = VorbisAudioRTPSource::createNew(env(), fRTPSocket,
01235                                             fRTPPayloadFormat,
01236                                             fRTPTimestampFrequency);
01237       } else if (strcmp(fCodecName, "VP8") == 0) { // VP8 video
01238         fReadSource = fRTPSource
01239           = VP8VideoRTPSource::createNew(env(), fRTPSocket,
01240                                          fRTPPayloadFormat,
01241                                          fRTPTimestampFrequency);
01242       } else if (strcmp(fCodecName, "AC3") == 0 || strcmp(fCodecName, "EAC3") == 0) { // AC3 audio
01243         fReadSource = fRTPSource
01244           = AC3AudioRTPSource::createNew(env(), fRTPSocket,
01245                                          fRTPPayloadFormat,
01246                                          fRTPTimestampFrequency);
01247       } else if (strcmp(fCodecName, "MP4V-ES") == 0) { // MPEG-4 Elementary Stream video
01248         fReadSource = fRTPSource
01249           = MPEG4ESVideoRTPSource::createNew(env(), fRTPSocket,
01250                                              fRTPPayloadFormat,
01251                                              fRTPTimestampFrequency);
01252       } else if (strcmp(fCodecName, "MPEG4-GENERIC") == 0) {
01253         fReadSource = fRTPSource
01254           = MPEG4GenericRTPSource::createNew(env(), fRTPSocket,
01255                                              fRTPPayloadFormat,
01256                                              fRTPTimestampFrequency,
01257                                              fMediumName, fMode,
01258                                              fSizelength, fIndexlength,
01259                                              fIndexdeltalength);
01260       } else if (strcmp(fCodecName, "MPV") == 0) { // MPEG-1 or 2 video
01261         fReadSource = fRTPSource
01262           = MPEG1or2VideoRTPSource::createNew(env(), fRTPSocket,
01263                                               fRTPPayloadFormat,
01264                                               fRTPTimestampFrequency);
01265       } else if (strcmp(fCodecName, "MP2T") == 0) { // MPEG-2 Transport Stream
01266         fRTPSource = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat,
01267                                                 fRTPTimestampFrequency, "video/MP2T",
01268                                                 0, False);
01269         fReadSource = MPEG2TransportStreamFramer::createNew(env(), fRTPSource);
01270         // this sets "durationInMicroseconds" correctly, based on the PCR values
01271       } else if (strcmp(fCodecName, "H261") == 0) { // H.261
01272         fReadSource = fRTPSource
01273           = H261VideoRTPSource::createNew(env(), fRTPSocket,
01274                                           fRTPPayloadFormat,
01275                                           fRTPTimestampFrequency);
01276       } else if (strcmp(fCodecName, "H263-1998") == 0 ||
01277                  strcmp(fCodecName, "H263-2000") == 0) { // H.263+
01278         fReadSource = fRTPSource
01279           = H263plusVideoRTPSource::createNew(env(), fRTPSocket,
01280                                               fRTPPayloadFormat,
01281                                               fRTPTimestampFrequency);
01282       } else if (strcmp(fCodecName, "H264") == 0) {
01283         fReadSource = fRTPSource
01284           = H264VideoRTPSource::createNew(env(), fRTPSocket,
01285                                           fRTPPayloadFormat,
01286                                           fRTPTimestampFrequency);
01287       } else if (strcmp(fCodecName, "DV") == 0) {
01288         fReadSource = fRTPSource
01289           = DVVideoRTPSource::createNew(env(), fRTPSocket,
01290                                         fRTPPayloadFormat,
01291                                         fRTPTimestampFrequency);
01292       } else if (strcmp(fCodecName, "JPEG") == 0) { // motion JPEG
01293         if (fReceiveRawJPEGFrames) {
01294           // Special case (used when proxying JPEG/RTP streams): Receive each JPEG/RTP packet, including the special RTP headers:
01295           fReadSource = fRTPSource
01296             = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat,
01297                                          fRTPTimestampFrequency, "video/JPEG",
01298                                          0/*special offset*/, False/*doNormalMBitRule => ignore the 'M' bit*/);
01299         } else {
01300           // Normal case: Receive each JPEG frame as a complete, displayable JPEG image:
01301           fReadSource = fRTPSource
01302             = JPEGVideoRTPSource::createNew(env(), fRTPSocket,
01303                                             fRTPPayloadFormat,
01304                                             fRTPTimestampFrequency,
01305                                             videoWidth(),
01306                                             videoHeight());
01307         }
01308       } else if (strcmp(fCodecName, "X-QT") == 0
01309                  || strcmp(fCodecName, "X-QUICKTIME") == 0) {
01310         // Generic QuickTime streams, as defined in
01311         // <http://developer.apple.com/quicktime/icefloe/dispatch026.html>
01312         char* mimeType
01313           = new char[strlen(mediumName()) + strlen(codecName()) + 2] ;
01314         sprintf(mimeType, "%s/%s", mediumName(), codecName());
01315         fReadSource = fRTPSource
01316           = QuickTimeGenericRTPSource::createNew(env(), fRTPSocket,
01317                                                  fRTPPayloadFormat,
01318                                                  fRTPTimestampFrequency,
01319                                                  mimeType);
01320         delete[] mimeType;
01321       } else if (  strcmp(fCodecName, "PCMU") == 0 // PCM u-law audio
01322                    || strcmp(fCodecName, "GSM") == 0 // GSM audio
01323                    || strcmp(fCodecName, "DVI4") == 0 // DVI4 (IMA ADPCM) audio
01324                    || strcmp(fCodecName, "PCMA") == 0 // PCM a-law audio
01325                    || strcmp(fCodecName, "MP1S") == 0 // MPEG-1 System Stream
01326                    || strcmp(fCodecName, "MP2P") == 0 // MPEG-2 Program Stream
01327                    || strcmp(fCodecName, "L8") == 0 // 8-bit linear audio
01328                    || strcmp(fCodecName, "L16") == 0 // 16-bit linear audio
01329                    || strcmp(fCodecName, "L20") == 0 // 20-bit linear audio (RFC 3190)
01330                    || strcmp(fCodecName, "L24") == 0 // 24-bit linear audio (RFC 3190)
01331                    || strcmp(fCodecName, "G726-16") == 0 // G.726, 16 kbps
01332                    || strcmp(fCodecName, "G726-24") == 0 // G.726, 24 kbps
01333                    || strcmp(fCodecName, "G726-32") == 0 // G.726, 32 kbps
01334                    || strcmp(fCodecName, "G726-40") == 0 // G.726, 40 kbps
01335                    || strcmp(fCodecName, "SPEEX") == 0 // SPEEX audio
01336                    || strcmp(fCodecName, "ILBC") == 0 // iLBC audio
01337                    || strcmp(fCodecName, "OPUS") == 0 // Opus audio
01338                    || strcmp(fCodecName, "T140") == 0 // T.140 text (RFC 4103)
01339                    || strcmp(fCodecName, "DAT12") == 0 // 12-bit nonlinear audio (RFC 3190)
01340                    || strcmp(fCodecName, "VND.ONVIF.METADATA") == 0 // 'ONVIF' 'metadata' (a XML document)
01341                    ) {
01342         createSimpleRTPSource = True;
01343         useSpecialRTPoffset = 0;
01344         if (strcmp(fCodecName, "VND.ONVIF.METADATA") == 0) {
01345           // This RTP payload format uses the RTP "M" bit to indicate the end of the content (a XML document):
01346           doNormalMBitRule = True;
01347         }
01348       } else if (useSpecialRTPoffset >= 0) {
01349         // We don't know this RTP payload format, but try to receive
01350         // it using a 'SimpleRTPSource' with the specified header offset:
01351         createSimpleRTPSource = True;
01352       } else {
01353         env().setResultMsg("RTP payload format unknown or not supported");
01354         break;
01355       }
01356       
01357       if (createSimpleRTPSource) {
01358         char* mimeType
01359           = new char[strlen(mediumName()) + strlen(codecName()) + 2] ;
01360         sprintf(mimeType, "%s/%s", mediumName(), codecName());
01361         fReadSource = fRTPSource
01362           = SimpleRTPSource::createNew(env(), fRTPSocket, fRTPPayloadFormat,
01363                                        fRTPTimestampFrequency, mimeType,
01364                                        (unsigned)useSpecialRTPoffset,
01365                                        doNormalMBitRule);
01366         delete[] mimeType;
01367       }
01368     }
01369 
01370     return True;
01371   } while (0);
01372 
01373   return False; // an error occurred
01374 }


Friends And Related Function Documentation

friend class MediaSession [friend]

Definition at line 276 of file MediaSession.hh.

friend class MediaSubsessionIterator [friend]

Definition at line 277 of file MediaSession.hh.


Field Documentation

unsigned short MediaSubsession::serverPortNum

Definition at line 254 of file MediaSession.hh.

Referenced by RTSPClient::handleSETUPResponse(), MediaSession::initializeWithSDP(), setDestinations(), and setupSubsession().

unsigned char MediaSubsession::rtpChannelId

Definition at line 255 of file MediaSession.hh.

Referenced by RTSPClient::handleSETUPResponse(), and setupSubsession().

unsigned char MediaSubsession::rtcpChannelId

Definition at line 255 of file MediaSession.hh.

Referenced by RTSPClient::handleSETUPResponse(), and setupSubsession().

MediaSink* MediaSubsession::sink

Definition at line 256 of file MediaSession.hh.

Referenced by closeMediaSinks(), setupStreams(), shutdownStream(), and subsessionAfterPlaying().

void* MediaSubsession::miscPtr

Definition at line 257 of file MediaSession.hh.

Referenced by AVIFileSink::AVIFileSink(), QuickTimeFileSink::completeOutputFile(), AVIFileSink::completeOutputFile(), QuickTimeFileSink::continuePlaying(), AVIFileSink::continuePlaying(), QuickTimeFileSink::onSourceClosure1(), AVIFileSink::onSourceClosure1(), QuickTimeFileSink::QuickTimeFileSink(), while(), AVIFileSink::~AVIFileSink(), and QuickTimeFileSink::~QuickTimeFileSink().

u_int16_t MediaSubsession::seqNum

Definition at line 261 of file MediaSession.hh.

Referenced by RTSPClient::handlePLAYResponse().

u_int32_t MediaSubsession::timestamp

Definition at line 262 of file MediaSession.hh.

Referenced by RTSPClient::handlePLAYResponse().

Boolean MediaSubsession::infoIsNew

Definition at line 263 of file MediaSession.hh.

Referenced by RTSPClient::handlePLAYResponse().

struct { ... } MediaSubsession::rtpInfo

Referenced by getNormalPlayTime(), RTSPClient::handlePLAYResponse(), and MediaSubsession().

MediaSession& MediaSubsession::fParent [protected]

Definition at line 299 of file MediaSession.hh.

Referenced by absEndTime(), absStartTime(), env(), initiate(), parentSession(), parseSDPAttribute_range(), playEndTime(), and playStartTime().

MediaSubsession* MediaSubsession::fNext [protected]

Definition at line 300 of file MediaSession.hh.

Referenced by ServerMediaSession::duration(), ServerMediaSession::generateSDPDescription(), MediaSubsessionIterator::next(), setNext(), ServerMediaSession::testScaleFactor(), and ~MediaSubsession().

char* MediaSubsession::fConnectionEndpointName [protected]

Definition at line 303 of file MediaSession.hh.

Referenced by connectionEndpointName(), parseSDPLine_c(), and ~MediaSubsession().

unsigned short MediaSubsession::fClientPortNum [protected]

Definition at line 304 of file MediaSession.hh.

Referenced by clientPortNum(), MediaSession::initializeWithSDP(), initiate(), and setClientPortNum().

unsigned char MediaSubsession::fRTPPayloadFormat [protected]

Definition at line 306 of file MediaSession.hh.

Referenced by createSourceObjects(), MediaSession::initializeWithSDP(), parseSDPAttribute_rtpmap(), and rtpPayloadFormat().

char* MediaSubsession::fSavedSDPLines [protected]

Definition at line 307 of file MediaSession.hh.

Referenced by MediaSession::initializeWithSDP(), savedSDPLines(), and ~MediaSubsession().

char* MediaSubsession::fMediumName [protected]

Definition at line 308 of file MediaSession.hh.

Referenced by createSourceObjects(), MediaSession::initializeWithSDP(), mediumName(), and ~MediaSubsession().

char* MediaSubsession::fCodecName [protected]

Definition at line 309 of file MediaSession.hh.

Referenced by codecName(), createSourceObjects(), MediaSession::initializeWithSDP(), initiate(), parseSDPAttribute_rtpmap(), and ~MediaSubsession().

char* MediaSubsession::fProtocolName [protected]

Definition at line 310 of file MediaSession.hh.

Referenced by createSourceObjects(), MediaSession::initializeWithSDP(), initiate(), protocolName(), and ~MediaSubsession().

unsigned MediaSubsession::fRTPTimestampFrequency [protected]

Definition at line 311 of file MediaSession.hh.

Referenced by createSourceObjects(), MediaSession::initializeWithSDP(), parseSDPAttribute_rtpmap(), and rtpTimestampFrequency().

char* MediaSubsession::fControlPath [protected]

Definition at line 312 of file MediaSession.hh.

Referenced by controlPath(), parseSDPAttribute_control(), and ~MediaSubsession().

struct in_addr MediaSubsession::fSourceFilterAddr [read, protected]

Definition at line 313 of file MediaSession.hh.

Referenced by initiate(), isSSM(), and parseSDPAttribute_source_filter().

unsigned MediaSubsession::fBandwidth [protected]

Definition at line 314 of file MediaSession.hh.

Referenced by bandwidth(), initiate(), and parseSDPLine_b().

unsigned MediaSubsession::fAuxiliarydatasizelength [protected]

Definition at line 317 of file MediaSession.hh.

Referenced by fmtp_auxiliarydatasizelength(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fConstantduration [protected]

Definition at line 317 of file MediaSession.hh.

Referenced by fmtp_constantduration(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fConstantsize [protected]

Definition at line 317 of file MediaSession.hh.

Referenced by fmtp_constantsize(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fCRC [protected]

Definition at line 318 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_crc(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fCtsdeltalength [protected]

Definition at line 318 of file MediaSession.hh.

Referenced by fmtp_ctsdeltalength(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fDe_interleavebuffersize [protected]

Definition at line 318 of file MediaSession.hh.

Referenced by fmtp_de_interleavebuffersize(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fDtsdeltalength [protected]

Definition at line 318 of file MediaSession.hh.

Referenced by fmtp_dtsdeltalength(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fIndexdeltalength [protected]

Definition at line 319 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_indexdeltalength(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fIndexlength [protected]

Definition at line 319 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_indexlength(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fInterleaving [protected]

Definition at line 319 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_interleaving(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fMaxdisplacement [protected]

Definition at line 320 of file MediaSession.hh.

Referenced by fmtp_maxdisplacement(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fObjecttype [protected]

Definition at line 320 of file MediaSession.hh.

Referenced by fmtp_objecttype(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fOctetalign [protected]

Definition at line 321 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_octetalign(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fProfile_level_id [protected]

Definition at line 321 of file MediaSession.hh.

Referenced by fmtp_profile_level_id(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fRobustsorting [protected]

Definition at line 321 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_robustsorting(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fSizelength [protected]

Definition at line 322 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_sizelength(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fStreamstateindication [protected]

Definition at line 322 of file MediaSession.hh.

Referenced by fmtp_streamstateindication(), and parseSDPAttribute_fmtp().

unsigned MediaSubsession::fStreamtype [protected]

Definition at line 322 of file MediaSession.hh.

Referenced by fmtp_streamtype(), and parseSDPAttribute_fmtp().

Boolean MediaSubsession::fCpresent [protected]

Definition at line 323 of file MediaSession.hh.

Referenced by fmtp_cpresent(), and parseSDPAttribute_fmtp().

Boolean MediaSubsession::fRandomaccessindication [protected]

Definition at line 323 of file MediaSession.hh.

Referenced by fmtp_randomaccessindication(), and parseSDPAttribute_fmtp().

char* MediaSubsession::fConfig [protected]

Definition at line 324 of file MediaSession.hh.

Referenced by fmtp_config(), parseSDPAttribute_fmtp(), and ~MediaSubsession().

char * MediaSubsession::fMode [protected]

Definition at line 324 of file MediaSession.hh.

Referenced by createSourceObjects(), fmtp_mode(), parseSDPAttribute_fmtp(), and ~MediaSubsession().

char * MediaSubsession::fSpropParameterSets [protected]

Definition at line 324 of file MediaSession.hh.

Referenced by fmtp_spropparametersets(), parseSDPAttribute_fmtp(), and ~MediaSubsession().

char * MediaSubsession::fEmphasis [protected]

Definition at line 324 of file MediaSession.hh.

Referenced by fmtp_emphasis(), parseSDPAttribute_fmtp(), and ~MediaSubsession().

char * MediaSubsession::fChannelOrder [protected]

Definition at line 324 of file MediaSession.hh.

Referenced by fmtp_channelorder(), parseSDPAttribute_fmtp(), and ~MediaSubsession().

double MediaSubsession::fPlayStartTime [protected]

Definition at line 326 of file MediaSession.hh.

Referenced by _playStartTime(), parseSDPAttribute_range(), and playStartTime().

double MediaSubsession::fPlayEndTime [protected]

Definition at line 327 of file MediaSession.hh.

Referenced by _playEndTime(), parseSDPAttribute_range(), and playEndTime().

char* MediaSubsession::fAbsStartTime [protected]

Definition at line 328 of file MediaSession.hh.

Referenced by _absStartTime(), absStartTime(), and ~MediaSubsession().

char* MediaSubsession::fAbsEndTime [protected]

Definition at line 329 of file MediaSession.hh.

Referenced by _absEndTime(), absEndTime(), and ~MediaSubsession().

unsigned short MediaSubsession::fVideoWidth [protected]

Definition at line 330 of file MediaSession.hh.

Referenced by parseSDPAttribute_x_dimensions(), and videoWidth().

unsigned short MediaSubsession::fVideoHeight [protected]

Definition at line 330 of file MediaSession.hh.

Referenced by parseSDPAttribute_x_dimensions(), and videoHeight().

unsigned MediaSubsession::fVideoFPS [protected]

Definition at line 332 of file MediaSession.hh.

Referenced by parseSDPAttribute_framerate(), and videoFPS().

unsigned MediaSubsession::fNumChannels [protected]

Definition at line 334 of file MediaSession.hh.

Referenced by createSourceObjects(), MediaSession::initializeWithSDP(), numChannels(), and parseSDPAttribute_rtpmap().

float MediaSubsession::fScale [protected]

Definition at line 336 of file MediaSession.hh.

Referenced by scale().

double MediaSubsession::fNPT_PTS_Offset [protected]

Definition at line 337 of file MediaSession.hh.

Referenced by getNormalPlayTime().

Groupsock* MediaSubsession::fRTPSocket [protected]

Definition at line 340 of file MediaSession.hh.

Referenced by createSourceObjects(), deInitiate(), initiate(), and setDestinations().

Groupsock* MediaSubsession::fRTCPSocket [protected]

Definition at line 340 of file MediaSession.hh.

Referenced by deInitiate(), initiate(), and setDestinations().

RTPSource* MediaSubsession::fRTPSource [protected]

Definition at line 341 of file MediaSession.hh.

Referenced by createSourceObjects(), deInitiate(), initiate(), and rtpSource().

RTCPInstance* MediaSubsession::fRTCPInstance [protected]

Definition at line 341 of file MediaSession.hh.

Referenced by deInitiate(), initiate(), and rtcpInstance().

FramedSource* MediaSubsession::fReadSource [protected]

Definition at line 342 of file MediaSession.hh.

Referenced by addFilter(), createSourceObjects(), deInitiate(), initiate(), readSource(), and setClientPortNum().

Boolean MediaSubsession::fReceiveRawMP3ADUs [protected]

Definition at line 343 of file MediaSession.hh.

Referenced by createSourceObjects(), and receiveRawMP3ADUs().

Boolean MediaSubsession::fReceiveRawJPEGFrames [protected]

Definition at line 343 of file MediaSession.hh.

Referenced by createSourceObjects(), and receiveRawJPEGFrames().

char* MediaSubsession::fSessionId [protected]

Definition at line 346 of file MediaSession.hh.

Referenced by sessionId(), setSessionId(), and ~MediaSubsession().


The documentation for this class was generated from the following files:
Generated on Mon Apr 29 13:31:46 2013 for live by  doxygen 1.5.2