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


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 |
| Groupsock & | groupsockBeingUsed () |
| 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 () |
| RTPTransmissionStatsDB & | transmissionStatsDB () 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) |
| FramedSource * | source () const |
| UsageEnvironment & | envir () 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) |
| TaskToken & | nextTask () |
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 |
| FramedSource * | fSource |
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 | |
| OutPacketBuffer * | fOutBuf |
| 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 *) |
Definition at line 29 of file MultiFramedRTPSink.hh.
typedef void( MediaSink::afterPlayingFunc)(void *clientData) [inherited] |
Definition at line 33 of file MediaSink.hh.
| 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 }
| 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().
| unsigned MultiFramedRTPSink::frameSpecificHeaderSize | ( | ) | const [protected, virtual] |
Definition at line 87 of file MultiFramedRTPSink.cpp.
Referenced by isTooBigForAPacket(), packFrame(), and sendPacketIfNecessary().
| 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 }