StreamState Class Reference

#include <OnDemandServerMediaSubsession.hh>

Collaboration diagram for StreamState:

Collaboration graph
[legend]

Public Member Functions

 StreamState (OnDemandServerMediaSubsession &master, Port const &serverRTPPort, Port const &serverRTCPPort, RTPSink *rtpSink, BasicUDPSink *udpSink, unsigned totalBW, FramedSource *mediaSource, Groupsock *rtpGS, Groupsock *rtcpGS)
virtual ~StreamState ()
void startPlaying (Destinations *destinations, TaskFunc *rtcpRRHandler, void *rtcpRRHandlerClientData, ServerRequestAlternativeByteHandler *serverRequestAlternativeByteHandler, void *serverRequestAlternativeByteHandlerClientData)
void pause ()
void endPlaying (Destinations *destinations)
void reclaim ()
unsigned & referenceCount ()
Port const & serverRTPPort () const
Port const & serverRTCPPort () const
RTPSinkrtpSink () const
float streamDuration () const
FramedSourcemediaSource () const
float & startNPT ()

Private Attributes

OnDemandServerMediaSubsessionfMaster
Boolean fAreCurrentlyPlaying
unsigned fReferenceCount
Port fServerRTPPort
Port fServerRTCPPort
RTPSinkfRTPSink
BasicUDPSinkfUDPSink
float fStreamDuration
unsigned fTotalBW
RTCPInstancefRTCPInstance
FramedSourcefMediaSource
float fStartNPT
GroupsockfRTPgs
GroupsockfRTCPgs

Detailed Description

Definition at line 141 of file OnDemandServerMediaSubsession.hh.


Constructor & Destructor Documentation

StreamState::StreamState ( OnDemandServerMediaSubsession master,
Port const &  serverRTPPort,
Port const &  serverRTCPPort,
RTPSink rtpSink,
BasicUDPSink udpSink,
unsigned  totalBW,
FramedSource mediaSource,
Groupsock rtpGS,
Groupsock rtcpGS 
)

Definition at line 409 of file OnDemandServerMediaSubsession.cpp.

00414   : fMaster(master), fAreCurrentlyPlaying(False), fReferenceCount(1),
00415     fServerRTPPort(serverRTPPort), fServerRTCPPort(serverRTCPPort),
00416     fRTPSink(rtpSink), fUDPSink(udpSink), fStreamDuration(master.duration()),
00417     fTotalBW(totalBW), fRTCPInstance(NULL) /* created later */,
00418     fMediaSource(mediaSource), fStartNPT(0.0), fRTPgs(rtpGS), fRTCPgs(rtcpGS) {
00419 }

StreamState::~StreamState (  )  [virtual]

Definition at line 421 of file OnDemandServerMediaSubsession.cpp.

References reclaim().

00421                           {
00422   reclaim();
00423 }


Member Function Documentation

void StreamState::startPlaying ( Destinations destinations,
TaskFunc rtcpRRHandler,
void *  rtcpRRHandlerClientData,
ServerRequestAlternativeByteHandler serverRequestAlternativeByteHandler,
void *  serverRequestAlternativeByteHandlerClientData 
)

Definition at line 426 of file OnDemandServerMediaSubsession.cpp.

References Groupsock::addDestination(), Destinations::addr, RTCPInstance::addStreamSocket(), RTPSink::addStreamSocket(), afterPlayingStreamState(), RTCPInstance::createNew(), Medium::envir(), fAreCurrentlyPlaying, OnDemandServerMediaSubsession::fCNAME, fMaster, fMediaSource, fRTCPgs, fRTCPInstance, fRTPgs, fRTPSink, fTotalBW, fUDPSink, Destinations::isTCP, NULL, Destinations::rtcpChannelId, Destinations::rtcpPort, Destinations::rtpChannelId, Destinations::rtpPort, RTCPInstance::sendReport(), RTPSink::setServerRequestAlternativeByteHandler(), RTCPInstance::setSpecificRRHandler(), MediaSink::startPlaying(), Destinations::tcpSocketNum, and True.

Referenced by OnDemandServerMediaSubsession::startStream().

00429                                                                     {
00430   if (dests == NULL) return;
00431 
00432   if (fRTCPInstance == NULL && fRTPSink != NULL) {
00433     // Create (and start) a 'RTCP instance' for this RTP sink:
00434     fRTCPInstance
00435       = RTCPInstance::createNew(fRTPSink->envir(), fRTCPgs,
00436                                 fTotalBW, (unsigned char*)fMaster.fCNAME,
00437                                 fRTPSink, NULL /* we're a server */);
00438         // Note: This starts RTCP running automatically
00439   }
00440 
00441   if (dests->isTCP) {
00442     // Change RTP and RTCP to use the TCP socket instead of UDP:
00443     if (fRTPSink != NULL) {
00444       fRTPSink->addStreamSocket(dests->tcpSocketNum, dests->rtpChannelId);
00445       fRTPSink->setServerRequestAlternativeByteHandler(dests->tcpSocketNum, serverRequestAlternativeByteHandler, serverRequestAlternativeByteHandlerClientData);
00446     }
00447     if (fRTCPInstance != NULL) {
00448       fRTCPInstance->addStreamSocket(dests->tcpSocketNum, dests->rtcpChannelId);
00449       fRTCPInstance->setSpecificRRHandler(dests->tcpSocketNum, dests->rtcpChannelId,
00450                                           rtcpRRHandler, rtcpRRHandlerClientData);
00451     }
00452   } else {
00453     // Tell the RTP and RTCP 'groupsocks' about this destination
00454     // (in case they don't already have it):
00455     if (fRTPgs != NULL) fRTPgs->addDestination(dests->addr, dests->rtpPort);
00456     if (fRTCPgs != NULL) fRTCPgs->addDestination(dests->addr, dests->rtcpPort);
00457     if (fRTCPInstance != NULL) {
00458       fRTCPInstance->setSpecificRRHandler(dests->addr.s_addr, dests->rtcpPort,
00459                                           rtcpRRHandler, rtcpRRHandlerClientData);
00460     }
00461   }
00462 
00463   if (fRTCPInstance != NULL) {
00464     // Hack: Send an initial RTCP "SR" packet, before the initial RTP packet, so that receivers will (likely) be able to
00465     // get RTCP-synchronized presentation times immediately:
00466     fRTCPInstance->sendReport();
00467   }
00468 
00469   if (!fAreCurrentlyPlaying && fMediaSource != NULL) {
00470     if (fRTPSink != NULL) {
00471       fRTPSink->startPlaying(*fMediaSource, afterPlayingStreamState, this);
00472       fAreCurrentlyPlaying = True;
00473     } else if (fUDPSink != NULL) {
00474       fUDPSink->startPlaying(*fMediaSource, afterPlayingStreamState, this);
00475       fAreCurrentlyPlaying = True;
00476     }
00477   }
00478 }

void StreamState::pause (  ) 

Definition at line 480 of file OnDemandServerMediaSubsession.cpp.

References False, fAreCurrentlyPlaying, fRTPSink, fUDPSink, NULL, and MediaSink::stopPlaying().

Referenced by OnDemandServerMediaSubsession::pauseStream().

00480                         {
00481   if (fRTPSink != NULL) fRTPSink->stopPlaying();
00482   if (fUDPSink != NULL) fUDPSink->stopPlaying();
00483   fAreCurrentlyPlaying = False;
00484 }

void StreamState::endPlaying ( Destinations destinations  ) 

Definition at line 486 of file OnDemandServerMediaSubsession.cpp.

References Destinations::addr, fRTCPgs, fRTCPInstance, fRTPgs, fRTPSink, Destinations::isTCP, NULL, Groupsock::removeDestination(), RTCPInstance::removeStreamSocket(), RTPSink::removeStreamSocket(), Destinations::rtcpChannelId, Destinations::rtcpPort, Destinations::rtpChannelId, Destinations::rtpPort, RTCPInstance::sendBYE(), Destinations::tcpSocketNum, and RTCPInstance::unsetSpecificRRHandler().

Referenced by OnDemandServerMediaSubsession::deleteStream().

00486                                                 {
00487 #if 0
00488   // The following code is temporarily disabled, because it erroneously sends RTCP "BYE"s to all clients if multiple
00489   // clients are streaming from the samedata source (i.e., if "reuseFirstSource" is True).  It will be fixed for real later.
00490   if (fRTCPInstance != NULL) {
00491     // Hack: Explicitly send a RTCP "BYE" packet now, because the code below will prevent that from happening later,
00492     // when "fRTCPInstance" gets deleted:
00493     fRTCPInstance->sendBYE();
00494   }
00495 #endif
00496 
00497   if (dests->isTCP) {
00498     if (fRTPSink != NULL) {
00499       fRTPSink->removeStreamSocket(dests->tcpSocketNum, dests->rtpChannelId);
00500     }
00501     if (fRTCPInstance != NULL) {
00502       fRTCPInstance->removeStreamSocket(dests->tcpSocketNum, dests->rtcpChannelId);
00503       fRTCPInstance->unsetSpecificRRHandler(dests->tcpSocketNum, dests->rtcpChannelId);
00504     }
00505   } else {
00506     // Tell the RTP and RTCP 'groupsocks' to stop using these destinations:
00507     if (fRTPgs != NULL) fRTPgs->removeDestination(dests->addr, dests->rtpPort);
00508     if (fRTCPgs != NULL) fRTCPgs->removeDestination(dests->addr, dests->rtcpPort);
00509     if (fRTCPInstance != NULL) {
00510       fRTCPInstance->unsetSpecificRRHandler(dests->addr.s_addr, dests->rtcpPort);
00511     }
00512   }
00513 }

void StreamState::reclaim (  ) 

Definition at line 515 of file OnDemandServerMediaSubsession.cpp.

References Medium::close(), OnDemandServerMediaSubsession::closeStreamSource(), OnDemandServerMediaSubsession::fLastStreamToken, fMaster, fMediaSource, fRTCPgs, fRTCPInstance, fRTPgs, fRTPSink, fUDPSink, and NULL.

Referenced by afterPlayingStreamState(), and ~StreamState().

00515                           {
00516   // Delete allocated media objects
00517   Medium::close(fRTCPInstance) /* will send a RTCP BYE */; fRTCPInstance = NULL;
00518   Medium::close(fRTPSink); fRTPSink = NULL;
00519   Medium::close(fUDPSink); fUDPSink = NULL;
00520 
00521   fMaster.closeStreamSource(fMediaSource); fMediaSource = NULL;
00522   if (fMaster.fLastStreamToken == this) fMaster.fLastStreamToken = NULL;
00523 
00524   delete fRTPgs; fRTPgs = NULL;
00525   delete fRTCPgs; fRTCPgs = NULL;
00526 }

unsigned& StreamState::referenceCount (  )  [inline]

Definition at line 158 of file OnDemandServerMediaSubsession.hh.

References fReferenceCount.

Referenced by OnDemandServerMediaSubsession::deleteStream().

00158 { return fReferenceCount; }

Port const& StreamState::serverRTPPort (  )  const [inline]

Definition at line 160 of file OnDemandServerMediaSubsession.hh.

References fServerRTPPort.

00160 { return fServerRTPPort; }

Port const& StreamState::serverRTCPPort (  )  const [inline]

Definition at line 161 of file OnDemandServerMediaSubsession.hh.

References fServerRTCPPort.

00161 { return fServerRTCPPort; }

RTPSink* StreamState::rtpSink (  )  const [inline]

Definition at line 163 of file OnDemandServerMediaSubsession.hh.

References fRTPSink.

Referenced by OnDemandServerMediaSubsession::getCurrentNPT(), OnDemandServerMediaSubsession::nullSeekStream(), OnDemandServerMediaSubsession::seekStream(), and OnDemandServerMediaSubsession::startStream().

00163 { return fRTPSink; }

float StreamState::streamDuration (  )  const [inline]

Definition at line 165 of file OnDemandServerMediaSubsession.hh.

References fStreamDuration.

Referenced by afterPlayingStreamState().

00165 { return fStreamDuration; }

FramedSource* StreamState::mediaSource (  )  const [inline]

Definition at line 167 of file OnDemandServerMediaSubsession.hh.

References fMediaSource.

Referenced by OnDemandServerMediaSubsession::getStreamSource(), OnDemandServerMediaSubsession::nullSeekStream(), OnDemandServerMediaSubsession::seekStream(), and OnDemandServerMediaSubsession::setStreamScale().

00167 { return fMediaSource; }

float& StreamState::startNPT (  )  [inline]

Definition at line 168 of file OnDemandServerMediaSubsession.hh.

References fStartNPT.

Referenced by OnDemandServerMediaSubsession::getCurrentNPT(), OnDemandServerMediaSubsession::nullSeekStream(), and OnDemandServerMediaSubsession::seekStream().

00168 { return fStartNPT; }


Field Documentation

OnDemandServerMediaSubsession& StreamState::fMaster [private]

Definition at line 171 of file OnDemandServerMediaSubsession.hh.

Referenced by reclaim(), and startPlaying().

Boolean StreamState::fAreCurrentlyPlaying [private]

Definition at line 172 of file OnDemandServerMediaSubsession.hh.

Referenced by pause(), and startPlaying().

unsigned StreamState::fReferenceCount [private]

Definition at line 173 of file OnDemandServerMediaSubsession.hh.

Referenced by referenceCount().

Port StreamState::fServerRTPPort [private]

Definition at line 175 of file OnDemandServerMediaSubsession.hh.

Referenced by serverRTPPort().

Port StreamState::fServerRTCPPort [private]

Definition at line 175 of file OnDemandServerMediaSubsession.hh.

Referenced by serverRTCPPort().

RTPSink* StreamState::fRTPSink [private]

Definition at line 177 of file OnDemandServerMediaSubsession.hh.

Referenced by endPlaying(), pause(), reclaim(), rtpSink(), and startPlaying().

BasicUDPSink* StreamState::fUDPSink [private]

Definition at line 178 of file OnDemandServerMediaSubsession.hh.

Referenced by pause(), reclaim(), and startPlaying().

float StreamState::fStreamDuration [private]

Definition at line 180 of file OnDemandServerMediaSubsession.hh.

Referenced by streamDuration().

unsigned StreamState::fTotalBW [private]

Definition at line 181 of file OnDemandServerMediaSubsession.hh.

Referenced by startPlaying().

RTCPInstance* StreamState::fRTCPInstance [private]

Definition at line 182 of file OnDemandServerMediaSubsession.hh.

Referenced by endPlaying(), reclaim(), and startPlaying().

FramedSource* StreamState::fMediaSource [private]

Definition at line 184 of file OnDemandServerMediaSubsession.hh.

Referenced by mediaSource(), reclaim(), and startPlaying().

float StreamState::fStartNPT [private]

Definition at line 185 of file OnDemandServerMediaSubsession.hh.

Referenced by startNPT().

Groupsock* StreamState::fRTPgs [private]

Definition at line 187 of file OnDemandServerMediaSubsession.hh.

Referenced by endPlaying(), reclaim(), and startPlaying().

Groupsock* StreamState::fRTCPgs [private]

Definition at line 188 of file OnDemandServerMediaSubsession.hh.

Referenced by endPlaying(), reclaim(), and startPlaying().


The documentation for this class was generated from the following files:
Generated on Tue Jun 18 13:21:36 2013 for live by  doxygen 1.5.2