MultiFramedRTPSink Class Reference

#include <MultiFramedRTPSink.hh>

Inheritance diagram for MultiFramedRTPSink:

Inheritance graph
[legend]
Collaboration diagram for MultiFramedRTPSink:

Collaboration graph
[legend]

Public Types

typedef void( afterPlayingFunc )(void *clientData)

Public Member Functions

void setPacketSizes (unsigned preferredPacketSize, unsigned maxPacketSize)
u_int32_t SSRC () const
u_int32_t convertToRTPTimestamp (struct timeval tv)
unsigned packetCount () const
unsigned octetCount () const
Groupsock const & groupsockBeingUsed () const
GroupsockgroupsockBeingUsed ()
unsigned char rtpPayloadType () const
unsigned rtpTimestampFrequency () const
void setRTPTimestampFrequency (unsigned freq)
char const * rtpPayloadFormatName () const
unsigned numChannels () const
virtual char const * sdpMediaType () const
virtual char * rtpmapLine () const
virtual char const * auxSDPLine ()
u_int16_t currentSeqNo () const
u_int32_t presetNextTimestamp ()
RTPTransmissionStatsDBtransmissionStatsDB () const
Boolean nextTimestampHasBeenPreset () const
void setStreamSocket (int sockNum, unsigned char streamChannelId)
void addStreamSocket (int sockNum, unsigned char streamChannelId)
void removeStreamSocket (int sockNum, unsigned char streamChannelId)
void getTotalBitrate (unsigned &outNumBytes, double &outElapsedTime)
Boolean startPlaying (MediaSource &source, afterPlayingFunc *afterFunc, void *afterClientData)
FramedSourcesource () const
UsageEnvironmentenvir () const
char const * name () const
virtual Boolean isSource () const
virtual Boolean isRTCPInstance () const
virtual Boolean isRTSPClient () const
virtual Boolean isRTSPServer () const
virtual Boolean isMediaSession () const
virtual Boolean isServerMediaSession () const
virtual Boolean isDarwinInjector () const

Static Public Member Functions

static Boolean lookupByName (UsageEnvironment &env, char const *sinkName, RTPSink *&resultSink)
static Boolean lookupByName (UsageEnvironment &env, char const *sinkName, MediaSink *&resultSink)
static Boolean lookupByName (UsageEnvironment &env, char const *mediumName, Medium *&resultMedium)
static void close (UsageEnvironment &env, char const *mediumName)
static void close (Medium *medium)

Protected Member Functions

 MultiFramedRTPSink (UsageEnvironment &env, Groupsock *rtpgs, unsigned char rtpPayloadType, unsigned rtpTimestampFrequency, char const *rtpPayloadFormatName, unsigned numChannels=1)
virtual ~MultiFramedRTPSink ()
virtual void doSpecialFrameHandling (unsigned fragmentationOffset, unsigned char *frameStart, unsigned numBytesInFrame, struct timeval frameTimestamp, unsigned numRemainingBytes)
virtual Boolean allowFragmentationAfterStart () const
virtual Boolean allowOtherFramesAfterLastFragment () const
virtual Boolean frameCanAppearAfterPacketStart (unsigned char const *frameStart, unsigned numBytesInFrame) const
virtual unsigned specialHeaderSize () const
virtual unsigned frameSpecificHeaderSize () const
Boolean isFirstPacket () const
Boolean isFirstFrameInPacket () const
Boolean curFragmentationOffset () const
void setMarkerBit ()
void setTimestamp (struct timeval timestamp)
void setSpecialHeaderWord (unsigned word, unsigned wordPosition=0)
void setSpecialHeaderBytes (unsigned char const *bytes, unsigned numBytes, unsigned bytePosition=0)
void setFrameSpecificHeaderWord (unsigned word, unsigned wordPosition=0)
void setFrameSpecificHeaderBytes (unsigned char const *bytes, unsigned numBytes, unsigned bytePosition=0)
void setFramePadding (unsigned numPaddingBytes)
unsigned numFramesUsedSoFar () const
unsigned ourMaxPacketSize () const
virtual Boolean continuePlaying ()
virtual void stopPlaying ()
virtual Boolean sourceIsCompatibleWithUs (MediaSource &source)
TaskTokennextTask ()

Static Protected Member Functions

static void onSourceClosure (void *clientData)

Protected Attributes

RTPInterface fRTPInterface
unsigned char fRTPPayloadType
unsigned fPacketCount
unsigned fOctetCount
unsigned fTotalOctetCount
timeval fTotalOctetCountStartTime
u_int32_t fCurrentTimestamp
u_int16_t fSeqNo
FramedSourcefSource

Private Member Functions

void buildAndSendPacket (Boolean isFirstPacket)
void packFrame ()
void sendPacketIfNecessary ()
void afterGettingFrame1 (unsigned numBytesRead, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds)
Boolean isTooBigForAPacket (unsigned numBytes) const

Static Private Member Functions

static void sendNext (void *firstArg)
static void afterGettingFrame (void *clientData, unsigned numBytesRead, unsigned numTruncatedBytes, struct timeval presentationTime, unsigned durationInMicroseconds)
static void ourHandleClosure (void *clientData)

Private Attributes

OutPacketBufferfOutBuf
Boolean fNoFramesLeft
unsigned fNumFramesUsedSoFar
unsigned fCurFragmentationOffset
Boolean fPreviousFrameEndedFragmentation
Boolean fIsFirstPacket
timeval fNextSendTime
unsigned fTimestampPosition
unsigned fSpecialHeaderPosition
unsigned fSpecialHeaderSize
unsigned fCurFrameSpecificHeaderPosition
unsigned fCurFrameSpecificHeaderSize
unsigned fTotalFrameSpecificHeaderSizes
unsigned fOurMaxPacketSize

Friends

void sendNext (void *)

Detailed Description

Definition at line 29 of file MultiFramedRTPSink.hh.


Member Typedef Documentation

typedef void( MediaSink::afterPlayingFunc)(void *clientData) [inherited]

Definition at line 33 of file MediaSink.hh.


Constructor & Destructor Documentation

MultiFramedRTPSink::MultiFramedRTPSink ( UsageEnvironment env,
Groupsock rtpgs,
unsigned char  rtpPayloadType,
unsigned  rtpTimestampFrequency,
char const *  rtpPayloadFormatName,
unsigned  numChannels = 1 
) [protected]

Definition at line 37 of file MultiFramedRTPSink.cpp.

References setPacketSizes().

00043   : RTPSink(env, rtpGS, rtpPayloadType, rtpTimestampFrequency,
00044             rtpPayloadFormatName, numChannels),
00045   fOutBuf(NULL), fCurFragmentationOffset(0), fPreviousFrameEndedFragmentation(False) {
00046   setPacketSizes(1000, 1448);
00047       // Default max packet size (1500, minus allowance for IP, UDP, UMTP headers)
00048       // (Also, make it a multiple of 4 bytes, just in case that matters.)
00049 }

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

Definition at line 51 of file MultiFramedRTPSink.cpp.

References fOutBuf.

00051                                         {
00052   delete fOutBuf;
00053 }


Member Function Documentation

void MultiFramedRTPSink::setPacketSizes ( unsigned  preferredPacketSize,
unsigned  maxPacketSize 
)

Definition at line 27 of file MultiFramedRTPSink.cpp.

References fOurMaxPacketSize, and fOutBuf.

Referenced by MultiFramedRTPSink().

00028                                                                 {
00029   if (preferredPacketSize > maxPacketSize || preferredPacketSize == 0) return;
00030       // sanity check
00031 
00032   delete fOutBuf;
00033   fOutBuf = new OutPacketBuffer(preferredPacketSize, maxPacketSize);
00034   fOurMaxPacketSize = maxPacketSize; // save value, in case subclasses need it 
00035 }

void MultiFramedRTPSink::doSpecialFrameHandling ( unsigned  fragmentationOffset,
unsigned char *  frameStart,
unsigned  numBytesInFrame,
struct timeval  frameTimestamp,
unsigned  numRemainingBytes 
) [protected, virtual]

Reimplemented in AC3AudioRTPSink, AMRAudioRTPSink, H263plusVideoRTPSink, H264VideoRTPSink, JPEGVideoRTPSink, MP3ADURTPSink, MPEG1or2AudioRTPSink, MPEG1or2VideoRTPSink, MPEG4ESVideoRTPSink, MPEG4GenericRTPSink, MPEG4LATMAudioRTPSink, and SimpleRTPSink.

Definition at line 56 of file MultiFramedRTPSink.cpp.

References isFirstFrameInPacket(), and setTimestamp().

Referenced by afterGettingFrame1(), SimpleRTPSink::doSpecialFrameHandling(), MPEG4LATMAudioRTPSink::doSpecialFrameHandling(), MPEG4GenericRTPSink::doSpecialFrameHandling(), MPEG1or2AudioRTPSink::doSpecialFrameHandling(), MP3ADURTPSink::doSpecialFrameHandling(), AMRAudioRTPSink::doSpecialFrameHandling(), and AC3AudioRTPSink::doSpecialFrameHandling().

00060                                                          {
00061   // default implementation: If this is the first frame in the packet,
00062   // use its timestamp for the RTP timestamp:
00063   if (isFirstFrameInPacket()) {
00064     setTimestamp(frameTimestamp);
00065   }
00066 }

Boolean MultiFramedRTPSink::allowFragmentationAfterStart (  )  const [protected, virtual]

Reimplemented in MPEG1or2VideoRTPSink, and MPEG4ESVideoRTPSink.

Definition at line 68 of file MultiFramedRTPSink.cpp.

References False.

Referenced by afterGettingFrame1().

00068                                                                {
00069   return False; // by default
00070 }

Boolean MultiFramedRTPSink::allowOtherFramesAfterLastFragment (  )  const [protected, virtual]

Definition at line 72 of file MultiFramedRTPSink.cpp.

References False.

Referenced by afterGettingFrame1().

00072                                                                     {
00073   return False; // by default
00074 }

Boolean MultiFramedRTPSink::frameCanAppearAfterPacketStart ( unsigned char const *  frameStart,
unsigned  numBytesInFrame 
) const [protected, virtual]

Reimplemented in AC3AudioRTPSink, AMRAudioRTPSink, GSMAudioRTPSink, H263plusVideoRTPSink, H264VideoRTPSink, JPEGVideoRTPSink, MPEG1or2VideoRTPSink, MPEG4ESVideoRTPSink, MPEG4GenericRTPSink, MPEG4LATMAudioRTPSink, and SimpleRTPSink.

Definition at line 77 of file MultiFramedRTPSink.cpp.

References True.

Referenced by afterGettingFrame1().

00078                                                                      {
00079   return True; // by default
00080 }

unsigned MultiFramedRTPSink::specialHeaderSize (  )  const [protected, virtual]

Reimplemented in AC3AudioRTPSink, AMRAudioRTPSink, H263plusVideoRTPSink, JPEGVideoRTPSink, MP3ADURTPSink, MPEG1or2AudioRTPSink, MPEG1or2VideoRTPSink, and MPEG4GenericRTPSink.

Definition at line 82 of file MultiFramedRTPSink.cpp.

Referenced by buildAndSendPacket(), and isTooBigForAPacket().

00082                                                      {
00083   // default implementation: Assume no special header:
00084   return 0;
00085 }

unsigned MultiFramedRTPSink::frameSpecificHeaderSize (  )  const [protected, virtual]

Definition at line 87 of file MultiFramedRTPSink.cpp.

Referenced by isTooBigForAPacket(), packFrame(), and sendPacketIfNecessary().

00087                                                            {
00088   // default implementation: Assume no frame-specific header:
00089   return 0;
00090 }

Boolean MultiFramedRTPSink::isFirstPacket (  )  const [inline, protected]

Definition at line 65 of file MultiFramedRTPSink.hh.

References fIsFirstPacket.

Referenced by MPEG1or2AudioRTPSink::doSpecialFrameHandling(), and AMRAudioRTPSink::doSpecialFrameHandling().

00065 { return fIsFirstPacket; }

Boolean MultiFramedRTPSink::isFirstFrameInPacket (  )  const [inline, protected]

Definition at line 66 of file MultiFramedRTPSink.hh.

References fNumFramesUsedSoFar.

Referenced by doSpecialFrameHandling(), MPEG1or2VideoRTPSink::doSpecialFrameHandling(), MPEG1or2AudioRTPSink::doSpecialFrameHandling(), and AMRAudioRTPSink::doSpecialFrameHandling().

00066 { return fNumFramesUsedSoFar == 0; }

Boolean MultiFramedRTPSink::curFragmentationOffset (  )  const [inline, protected]

Definition at line 67 of file MultiFramedRTPSink.hh.

References fCurFragmentationOffset.

Referenced by afterGettingFrame1(), MP3ADURTPSink::specialHeaderSize(), JPEGVideoRTPSink::specialHeaderSize(), and H263plusVideoRTPSink::specialHeaderSize().

00067 { return fCurFragmentationOffset; }

void MultiFramedRTPSink::setMarkerBit (  )  [protected]

Definition at line 92 of file MultiFramedRTPSink.cpp.

References OutPacketBuffer::extractWord(), fOutBuf, and OutPacketBuffer::insertWord().

Referenced by SimpleRTPSink::doSpecialFrameHandling(), MPEG4LATMAudioRTPSink::doSpecialFrameHandling(), MPEG4GenericRTPSink::doSpecialFrameHandling(), MPEG4ESVideoRTPSink::doSpecialFrameHandling(), MPEG1or2VideoRTPSink::doSpecialFrameHandling(), MPEG1or2AudioRTPSink::doSpecialFrameHandling(), JPEGVideoRTPSink::doSpecialFrameHandling(), H264VideoRTPSink::doSpecialFrameHandling(), H263plusVideoRTPSink::doSpecialFrameHandling(), AMRAudioRTPSink::doSpecialFrameHandling(), and AC3AudioRTPSink::doSpecialFrameHandling().

00092                                       {
00093   unsigned rtpHdr = fOutBuf->extractWord(0);
00094   rtpHdr |= 0x00800000;
00095   fOutBuf->insertWord(rtpHdr, 0);
00096 }

void MultiFramedRTPSink::setTimestamp ( struct timeval  timestamp  )  [protected]

Definition at line 98 of file MultiFramedRTPSink.cpp.

References RTPSink::convertToRTPTimestamp(), RTPSink::fCurrentTimestamp, fOutBuf, fTimestampPosition, and OutPacketBuffer::insertWord().

Referenced by doSpecialFrameHandling(), MPEG4ESVideoRTPSink::doSpecialFrameHandling(), MPEG1or2VideoRTPSink::doSpecialFrameHandling(), JPEGVideoRTPSink::doSpecialFrameHandling(), H264VideoRTPSink::doSpecialFrameHandling(), and H263plusVideoRTPSink::doSpecialFrameHandling().

00098                                                               {
00099   // First, convert the timestamp to a 32-bit RTP timestamp:
00100   fCurrentTimestamp = convertToRTPTimestamp(timestamp);
00101 
00102   // Then, insert it into the RTP packet:
00103   fOutBuf->insertWord(fCurrentTimestamp, fTimestampPosition);
00104 }

void MultiFramedRTPSink::setSpecialHeaderWord ( unsigned  word,
unsigned  wordPosition = 0 
) [protected]

Definition at line 106 of file MultiFramedRTPSink.cpp.

References fOutBuf, fSpecialHeaderPosition, and OutPacketBuffer::insertWord().

Referenced by MPEG1or2VideoRTPSink::doSpecialFrameHandling(), and MPEG1or2AudioRTPSink::doSpecialFrameHandling().

00107                                                                      {
00108   fOutBuf->insertWord(word, fSpecialHeaderPosition + 4*wordPosition);
00109 }

void MultiFramedRTPSink::setSpecialHeaderBytes ( unsigned char const *  bytes,
unsigned  numBytes,
unsigned  bytePosition = 0 
) [protected]

Definition at line 111 of file MultiFramedRTPSink.cpp.

References fOutBuf, fSpecialHeaderPosition, and OutPacketBuffer::insert().

Referenced by MPEG4GenericRTPSink::doSpecialFrameHandling(), MP3ADURTPSink::doSpecialFrameHandling(), JPEGVideoRTPSink::doSpecialFrameHandling(), H263plusVideoRTPSink::doSpecialFrameHandling(), AMRAudioRTPSink::doSpecialFrameHandling(), and AC3AudioRTPSink::doSpecialFrameHandling().

00113                                                                       {
00114   fOutBuf->insert(bytes, numBytes, fSpecialHeaderPosition + bytePosition);
00115 }

void MultiFramedRTPSink::setFrameSpecificHeaderWord ( unsigned  word,
unsigned  wordPosition = 0 
) [protected]

Definition at line 117 of file MultiFramedRTPSink.cpp.

References fCurFrameSpecificHeaderPosition, fOutBuf, and OutPacketBuffer::insertWord().

00118                                                                            {
00119   fOutBuf->insertWord(word, fCurFrameSpecificHeaderPosition + 4*wordPosition);
00120 }

void MultiFramedRTPSink::setFrameSpecificHeaderBytes ( unsigned char const *  bytes,
unsigned  numBytes,
unsigned  bytePosition = 0 
) [protected]

Definition at line 122 of file MultiFramedRTPSink.cpp.

References fCurFrameSpecificHeaderPosition, fOutBuf, and OutPacketBuffer::insert().

00124                                                                             {
00125   fOutBuf->insert(bytes, numBytes, fCurFrameSpecificHeaderPosition + bytePosition);
00126 }

void MultiFramedRTPSink::setFramePadding ( unsigned  numPaddingBytes  )  [protected]

Definition at line 128 of file MultiFramedRTPSink.cpp.

References OutPacketBuffer::enqueue(), OutPacketBuffer::extractWord(), fOutBuf, and OutPacketBuffer::insertWord().

00128                                                                  {
00129   if (numPaddingBytes > 0) {
00130     // Add the padding bytes (with the last one being the padding size):
00131     unsigned char paddingBuffer[255]; //max padding
00132     memset(paddingBuffer, 0, numPaddingBytes);
00133     paddingBuffer[numPaddingBytes-1] = numPaddingBytes;
00134     fOutBuf->enqueue(paddingBuffer, numPaddingBytes);
00135 
00136     // Set the RTP padding bit:
00137     unsigned rtpHdr = fOutBuf->extractWord(0);
00138     rtpHdr |= 0x20000000;
00139     fOutBuf->insertWord(rtpHdr, 0);
00140   }
00141 }

unsigned MultiFramedRTPSink::numFramesUsedSoFar (  )  const [inline, protected]

Definition at line 79 of file MultiFramedRTPSink.hh.

References fNumFramesUsedSoFar.

Referenced by AMRAudioRTPSink::doSpecialFrameHandling(), AC3AudioRTPSink::doSpecialFrameHandling(), and GSMAudioRTPSink::frameCanAppearAfterPacketStart().

00079 { return fNumFramesUsedSoFar; }

unsigned MultiFramedRTPSink::ourMaxPacketSize (  )  const [inline, protected]

Definition at line 81 of file MultiFramedRTPSink.hh.

References fOurMaxPacketSize.

Referenced by H264VideoRTPSink::continuePlaying().

00081 { return fOurMaxPacketSize; }

Boolean MultiFramedRTPSink::continuePlaying (  )  [protected, virtual]

Implements MediaSink.

Reimplemented in H264VideoRTPSink.

Definition at line 143 of file MultiFramedRTPSink.cpp.

References buildAndSendPacket(), and True.

Referenced by H264VideoRTPSink::continuePlaying().

00143                                             {
00144   // Send the first packet.
00145   // (This will also schedule any future sends.)
00146   buildAndSendPacket(True);
00147   return True;
00148 }

void MultiFramedRTPSink::stopPlaying (  )  [protected, virtual]

Reimplemented from MediaSink.

Reimplemented in H264VideoRTPSink.

Definition at line 150 of file MultiFramedRTPSink.cpp.

References fOutBuf, OutPacketBuffer::resetOffset(), OutPacketBuffer::resetOverflowData(), OutPacketBuffer::resetPacketStart(), and MediaSink::stopPlaying().

Referenced by H264VideoRTPSink::stopPlaying().

00150                                      {
00151   fOutBuf->resetPacketStart();
00152   fOutBuf->resetOffset();
00153   fOutBuf->resetOverflowData();
00154 
00155   // Then call the default "stopPlaying()" function:
00156   MediaSink::stopPlaying();
00157 }

void MultiFramedRTPSink::buildAndSendPacket ( Boolean  isFirstPacket  )  [private]

Definition at line 159 of file MultiFramedRTPSink.cpp.

References OutPacketBuffer::curPacketSize(), OutPacketBuffer::enqueueWord(), False, fIsFirstPacket, fNoFramesLeft, fNumFramesUsedSoFar, fOutBuf, RTPSink::fRTPPayloadType, RTPSink::fSeqNo, fSpecialHeaderPosition, fSpecialHeaderSize, fTimestampPosition, fTotalFrameSpecificHeaderSizes, packFrame(), OutPacketBuffer::skipBytes(), specialHeaderSize(), and RTPSink::SSRC().

Referenced by continuePlaying(), and sendNext().

00159                                                                  {
00160   fIsFirstPacket = isFirstPacket;
00161 
00162   // Set up the RTP header:
00163   unsigned rtpHdr = 0x80000000; // RTP version 2
00164   rtpHdr |= (fRTPPayloadType<<16);
00165   rtpHdr |= fSeqNo; // sequence number
00166   fOutBuf->enqueueWord(rtpHdr);
00167 
00168   // Note where the RTP timestamp will go.
00169   // (We can't fill this in until we start packing payload frames.)
00170   fTimestampPosition = fOutBuf->curPacketSize();
00171   fOutBuf->skipBytes(4); // leave a hole for the timestamp
00172 
00173   fOutBuf->enqueueWord(SSRC());
00174 
00175   // Allow for a special, payload-format-specific header following the
00176   // RTP header:
00177   fSpecialHeaderPosition = fOutBuf->curPacketSize();
00178   fSpecialHeaderSize = specialHeaderSize();
00179   fOutBuf->skipBytes(fSpecialHeaderSize);
00180 
00181   // Begin packing as many (complete) frames into the packet as we can:
00182   fTotalFrameSpecificHeaderSizes = 0;
00183   fNoFramesLeft = False;
00184   fNumFramesUsedSoFar = 0;
00185   packFrame();
00186 }

void MultiFramedRTPSink::packFrame (  )  [private]

Definition at line 188 of file MultiFramedRTPSink.cpp.

References afterGettingFrame(), afterGettingFrame1(), OutPacketBuffer::curPacketSize(), OutPacketBuffer::curPtr(), fCurFrameSpecificHeaderPosition, fCurFrameSpecificHeaderSize, fOutBuf, frameSize, frameSpecificHeaderSize(), MediaSink::fSource, fTotalFrameSpecificHeaderSizes, FramedSource::getNextFrame(), OutPacketBuffer::haveOverflowData(), NULL, ourHandleClosure(), OutPacketBuffer::overflowDataSize(), OutPacketBuffer::overflowDurationInMicroseconds(), OutPacketBuffer::overflowPresentationTime(), OutPacketBuffer::skipBytes(), OutPacketBuffer::totalBytesAvailable(), and OutPacketBuffer::useOverflowData().

Referenced by afterGettingFrame1(), and buildAndSendPacket().

00188                                    {
00189   // Get the next frame.
00190 
00191   // First, see if we have an overflow frame that was too big for the last pkt
00192   if (fOutBuf->haveOverflowData()) {
00193     // Use this frame before reading a new one from the source
00194     unsigned frameSize = fOutBuf->overflowDataSize();
00195     struct timeval presentationTime = fOutBuf->overflowPresentationTime();
00196     unsigned durationInMicroseconds = fOutBuf->overflowDurationInMicroseconds();
00197     fOutBuf->useOverflowData();
00198 
00199     afterGettingFrame1(frameSize, 0, presentationTime, durationInMicroseconds);
00200   } else {
00201     // Normal case: we need to read a new frame from the source
00202     if (fSource == NULL) return;
00203 
00204     fCurFrameSpecificHeaderPosition = fOutBuf->curPacketSize();
00205     fCurFrameSpecificHeaderSize = frameSpecificHeaderSize();
00206     fOutBuf->skipBytes(fCurFrameSpecificHeaderSize);
00207     fTotalFrameSpecificHeaderSizes += fCurFrameSpecificHeaderSize;
00208 
00209     fSource->getNextFrame(fOutBuf->curPtr(), fOutBuf->totalBytesAvailable(),
00210                           afterGettingFrame, this, ourHandleClosure, this);
00211   }
00212 }

void MultiFramedRTPSink::sendPacketIfNecessary (  )  [private]

Definition at line 348 of file MultiFramedRTPSink.cpp.

References OutPacketBuffer::adjustPacketStart(), OutPacketBuffer::curPacketSize(), Medium::envir(), fNextSendTime, fNoFramesLeft, fNumFramesUsedSoFar, RTPSink::fOctetCount, fOutBuf, RTPSink::fPacketCount, frameSpecificHeaderSize(), RTPSink::fRTPInterface, RTPSink::fSeqNo, fSpecialHeaderSize, fTotalFrameSpecificHeaderSizes, RTPSink::fTotalOctetCount, OutPacketBuffer::haveOverflowData(), Medium::nextTask(), NULL, MediaSink::onSourceClosure(), our_random(), OutPacketBuffer::packet(), OutPacketBuffer::resetOffset(), OutPacketBuffer::resetPacketStart(), rtpHeaderSize, TaskScheduler::scheduleDelayedTask(), sendNext(), RTPInterface::sendPacket(), UsageEnvironment::taskScheduler(), OutPacketBuffer::totalBufferSize(), and OutPacketBuffer::totalBytesAvailable().

Referenced by afterGettingFrame1(), and ourHandleClosure().

00348                                                {
00349   if (fNumFramesUsedSoFar > 0) {
00350     // Send the packet:
00351 #ifdef TEST_LOSS
00352     if ((our_random()%10) != 0) // simulate 10% packet loss #####
00353 #endif
00354     fRTPInterface.sendPacket(fOutBuf->packet(), fOutBuf->curPacketSize());
00355     ++fPacketCount;
00356     fTotalOctetCount += fOutBuf->curPacketSize();
00357     fOctetCount += fOutBuf->curPacketSize()
00358       - rtpHeaderSize - fSpecialHeaderSize - fTotalFrameSpecificHeaderSizes;
00359 
00360     ++fSeqNo; // for next time
00361   }
00362 
00363   if (fOutBuf->haveOverflowData()
00364       && fOutBuf->totalBytesAvailable() > fOutBuf->totalBufferSize()/2) {
00365     // Efficiency hack: Reset the packet start pointer to just in front of
00366     // the overflow data (allowing for the RTP header and special headers),
00367     // so that we probably don't have to "memmove()" the overflow data
00368     // into place when building the next packet:
00369     unsigned newPacketStart = fOutBuf->curPacketSize()
00370       - (rtpHeaderSize + fSpecialHeaderSize + frameSpecificHeaderSize());
00371     fOutBuf->adjustPacketStart(newPacketStart);
00372   } else {
00373     // Normal case: Reset the packet start pointer back to the start:
00374     fOutBuf->resetPacketStart();
00375   }
00376   fOutBuf->resetOffset();
00377   fNumFramesUsedSoFar = 0;
00378 
00379   if (fNoFramesLeft) {
00380     // We're done:
00381     onSourceClosure(this);
00382   } else {
00383     // We have more frames left to send.  Figure out when the next frame
00384     // is due to start playing, then make sure that we wait this long before
00385     // sending the next packet.
00386     struct timeval timeNow;
00387     gettimeofday(&timeNow, NULL);
00388     int uSecondsToGo;
00389     if (fNextSendTime.tv_sec < timeNow.tv_sec) {
00390       uSecondsToGo = 0; // prevents integer underflow if too far behind
00391     } else {
00392       uSecondsToGo = (fNextSendTime.tv_sec - timeNow.tv_sec)*1000000
00393         + (fNextSendTime.tv_usec - timeNow.tv_usec);
00394     }
00395 
00396     // Delay this amount of time:
00397     nextTask() = envir().taskScheduler().scheduleDelayedTask(uSecondsToGo,
00398                                                 (TaskFunc*)sendNext, this);
00399   }
00400 }

void MultiFramedRTPSink::sendNext ( void *  firstArg  )  [static, private]

Definition at line 403 of file MultiFramedRTPSink.cpp.

References buildAndSendPacket(), and False.

Referenced by sendPacketIfNecessary().

00403                                                 {
00404   MultiFramedRTPSink* sink = (MultiFramedRTPSink*)firstArg;
00405   sink->buildAndSendPacket(False);
00406 }

void MultiFramedRTPSink::afterGettingFrame ( void *  clientData,
unsigned  numBytesRead,
unsigned  numTruncatedBytes,
struct timeval  presentationTime,
unsigned  durationInMicroseconds 
) [static, private]

Definition at line 215 of file MultiFramedRTPSink.cpp.

References afterGettingFrame1().

Referenced by packFrame().

00218                                                      {
00219   MultiFramedRTPSink* sink = (MultiFramedRTPSink*)clientData;
00220   sink->afterGettingFrame1(numBytesRead, numTruncatedBytes,
00221                            presentationTime, durationInMicroseconds);
00222 }

void MultiFramedRTPSink::afterGettingFrame1 ( unsigned  numBytesRead,
unsigned  numTruncatedBytes,
struct timeval  presentationTime,
unsigned  durationInMicroseconds 
) [private]

Definition at line 225 of file MultiFramedRTPSink.cpp.

References allowFragmentationAfterStart(), allowOtherFramesAfterLastFragment(), curFragmentationOffset(), OutPacketBuffer::curPacketSize(), OutPacketBuffer::curPtr(), doSpecialFrameHandling(), Medium::envir(), False, fCurFragmentationOffset, fIsFirstPacket, fNextSendTime, fNumFramesUsedSoFar, fOutBuf, fPreviousFrameEndedFragmentation, frameCanAppearAfterPacketStart(), OutPacketBuffer::increment(), OutPacketBuffer::isPreferredSize(), isTooBigForAPacket(), OutPacketBuffer::maxSize, NULL, OutPacketBuffer::numOverflowBytes(), packFrame(), sendPacketIfNecessary(), OutPacketBuffer::setOverflowData(), OutPacketBuffer::totalBytesAvailable(), True, and OutPacketBuffer::wouldOverflow().

Referenced by afterGettingFrame(), and packFrame().

00227                                                       {
00228   if (fIsFirstPacket) {
00229     // Record the fact that we're starting to play now:
00230     gettimeofday(&fNextSendTime, NULL);
00231   }