liveMedia/include/RTPSource.hh

Go to the documentation of this file.
00001 /**********
00002 This library is free software; you can redistribute it and/or modify it under
00003 the terms of the GNU Lesser General Public License as published by the
00004 Free Software Foundation; either version 2.1 of the License, or (at your
00005 option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)
00006 
00007 This library is distributed in the hope that it will be useful, but WITHOUT
00008 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00009 FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
00010 more details.
00011 
00012 You should have received a copy of the GNU Lesser General Public License
00013 along with this library; if not, write to the Free Software Foundation, Inc.,
00014 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
00015 **********/
00016 // "liveMedia"
00017 // Copyright (c) 1996-2012 Live Networks, Inc.  All rights reserved.
00018 // RTP Sources
00019 // C++ header
00020 
00021 #ifndef _RTP_SOURCE_HH
00022 #define _RTP_SOURCE_HH
00023 
00024 #ifndef _FRAMED_SOURCE_HH
00025 #include "FramedSource.hh"
00026 #endif
00027 #ifndef _RTP_INTERFACE_HH
00028 #include "RTPInterface.hh"
00029 #endif
00030 
00031 class RTPReceptionStatsDB; // forward
00032 
00033 class RTPSource: public FramedSource {
00034 public:
00035   static Boolean lookupByName(UsageEnvironment& env, char const* sourceName,
00036                               RTPSource*& resultSource);
00037 
00038   Boolean curPacketMarkerBit() const { return fCurPacketMarkerBit; }
00039 
00040   unsigned char rtpPayloadFormat() const { return fRTPPayloadFormat; }
00041 
00042   virtual Boolean hasBeenSynchronizedUsingRTCP();
00043 
00044   Groupsock* RTPgs() const { return fRTPInterface.gs(); }
00045 
00046   virtual void setPacketReorderingThresholdTime(unsigned uSeconds) = 0;
00047 
00048   // used by RTCP:
00049   u_int32_t SSRC() const { return fSSRC; }
00050       // Note: This is *our* SSRC, not the SSRC in incoming RTP packets.
00051      // later need a means of changing the SSRC if there's a collision #####
00052 
00053   unsigned timestampFrequency() const {return fTimestampFrequency;}
00054 
00055   RTPReceptionStatsDB& receptionStatsDB() const {
00056     return *fReceptionStatsDB;
00057   }
00058 
00059   u_int32_t lastReceivedSSRC() const { return fLastReceivedSSRC; }
00060   // Note: This is the SSRC in the most recently received RTP packet; not *our* SSRC
00061 
00062   void setStreamSocket(int sockNum, unsigned char streamChannelId) {
00063     // hack to allow sending RTP over TCP (RFC 2236, section 10.12)
00064     fRTPInterface.setStreamSocket(sockNum, streamChannelId);
00065   }
00066   void setServerRequestAlternativeByteHandler(int socketNum, ServerRequestAlternativeByteHandler* handler, void* clientData) {
00067     fRTPInterface.setServerRequestAlternativeByteHandler(socketNum, handler, clientData);
00068   }
00069 
00070   void setAuxilliaryReadHandler(AuxHandlerFunc* handlerFunc,
00071                                 void* handlerClientData) {
00072     fRTPInterface.setAuxilliaryReadHandler(handlerFunc,
00073                                            handlerClientData);
00074   }
00075 
00076   // Note that RTP receivers will usually not need to call either of the following two functions, because
00077   // RTP sequence numbers and timestamps are usually not useful to receivers.
00078   // (Our implementation of RTP reception already does all needed handling of RTP sequence numbers and timestamps.)
00079   u_int16_t curPacketRTPSeqNum() const { return fCurPacketRTPSeqNum; }
00080   u_int32_t curPacketRTPTimestamp() const { return fCurPacketRTPTimestamp; }
00081 
00082 protected:
00083   RTPSource(UsageEnvironment& env, Groupsock* RTPgs,
00084             unsigned char rtpPayloadFormat, u_int32_t rtpTimestampFrequency);
00085       // abstract base class
00086   virtual ~RTPSource();
00087 
00088 protected:
00089   RTPInterface fRTPInterface;
00090   u_int16_t fCurPacketRTPSeqNum;
00091   u_int32_t fCurPacketRTPTimestamp;
00092   Boolean fCurPacketMarkerBit;
00093   Boolean fCurPacketHasBeenSynchronizedUsingRTCP;
00094   u_int32_t fLastReceivedSSRC;
00095 
00096 private:
00097   // redefined virtual functions:
00098   virtual Boolean isRTPSource() const;
00099   virtual void getAttributes() const;
00100 
00101 private:
00102   unsigned char fRTPPayloadFormat;
00103   unsigned fTimestampFrequency;
00104   u_int32_t fSSRC;
00105 
00106   RTPReceptionStatsDB* fReceptionStatsDB;
00107 };
00108 
00109 
00110 class RTPReceptionStats; // forward
00111 
00112 class RTPReceptionStatsDB {
00113 public:
00114   unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; }
00115   unsigned numActiveSourcesSinceLastReset() const {
00116     return fNumActiveSourcesSinceLastReset;
00117  }
00118 
00119   void reset();
00120       // resets periodic stats (called each time they're used to
00121       // generate a reception report)
00122 
00123   class Iterator {
00124   public:
00125     Iterator(RTPReceptionStatsDB& receptionStatsDB);
00126     virtual ~Iterator();
00127 
00128     RTPReceptionStats* next(Boolean includeInactiveSources = False);
00129         // NULL if none
00130 
00131   private:
00132     HashTable::Iterator* fIter;
00133   };
00134 
00135   // The following is called whenever a RTP packet is received:
00136   void noteIncomingPacket(u_int32_t SSRC, u_int16_t seqNum,
00137                           u_int32_t rtpTimestamp,
00138                           unsigned timestampFrequency,
00139                           Boolean useForJitterCalculation,
00140                           struct timeval& resultPresentationTime,
00141                           Boolean& resultHasBeenSyncedUsingRTCP,
00142                           unsigned packetSize /* payload only */);
00143 
00144   // The following is called whenever a RTCP SR packet is received:
00145   void noteIncomingSR(u_int32_t SSRC,
00146                       u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW,
00147                       u_int32_t rtpTimestamp);
00148 
00149   // The following is called when a RTCP BYE packet is received:
00150   void removeRecord(u_int32_t SSRC);
00151 
00152   RTPReceptionStats* lookup(u_int32_t SSRC) const;
00153 
00154 protected: // constructor and destructor, called only by RTPSource:
00155   friend class RTPSource;
00156   RTPReceptionStatsDB();
00157   virtual ~RTPReceptionStatsDB();
00158 
00159 protected:
00160   void add(u_int32_t SSRC, RTPReceptionStats* stats);
00161 
00162 protected:
00163   friend class Iterator;
00164   unsigned fNumActiveSourcesSinceLastReset;
00165 
00166 private:
00167   HashTable* fTable;
00168   unsigned fTotNumPacketsReceived; // for all SSRCs
00169 };
00170 
00171 class RTPReceptionStats {
00172 public:
00173   u_int32_t SSRC() const { return fSSRC; }
00174   unsigned numPacketsReceivedSinceLastReset() const {
00175     return fNumPacketsReceivedSinceLastReset;
00176   }
00177   unsigned totNumPacketsReceived() const { return fTotNumPacketsReceived; }
00178   double totNumKBytesReceived() const;
00179 
00180   unsigned totNumPacketsExpected() const {
00181     return (fHighestExtSeqNumReceived - fBaseExtSeqNumReceived) + 1;
00182   }
00183 
00184   unsigned baseExtSeqNumReceived() const { return fBaseExtSeqNumReceived; }
00185   unsigned lastResetExtSeqNumReceived() const {
00186     return fLastResetExtSeqNumReceived;
00187   }
00188   unsigned highestExtSeqNumReceived() const {
00189     return fHighestExtSeqNumReceived;
00190   }
00191 
00192   unsigned jitter() const;
00193 
00194   unsigned lastReceivedSR_NTPmsw() const { return fLastReceivedSR_NTPmsw; }
00195   unsigned lastReceivedSR_NTPlsw() const { return fLastReceivedSR_NTPlsw; }
00196   struct timeval const& lastReceivedSR_time() const {
00197     return fLastReceivedSR_time;
00198   }
00199 
00200   unsigned minInterPacketGapUS() const { return fMinInterPacketGapUS; }
00201   unsigned maxInterPacketGapUS() const { return fMaxInterPacketGapUS; }
00202   struct timeval const& totalInterPacketGaps() const {
00203     return fTotalInterPacketGaps;
00204   }
00205 
00206 protected:
00207   // called only by RTPReceptionStatsDB:
00208   friend class RTPReceptionStatsDB;
00209   RTPReceptionStats(u_int32_t SSRC, u_int16_t initialSeqNum);
00210   RTPReceptionStats(u_int32_t SSRC);
00211   virtual ~RTPReceptionStats();
00212 
00213 private:
00214   void noteIncomingPacket(u_int16_t seqNum, u_int32_t rtpTimestamp,
00215                           unsigned timestampFrequency,
00216                           Boolean useForJitterCalculation,
00217                           struct timeval& resultPresentationTime,
00218                           Boolean& resultHasBeenSyncedUsingRTCP,
00219                           unsigned packetSize /* payload only */);
00220   void noteIncomingSR(u_int32_t ntpTimestampMSW, u_int32_t ntpTimestampLSW,
00221                       u_int32_t rtpTimestamp);
00222   void init(u_int32_t SSRC);
00223   void initSeqNum(u_int16_t initialSeqNum);
00224   void reset();
00225       // resets periodic stats (called each time they're used to
00226       // generate a reception report)
00227 
00228 protected:
00229   u_int32_t fSSRC;
00230   unsigned fNumPacketsReceivedSinceLastReset;
00231   unsigned fTotNumPacketsReceived;
00232   u_int32_t fTotBytesReceived_hi, fTotBytesReceived_lo;
00233   Boolean fHaveSeenInitialSequenceNumber;
00234   unsigned fBaseExtSeqNumReceived;
00235   unsigned fLastResetExtSeqNumReceived;
00236   unsigned fHighestExtSeqNumReceived;
00237   int fLastTransit; // used in the jitter calculation
00238   u_int32_t fPreviousPacketRTPTimestamp;
00239   double fJitter;
00240   // The following are recorded whenever we receive a RTCP SR for this SSRC:
00241   unsigned fLastReceivedSR_NTPmsw; // NTP timestamp (from SR), most-signif
00242   unsigned fLastReceivedSR_NTPlsw; // NTP timestamp (from SR), least-signif
00243   struct timeval fLastReceivedSR_time;
00244   struct timeval fLastPacketReceptionTime;
00245   unsigned fMinInterPacketGapUS, fMaxInterPacketGapUS;
00246   struct timeval fTotalInterPacketGaps;
00247 
00248 private:
00249   // Used to convert from RTP timestamp to 'wall clock' time:
00250   Boolean fHasBeenSynchronized;
00251   u_int32_t fSyncTimestamp;
00252   struct timeval fSyncTime;
00253 };
00254 
00255 
00256 Boolean seqNumLT(u_int16_t s1, u_int16_t s2);
00257   // a 'less-than' on 16-bit sequence numbers
00258 
00259 #endif

Generated on Thu Feb 2 23:51:30 2012 for live by  doxygen 1.5.2